Comment puis-je utiliser une fonction Lambda pour arrêter une instance Amazon RDS pendant plus de sept jours ?

Lecture de 7 minute(s)
0

Je souhaite utiliser AWS Lambda pour arrêter Amazon Relational Database Service (Amazon RDS) pendant une durée supérieure à sept jours.

Brève description

Par défaut, vous pouvez arrêter une instance de base de données Amazon RDS pendant sept jours consécutifs maximum. Au bout de sept jours, l’instance redémarre afin de ne manquer aucune mise à jour de maintenance.

Pour arrêter votre instance pendant plus de sept jours, vous pouvez utiliser Step Functions afin d’automatiser le flux de travail sans manquer de fenêtre de maintenance.

Remarque : une autre résolution est proposée sur la page Comment utiliser Step Functions pour arrêter une instance Amazon RDS pendant plus de sept jours ?

Résolution

Configurer les autorisations IAM

Créez une stratégie Gestion des identités et des accès AWS (AWS IAM) pour permettre à Lambda de démarrer et d’arrêter l’instance et de récupérer les informations sur l’instance.

1.    Ouvrez la console IAM.

2.    Dans le volet de navigation, choisissez Stratégies.

3.    Choisissez Créer une stratégie.

4.    Choisissez l’onglet JSON.

5.    Pour accorder les autorisations IAM requises, saisissez la stratégie suivante sous l’onglet JSON :

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "VisualEditor0",
            "Effect": "Allow",
            "Action": [
                "rds:StartDBCluster",
                "rds:StopDBCluster",
                "rds:ListTagsForResource",
                "rds:DescribeDBInstances",
                "rds:StopDBInstance",
                "rds:DescribeDBClusters",
                "rds:StartDBInstance"
            ],
            "Resource": "*"
        }
    ]
}

6.    Choisissez Suivant : Balises.

7.    (Facultatif) Afin d’ajouter une balise, choisissez Ajouter une balise, puis saisissez les valeurs appropriées pour les champs facultatifs Clé et Valeur.

8.    Choisissez Suivant : Examiner.

9.    Sur la page Examiner une stratégie, dans le champ Nom, saisissez le nom de votre stratégie. Consultez la section Résumé pour voir les autorisations accordées par votre stratégie.

10.    Choisissez Créer une stratégie.

Pour en savoir plus, consultez la page Création de stratégies à l’aide de l’éditeur JSON.

Créez un rôle IAM, puis associez les stratégies requises

1.    Ouvrez la console IAM.

2.    Dans le volet de navigation, choisissez Rôles.

3.    Choisissez Créer un rôle.

4.    Pour le champ Sélectionner le type d’entité de confiance, sélectionnez Service AWS.

5.    Sous Ou sélectionner un service pour voir ses cas d’utilisation, sélectionnez Lambda.

6.    Choisissez Suivant : Autorisations.

7.    Pour le champ Filtre-stratégies, saisissez le nom de la stratégie que vous avez créée dans la section précédente. Lorsqu’elle s’affiche, sélectionnez la stratégie. Pour le champ Filtre-stratégies, saisissez AWSLambdaBasicExecutionRole. Lorsqu’elle s’affiche, sélectionnez la stratégie gérée AWSLambdaBasicExecutionRole.

8.    Choisissez Suivant : Balises.

9.    (Facultatif) Afin d’ajouter une balise, saisissez les valeurs appropriées pour les champs Clé et Valeur (facultatif).

10.    Choisissez Suivant : Examiner.

11.    Sur la page Créer un rôle, pour le champ Nom du rôle, saisissez le nom du rôle que vous créez.

12.    Choisissez Créer un rôle.

Pour en savoir plus, consultez la page Création d’un rôle pour un service AWS (console).

Ajouter des balises pour les instances de base de données

1.    Ouvrez la console Amazon RDS.

2.    Dans le volet de navigation, choisissez Bases de données.

3.    Choisissez l’instance de base de données que vous souhaitez démarrer et arrêter automatiquement.

4.    Dans la section des détails, faites défiler la page vers le bas jusqu’à la section Balises.

5.    Dans l’onglet Balises, choisissez Ajouter. Pour le champ Clé de balise, saisissez démarrage automatique. Pour le champ Valeur, saisissez oui. Choisissez Ajouter pour enregistrer vos modifications.

6.    Choisissez Ajouter à nouveau. Pour le champ Clé de balise, saisissez arrêt automatique. Pour le champ Valeur, saisissez oui. Choisissez Ajouter pour enregistrer vos modifications.

Pour en savoir plus, consultez la page Ajouter, répertorier et supprimer des balises.

Créer une fonction Lambda pour démarrer les instances de base de données balisées

1.    Ouvrez la console Lambda.

2.    Dans le volet de navigation, choisissez Fonctions.

3.    Sélectionnez Créer une fonction.

4.    Choisissez Créer à partir de zéro.

5.    Pour le champ Nom de la fonction, saisissez le nom de votre fonction.

6.    Pour le champ Exécution, sélectionnez Python 3.7.

7.    Pour le champ Architecture, conservez la sélection par défaut de x86_64.

8.    Développez la section Modifier le rôle d’exécution par défaut.

9.    Pour le champ Rôle d’exécution, sélectionnez Utiliser un rôle existant.

