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

Dernière mise à jour : 28/09/2020

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

Brève description

Vous pouvez arrêter et redémarrer votre environnement Elastic Beanstalk avec les appels d'API terminate-environment et rebuild-environment. Vous ne pouvez reconstruire les environnements arrêtés que dans les six semaines (42 jours) suivant leur arrêt.

Pour effectuer ces appels en fonction d'une planification, configurez des événements dans Amazon CloudWatch Events afin de déclencher des fonctions AWS Lambda chaque jour à une heure donnée. Ensuite, configurez ces fonctions Lambda pour effectuer les appels d'API Elastic Beanstalk.

Important : les modifications hors bande que vos apportez à un environnement Elastic Beanstalk ou à ses instances ne sont pas conservées si l'environnement est arrêté. Prenez ce facteur en compte lorsque vous modifiez votre environnement. Veillez à noter l'heure d'arrêt et exécuter les travaux qui utilisent cette instance avant cette heure. L'instance se termine à l'heure planifiée, même si un utilisateur n'y est pas connecté.

Solution

Avant de commencer, notez l'ID de votre environnement Elastic Beanstalk (EnvironmentId).

Important : la résolution suivante peut supprimer toutes les balises générées par le service de votre environnement et des ressources Elastic Beanstalk.

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

1.    Créez la stratégie en ligne suivante (par exemple, Lambda.json) pour un rôle AWS Identity and Access Management (IAM) pour votre fonction Lambda. Par exemple :

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

2.    Créez le rôle IAM à l'aide de la stratégie que vous avez créée à l'étape 1. Par exemple :

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

3.    Notez le rôle IAM Amazon Resource Name (ARN).

4.    Joignez la stratégie gérée suivante au rôle IAM :

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

Créer un package de déploiement de fonction Lambda

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

import boto3
envid=['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 l'ID de votre environnement Elastic Beanstalk.

Remarque : l'exemple de code précédent est compatible avec les environnements d'exécution Python 3.6.

2.    Enregistrez le code en tant que fichier Python (par exemple, StartElasticBeanstalk.py).

3.    Compressez le fichier Python en fichier ZIP (par exemple, StartElasticBeanstalk.zip).

4.    Pour arrêter l'environnement Elastic Beanstalk, copiez le code suivant dans un éditeur de texte :

import boto3
envid=['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 l'ID de votre environnement Elastic Beanstalk.

5.    Enregistrez le code en tant que fichier Python (par exemple, StopElasticBeanstalk.py).

6.    Compressez le fichier Python en fichier ZIP (par exemple, StopElasticBeanstalk.zip).

Créer votre fonction Lambda

Remarque : si vous recevez des erreurs lors de l'exécution de commandes depuis l'interface de ligne de commande AWS (AWS CLI), assurez-vous d'utiliser la version la plus récente de l'interface de ligne de commande AWS.

Dans la CLI AWS, exécutez les commandes suivantes pour créer des fonctions Lambda qui arrêtent et redémarrent votre environnement Elastic Beanstalk :

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.6 --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.6 --region us-west-2

Important :remplacez us-west-2 par la région AWS dans laquelle se trouve votre environnement Elastic Beanstalk. Important : indiquez le package de déploiement (StartElasticBeanstalk.zip or 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 déclencher 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-2
aws events put-rule --name "StopLambdaFunction" --schedule-expression "cron(0 18 * * ? *)" --region us-west-2

Remarque : la propriété -planify-expression nécessite la syntaxe cron. Mettez à jour les valeurs de la propriété —schedule-expression si nécessaire. Remplacez us-west-2 par la région AWS où se trouve votre environnement Elastic Beanstalk.

2.    Exécutez les commandes add-permission suivantes pour approuver le mandataire du service CloudWatch Events (events.amazonaws.com) et étendre la portée des autorisations aux règles que vous avez créées à l'étape 1 :

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 où se trouve votre environnement Elastic Beanstalk.

3.    Pour ajouter à cette règle la fonction Lambda que vous avez créée afin que la règle s'exécute selon un 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 dans chaque commande par l'ARN du rôle IAM. Remplacez us-west-2 par la région AWS où se trouve votre environnement Elastic Beanstalk.

Utiliser des modèles AWS CloudFormation

Vous pouvez créer un modèle AWS CloudFormation pour effectuer toutes les actions de cette résolution. Vous pouvez configurer le modèle pour créer le rôle d'exécution IAM Lambda, démarrer la fonction Lambda, arrêter la fonction Lambda, puis déclencher l'événement CloudWatch.


Cet article vous a-t-il été utile ?


Besoin d'aide pour une question technique ou de facturation ?