Comment puis-je arrêter et redémarrer mon environnement AWS Elastic Beanstalk de test ou non critique à une heure planifiée ?

Lecture de 5 minute(s)
0

Je souhaite arrêter et reconstruire mon environnement AWS Elastic Beanstalk de test ou non critique à une heure planifiée.

Brève description

Vous pouvez arrêter et redémarrer votre environnement Elastic Beanstalk à l'aide des appels d'API terminate-environment et rebuild-environment. Vous ne pouvez recréer les environnements interrompus que dans les six semaines (42 jours) suivant leur interruption.

Pour effectuer ces appels selon un calendrier, configurez des événements dans Amazon CloudWatch Events afin de démarrer les fonctions AWS Lambda à une heure précise chaque jour. Configurez ensuite ces fonctions Lambda pour effectuer les appels d'API Elastic Beanstalk.

Important : les modifications hors bande que vous apportez à un environnement Elastic Beanstalk ou à ses instances ne sont pas conservées après l’interruption de l'environnement. Notez l'heure de l’interruption et terminez tout travail utilisant l'instance avant cette date. L'instance se termine à l'heure prévue, même si aucun utilisateur n'est connecté à cette instance.

Vous pouvez créer et configurer un modèle AWS CloudFormation pour effectuer toutes les actions décrites dans la résolution suivante. Le modèle doit créer un rôle Gestion des identités et des accès AWS (AWS IAM) pour Lambda. Le modèle doit ensuite démarrer la fonction Lambda, arrêter la fonction Lambda et enfin lancer l'événement CloudWatch.

Résolution

Prérequis

Notez l'ID de votre environnement Elastic Beanstalk (EnvironmentId).

Important : la résolution suivante peut supprimer toutes les étiquettes générées par les services de votre environnement Elastic Beanstalk et de vos ressources.

Créer un rôle IAM pour votre fonction Lambda

1.    Créez la politique en ligne suivante (par exemple, Lambda.json) pour un rôle IAM pour votre fonction Lambda :

$ cat Lambda.json {
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "Service": [
          "lambda.amazonaws.com"
        ]
      },
      "Action": [
        "sts:AssumeRole"
      ]
    }
  ]
}

2.    Utilisez la politique pour créer un rôle IAM :

aws iam create-role --role-name elasticbeanstalk-lambda-role --assume-role-policy-document file://Lambda.json

3.    Copiez l’Amazon Resource Name (ARN) du rôle IAM.

4.    Associez la politique gérée suivante au rôle IAM :

aws iam attach-role-policy --policy-arn arn:aws:iam::aws:policy/AdministratorAccess-AWSElasticBeanstalk --role-name elasticbeanstalk-lambda-role

Création d'un package de déploiement de la fonction Lambda

1.    Pour redémarrer l'environnement Elastic Beanstalk, collez le code suivant dans un éditeur de texte :

import boto3envid=['e-awsenvidid']
client = boto3.client('elasticbeanstalk')
def handler(event, context):
    try:
         for appid in range(len(envid)):
             response = client.rebuild_environment(EnvironmentId=str(envid[appid].strip()))
             if response:
                 print('Restore environment %s' %str(envid[appid]))
             else:
                 print('Failed to Restore environment %s' %str(envid[appid]))

    except Exception as e:
        print(e)

Important : remplacez e-awsenvidid par votre identifiant d'environnement pour Elastic Beanstalk. L'exemple de code précédent est compatible avec les exécutions de Python 3.9.

2.    Enregistrez le code sous forme de fichier Python. Par exemple : StartElasticBeanstalk.py

3.    Compressez le fichier Python sous forme de fichier ZIP. Par exemple : StartElasticBeanstalk.zip

4.    Pour terminer l'environnement Elastic Beanstalk, collez le code suivant dans un éditeur de texte :

import boto3envid=['e-awsenvidid']
client = boto3.client('elasticbeanstalk')
def handler(event, context):
    try:
         for appid in range(len(envid)):
             response = client.terminate_environment(EnvironmentId=str(envid[appid].strip()))
             if response:
                 print('Terminating environment %s' %str(envid[appid]))
             else:
                 print('Failed to Terminate environment %s' %str(envid[appid]))

    except Exception as e:
        print(e)

