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

Date de la dernière mise à jour : 18/10/2021

Je souhaite arrêter un service de base de données Amazon Relational Database Service (Amazon RDS) pendant plus de sept jours.

Brève description

Vous pouvez facilement démarrer et arrêter vos instances Amazon RDS en quelques minutes. Cette fonctionnalité permet de réaliser des économies pour les bases de données qui ne doivent pas nécessairement être exécutées en permanence. Vous pouvez arrêter une instance de base de données pendant sept jours au maximum. Si vous ne démarrez pas manuellement votre instance de base de données après sept jours, l'instance est automatiquement démarrée. Cela se produit afin que l'instance ne soit pas en retard sur les mises à jour de maintenance requises pour le matériel, le système d'exploitation sous-jacent ou la version du moteur de base de données.

Pour arrêter votre instance RDS pendant plus de sept jours sans manquer les mises à jour de maintenance requises, procédez comme suit :

  1. Configurez les autorisations AWS Identity Access Management (IAM) pour permettre à AWS Lambda d'effectuer les opérations suivantes : Démarrer l'instance. Arrêter l'instance. Récupérer les informations relatives à l'instance.
  2. Ajouter des balises pour les instances RDS que vous souhaitez démarrer et arrêter automatiquement.
  3. Créer une fonction Lambda pour démarrer l'instance de base de données.
  4. Créer une fonction Lambda pour arrêter l'instance de base de données.
  5. Créer un programme pour effectuer les opérations suivantes : Démarrer une instance de base de données au début de la fenêtre de maintenance hebdomadaire. Arrêter une instance de base de données à la fin de la fenêtre de maintenance.

Solution

Configurer les autorisations IAM

Créez une stratégie IAM pour permettre à Lambda de démarrer et d'arrêter l'instance et de récupérer des informations sur l'instance.

1.    Ouvrez la console IAM.

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

3.    Choisissez Create policy (Créer une stratégie).

4.    Choisissez l'onglet JSON.

5.    Copiez la stratégie suivante et collez-la sous l'onglet JSON pour accorder les autorisations IAM requises :