10.    Pour le champ Rôle existant, sélectionnez le rôle IAM que vous avez créé.

11.    Sélectionnez Créer une fonction.

12.    Choisissez l’onglet Code.

13.    Dans l’éditeur de code source, supprimez l’exemple de code et saisissez le code suivant :

import boto3
rds = boto3.client('rds')

def lambda_handler(event, context):

    #Start DB Instances
    dbs = rds.describe_db_instances()
    for db in dbs['DBInstances']:
        #Check if DB instance stopped. Start it if eligible.
        if (db['DBInstanceStatus'] == 'stopped'):
            try:
                GetTags=rds.list_tags_for_resource(ResourceName=db['DBInstanceArn'])['TagList']
                for tags in GetTags:
                #if tag "autostart=yes" is set for instance, start it
                    if(tags['Key'] == 'autostart' and tags['Value'] == 'yes'):
                        result = rds.start_db_instance(DBInstanceIdentifier=db['DBInstanceIdentifier'])
                        print ("Starting instance: {0}.".format(db['DBInstanceIdentifier']))
            except Exception as e:
                print ("Cannot start instance {0}.".format(db['DBInstanceIdentifier']))
                print(e)


if __name__ == "__main__":
    lambda_handler(None, None)

14.    Choisissez Fichier, Enregistrer, puis Déployer.

15.    Cliquez sur l’onglet Configuration, choisissez Configuration générale, puis sélectionnez Modifier.

16.    Sous Expiration, renseignez les champs suivants :
Pour le champ min, sélectionnez 0.
Pour le champ sec, sélectionnez 10.

17.    Choisissez Enregistrer.

Créer une fonction Lambda pour arrêter les instances de base de données balisées

Pour créer une fonction Lambda afin d’arrêter les instances de base de données balisées, consultez la section précédente Créer une fonction Lambda pour démarrer les instances de base de données balisées. Suivez les mêmes étapes, mais utilisez un code différent pour l’étape 12.

Dans l’éditeur de code source, supprimez l’exemple de code et saisissez le code suivant :

import boto3
rds = boto3.client('rds')

def lambda_handler(event, context):

    #Stop DB instances
    dbs = rds.describe_db_instances()
    for db in dbs['DBInstances']:
        #Check if DB instance is not already stopped
        if (db['DBInstanceStatus'] == 'available'):
            try:
                GetTags=rds.list_tags_for_resource(ResourceName=db['DBInstanceArn'])['TagList']
                for tags in GetTags:
                #if tag "autostop=yes" is set for instance, stop it
                    if(tags['Key'] == 'autostop' and tags['Value'] == 'yes'):
                        result = rds.stop_db_instance(DBInstanceIdentifier=db['DBInstanceIdentifier'])
                        print ("Stopping instance: {0}.".format(db['DBInstanceIdentifier']))
            except Exception as e:
                print ("Cannot stop instance {0}.".format(db['DBInstanceIdentifier']))
                print(e)

if __name__ == "__main__":
    lambda_handler(None, None)

Effectuer des tests de fonctionnement

Pour les instances de base de données balisées à l’état Arrêté, procédez comme suit pour effectuer les tests de fonctionnement :

1.    Ouvrez la liste Fonctions Lambda.

2.    Choisissez la fonction que vous avez créée pour démarrer les instances de base de données.

3.    Choisissez Actions, puis Test.

4.    Dans l’onglet Test, pour le champ Nom, saisissez le nom de votre événement.

5.    Choisissez Enregistrer les modifications, puis Test.

Créer la planification

Vous pouvez créer des règles pour établir une planification. Par exemple, si votre fenêtre de maintenance hebdomadaire pour les instances de base de données balisées est le dimanche de 22 h 00 à 22 h 30, vous pouvez créer les règles suivantes :

  • Démarrez automatiquement l’instance de base de données 30 minutes avant le début de la fenêtre de maintenance.
  • Arrêtez automatiquement l’instance de base de données 30 minutes après la fin de la fenêtre de maintenance.

Pour créer la règle permettant de démarrer automatiquement l’instance de base de données 30 minutes avant la fenêtre de maintenance, procédez comme suit :

1.    Ouvrez la liste Fonctions Lambda.

2.    Choisissez la fonction que vous avez créée pour démarrer les instances de base de données.

3.    Sous Présentation de la fonction, sélectionnez Ajouter un déclencheur.

4.    Sélectionnez EventBridge (CloudWatch Events), puis Créer une nouvelle règle.

5.    Pour le champ Nom de la règle, saisissez le nom de la règle que vous souhaitez créer.

6.    Dans le champ Expression de planification, ajoutez une expression Cron pour la planification automatique (exemple : cron(30 21 ? * SUN *)).

7.    Choisissez Ajouter.

Procédez de la même manière pour créer une autre règle afin d’arrêter automatiquement l’instance de base de données 30 minutes après la fenêtre de maintenance. Veillez à modifier le nom de la règle et l’expression Cron pour la planification automatique en conséquence (exemple : cron(00 23 ? * SUN *)).

Informations connexes

Mise en œuvre de l’arrêt et du démarrage des instances de base de données dans Amazon RDS

Arrêt d’une instance de base de données démarrée automatiquement avec Amazon RDS

Comment puis-je arrêter un cluster Amazon Aurora pendant plus de sept jours ?

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