Important : remplacez e-awsenvidid par votre identifiant d'environnement pour Elastic Beanstalk.

5.    Enregistrez le code sous forme de fichier Python. Par exemple : StopElasticBeanstalk.py

6.    Compressez le fichier Python sous forme de fichier ZIP. Par exemple : StopElasticBeanstalk.zip

Créer votre fonction Lambda

Remarque : si des erreurs surviennent lorsque vous exécutez des commandes de l'interface de la ligne de commande AWS (AWS CLI), reportez-vous à Résolution des erreurs liées à l'AWS CLI. Vérifiez également que vous utilisez bien la version la plus récente de l'AWS CLI.

Pour créer des fonctions Lambda qui arrêtent et redémarrent votre environnement Elastic Beanstalk, exécutez les commandes suivantes dans l'AWS CLI :

aws lambda create-function \
--function-name StartElasticBeanstalk \
--zip-file fileb://file-path/StartElasticBeanstalk.zip \
--role arn:aws:iam::012345678912:role/elasticbeanstalk-lambda-role \
--handler StartElasticBeanstalk.handler \
--runtime python3.9 --region us-west-2

aws lambda create-function \
--function-name StopElasticBeanstalk \
--zip-file fileb://file-path/StopElasticBeanstalk.zip \
--role arn:aws:iam::012345678912:role/elasticbeanstalk-lambda-role \
--handler StopElasticBeanstalk.handler \
--runtime python3.9 --region us-west-2

Important : remplacez us-west-2 par la région AWS dans laquelle se trouve votre environnement Elastic Beanstalk. Fournissez également le package de déploiement (StartElasticBeanstalk.zip ou StopElasticBeanstalk.zip) et l'ARN du rôle IAM en tant que paramètres dans chaque commande.

Créer une règle CloudWatch Events pour lancer la fonction Lambda

1.    Pour démarrer et arrêter la fonction Lambda, exécutez les commandes suivantes :

aws events put-rule --name "StartLambdaFunction" --schedule-expression "cron(0 8 * * ? *)" --region us-west-2aws events put-rule --name "StopLambdaFunction" --schedule-expression "cron(0 18 * * ? *)" --region us-west-2

Remarque : la propriété --schedule-expression nécessite la syntaxe cron. Mettez à jour les valeurs de la propriété --schedule-expression selon, le cas échéant. Remplacez us-west-2 par la région AWS dans laquelle se trouve votre environnement Elastic Beanstalk.

2.    Pour faire confiance au principal du service CloudWatch Events (events.amazonaws.com) et étendre la portée des autorisations aux règles, exécutez les commandes suivantes :

aws lambda add-permission \
--function-name StartElasticBeanstalk \
--statement-id StartLambdaFunction \
--action 'lambda:InvokeFunction' \
--principal events.amazonaws.com \
--source-arn arn:aws:events:us-west-2:012345678912:rule/StartLambdaFunction --region us-west-2

aws lambda add-permission \
--function-name StopElasticBeanstalk \
--statement-id StopLambdaFunction \
--action 'lambda:InvokeFunction' \
--principal events.amazonaws.com \
--source-arn arn:aws:events:us-west-2:012345678912:rule/StopLambdaFunction --region us-west-2

Remarque : remplacez us-west-2 par la région AWS dans laquelle se trouve votre environnement Elastic Beanstalk.

3.    Pour ajouter la fonction Lambda que vous avez créée à cette règle afin que celle-ci s'exécute selon le calendrier, exécutez la commande put-targets suivante :

aws events put-targets --rule StartLambdaFunction --targets "Id"="1","Arn"="arn:aws:lambda:us-west-2:012345678912:function:StartElasticBeanstalk" --region us-west-2
aws events put-targets --rule StopLambdaFunction --targets "Id"="2","Arn"="arn:aws:lambda:us-west-2:012345678912:function:StopElasticBeanstalk" --region us-west-2

Important : remplacez l'ARN de chaque commande par l'ARN du rôle IAM. Remplacez us-west-2 par la région AWS dans laquelle se trouve votre environnement Elastic Beanstalk.

Informations connexes

Extraits du modèle Elastic Beanstalk

Packages de déploiement Lambda

AWS OFFICIEL
AWS OFFICIELA mis à jour il y a un an