{
    "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.    Sélectionnez Next: Tags (Suivant : balises).

7.    (Facultatif) Pour ajouter une étiquette, choisissez Ajouter une étiquette, puis entrez les valeurs appropriées pour les champs Clé etValeur - facultatifs.

8.    Choisissez Next: Review (Étape suivante : vérification).

9.    Sur la page Review policy (Vérifier la stratégie), pour Name (Nom), saisissez le nom de votre stratégie. Consultez la section Résumé pour connaître les autorisations accordées par votre stratégie.

10.    Choisissez Create policy (Créer une stratégie).

Pour plus d'informations, consultez la section Création de stratégies sous l'onglet JSON.

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

  1. Ouvrez la console IAM.
  2. Dans le volet de navigation, choisissez Rôles.
  3. Choisissez Create role (Créer un rôle).
  4. Pour Select type of trusted entity (Sélectionner le type d'entité de confiance), choisissez AWS service (Service AWS).
  5. Sous Ou sélectionnez un service pour afficher ses cas d'utilisation, choisissez Lambda.
  6. Choisissez Next: Permissions (Étape suivante : autorisations).
  7. Pour Filter-policies, entrez le nom de la stratégie créée dans la section précédente. Lorsque la stratégie que vous avez créée apparaît, sélectionnez-la. Pour Filter-policies, saisissez AWSLambdaBasicExecutionRole. Lorsque la stratégie gérée AWSLambdaBasicExecutionRole que vous avez créée apparaît, sélectionnez la stratégie.
  8. Sélectionnez Next: Tags (Étape suivante : étiquettes).
  9. (Facultatif) Pour ajouter une étiquette, entrez les valeurs appropriées pour les champs Clé et Valeur (facultatif).
  10. Choisissez Next: Review (Étape suivante : vérification).
  11. Sur la page Create role (Créer un rôle), pour Role name (Nom du rôle), saisissez le nom du rôle que vous créez.
  12. Choisissez Create role (Créer un rôle).

Pour plus d'informations, consultez la section Création d'un rôle pour un service AWS (console).

Ajouter des balises pour les instances DB

  1. Ouvrez la console Amazon RDS.
  2. Sélectionnez Bases de données dans le panneau de navigation.
  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 l'écran jusqu'à la section Étiquettes.
  5. Sous l'onglet Étiquettes, choisissez Ajouter. Pour Touche d’étiquette, saisissez le démarrage automatique. Pour Valeur, saisissez oui. Cliquez sur Ajouter pour enregistrer vos modifications.
  6. Cliquez à nouveau sur Ajouter. Pour Touche d’étiquette, saisissez arrêt automatique. Pour Valeur, saisissez oui. Cliquez sur Ajouter pour enregistrer vos modifications.

Pour plus d'informations, consultez la section Ajout, mise en liste et suppression d’étiquettes.

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, sélectionnez Fonctions.

3.    Choisissez Create function (Créer une fonction).

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

5.    Pour function-name, entrez le nom de votre fonction.

6.    Pour Runtime (Environnement d'exécution), sélectionnez Python 3.7.

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

7.    Développez Modifier le rôle d'exécution par défaut.

8.    Pour Rôle d'exécution, sélectionnez Utiliser un rôle existant.

9.    Pour Existing role (Rôle existant), choisissez le rôle IAM que vous avez créé précédemment.

10.    Sélectionnez Créer une fonction.

11.    Cliquez sur l'onglet Code.

12.    Dans l'éditeur de code source, supprimez l'exemple de code et collez ce qui suit :

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'):
            doNotStart=1
            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']))
                if(doNotStart == 1):
                    doNotStart=1
            except Exception as e:
                print ("Cannot start instance {0}.".format(db['DBInstanceIdentifier']))
                print(e)
                

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

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

15.    Choisissez l'onglet Configuration, Configuration générale, puis Modifier.

16.    Sous Timeout, procédez comme suit : pendant min, sélectionnez 0. Pendant seconde, sélectionnez 10. 17.    Sélectionnez Enregistrer.

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

Pour créer une fonction Lambda afin d'arrêter les instances de bases de données balisées, suivez les instructions de la section précédente Créer une fonction Lambda pour démarrer les instances de bases de données étiquetées avec la modification suivante :

Dans l'éditeur de code source, supprimez l'exemple de code et collez ce qui suit :

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'):
            DoNotStop=1
            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']))
                if(DoNotStop == 1):
                    DoNotStop=1
            except Exception as e:
                print ("Cannot stop instance {0}.".format(db['DBInstanceIdentifier']))
                print(e)
                
if __name__ == "__main__":
    lambda_handler(None, None)

Effectuez des tests de fonction

Supposons que vos instances de base de données étiquetées soient dans l'état Arrêté. Pour effectuer un test de fonction, procédez comme suit :

  1. Ouvrez la liste des 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. Sous l'onglet Test, pour Nom, saisissez le nom de votre événement.
  5. Choisissez Enregistrer les modifications, puis Tester.

Créer le calendrier

Supposons que la fenêtre de maintenance hebdomadaire pour les instances de bases de données balisées soit le dimanche de 22h00 à 22h30. Vous pouvez définir une planification en créant deux règles pour les éléments suivants :

  • Démarrage automatique de 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 de démarrage automatique de l'instance de base de données 30 minutes avant la fenêtre de maintenance, procédez comme suit :

  1. Ouvrez la liste des fonctions Lambda.
  2. Choisissez la fonction que vous avez créée pour démarrer les instances de base de données.
  3. Sous Vue d'ensemble des fonctions, choisissez Ajouter un déclencheur.
  4. Sélectionnez EventBridge (CloudWatch Events), puis Créer une nouvelle règle.
  5. Pour Nom de la règle, saisissez le nom de la règle que vous souhaitez créer.
  6. Pour Schedule Expression, ajoutez une expression cron pour la planification automatisée (Exemple : cron (30 21 ? * DIM *)).
  7. Choisissez Add (Ajouter).

Utilisez les mêmes instructions 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. N'oubliez pas de modifier le nom de la règle et l'expression cron pour la planification automatisée en conséquence (Exemple : cron (00 23 ? * DIM *)).