Comment réduire et optimiser les coûts de votre infrastructure sous AWS ?

Les solutions cloud sont devenues incontournables pour les startups et entreprises qui cherchent à simplifier le déploiement et la gestion de leurs solutions.

Aujourd’hui, on peut déployer une application sur une EC2 pour 0,0042 USD ou exécuter un script sur une fonction lambda pour 0,0000166667 USD. Ces tarifications peuvent changer tout dépend de la région, mais ce sont ces prix très bas qui attirent les utilisateurs initialement vers les solutions cloud.

Mais pourquoi arrivons-nous à la fin du mois avec des factures qui dépassent les budgets définis ?


C’est bien ça l’illusion des prix des solutions Cloud. Sans une bonne gestion des ressources utilisées, ces centimes s’additionnent rapidement et vous allez vous retrouver avec des factures exponentielles.

Dans cet article, on vous propose des solutions, par type de service, à implémenter dans vos environnements AWS pour réduire vos coûts et mieux gérer votre infrastructure.

Computing

les services les plus chers sont souvent les services "compute". Dans AWS, on parle des instances EC2, Lambda, ECS, AWS Batch …

Pour réduire les coûts compute, vous pouvez considérer:

Choisir le type d’instance EC2 selon vos besoins.

AWS offre une large gamme des instances EC2 avec différentes configurations. Du coup, il est important de bien choisir le type d’instance qui correspond à vos besoins afin d’éviter les charges inutiles.

Un service AWS qui peut vous aider à scaler vos instances selon votre consommation est AWS compute optimizer ou l’Optimiseur de calcul AWS..

Ce service vous permet d'éviter le sur-provisionnement ou le sous-provisionnement des types d'instances Amazon Elastic Compute Cloud (EC2), les volumes Amazon Elastic Block Store (EBS), les fonctions Lambda et Fargate en se basant sur des données d'utilisation.

Choisir le modèle de tarification des instances selon vos besoin.

En utilisant les instances EC2 reservées vous pouvez bénéficier des réductions jusqu’à 72% par rapport à la tarification à la demande.

Vous pouvez aussi choisir des instances Spot à des prix jusqu'à 90 % inférieurs à ceux des instances à la demande.

Arrêter les instances EC2 le soir pour les environnements non prod.

Vous pouvez arrêter vos EC2 en dehors des heures de travail. en mettant, par exemple, en place une fonction lambda qui arrête toutes les EC2 ayant un tag spécifique. Ci-dessous un exemple d’un code python:

import boto3
regions = ['eu-west-1', 'eu-west-2', 'eu-west-3']
def lambda_handler(event, context):
  filters = [{ 'Name': 'instance-state-name', 'Values': ['running']},
             { 'Name':'tag:SCHEDULE_STOP', 'Values':['true']}]
  for region in regions:
    ec2 = boto3.client('ec2', region_name=region)
    ec2_instances = ec2.describe_instances(Filters=filters)

    for ec2_instance in ec2_instances['Reservations']:
      ec2.stop_instances(InstanceIds=ec2_instance['Instances'][0]['InstanceId'].split())
      print('Stopping instance : ' , ec2_instance['Instances'][0]['InstanceId']) 
Définir des groupes d'autoscaling

Vous pouvez mettre en place des ASG pour les EC2 ou les worker groups EKS et arrêter toutes les instances du groupe le soir. les ASG vous permettent aussi de mettre à l’échelle le nombre d'instances du groupe d’une manière dynamique en se basant sur le taux d’utilisation des ressources.

Networking

Si vous décidez d’utiliser un NAT Gateway dans votre infrastructure, vous serez facturé 0,045 USD par heure de disponibilité ainsi que par gigaoctet de données transférées. Pour réduire les coûts du NAT Gateway, vous pouvez considérer:

Utiliser des VPC Endpoint

L’une des solutions les plus simple pour réduire le prix d’un NAT Gateway est l’utilisation des VPC endpoint pour les services AWS comme S3, Dynamo DB, ECR … De cette manière, vous pourrez accéder à vos données sans passer par le NAT Gateway

Remplacer le NAT Gateway par une NAT Instance

Dans ce cas, le NAT Gateway est créée sur une EC2. Donc cela vous coûtera moins cher que le service NAT Gateway et vous pouvez arrêter l’instance EC2 en dehors des heures de travail.

Supprimer le NAT Gateway le soir sur les environnements hors-prod

AWS n’offre pas la possibilité “d’arrêter” le NAT Gateway. Mais, une solution sera de supprimer détruire la ressource le soir ou en dehors des heures de travail et la recréer de nouveau en utilisant cloudformation, le service d’approvisionnement de ressource d’AWS.

Storage

Utiliser le s3 intelligent tiering

Le S3 intellignet tiering surveille le niveau d’accès aux buckets s3 et déplace automatiquement vos données vers le niveau d'accès le plus économique.

Arrêter les instances RDS le soir dans les environnement non prod

Pareil aux instances EC2, vous pouvez arrêter vos instances RDS en dehors des heures de travail. Ci-dessous un exemple de script python qui arrête les instances ayant un tag spécifique:

import boto3
regions = ['eu-west-1', 'eu-west-3']

def get_db_tags(db, rds):
  rds_instance_arn = db['DBInstanceArn']
  rds_instance_tags = rds.list_tags_for_resource(ResourceName=rds_instance_arn)
  return rds_instance_tags['TagList']

def lambda_handler(event, context):
  for region in regions:
    rds = boto3.client('rds', region_name=region)
    rds_instances = rds.describe_db_instances().get('DBInstances', [])
    for rds_instance in rds_instances:
      # get instance state
      instance_state = rds_instance['DBInstanceStatus']

      # get instance tag
      rds_instance_tags = get_db_tags(rds_instance, rds)
      rds_instance_tag = next(iter(filter(lambda tag: tag['Key'] == 'SCHEDULE_STOP' and tag['Value'] == 'true' or tag['Value'] == 'True' or tag['Value'] == 'TRUE', rds_instance_tags)), None)

      if instance_state == 'available' and rds_instance_tag:
        rds.stop_db_instance(DBInstanceIdentifier = rds_instance['DBInstanceIdentifier'])
        print("RDS instance is stopping")
Billing

AWS offre des solutions pour mieux analyser vos coûts sur le cloud.

AWS Billing Console

Un dashboard qui vous permet d’apercevoir vos dépenses AWS et estimer votre facture à la fin de chaque mois.

AWS Cost Explorer

Permet d’analyser de en plus en détail vos dépenses par services, type d’usage, région, ...

AWS Budgets

Permet de définir des limites de dépenses. Vous serez notifier par une série des alertes quand vos dépenses s’approchent de ou dépassent les limites définies.

AWS a introduit une nouvelle fonctionnalité "AWS Budget Actions" pour pouvoir arrêter les ressources lorsque vous dépassez le seuil de dépense.

Team responsability

Organiser des points finops au sein de votre équipe pour examiner les dépenses AWS et proposer des nouvelles solutions spécifiques à vos utilisations peuvent vous aider à optimisier vos coûts.