Come posso arrestare un'istanza Amazon RDS per più di sette giorni?

Ultimo aggiornamento: 18/10/2021

Desidero arrestare un Amazon Relational Database Service (Amazon RDS) per un periodo superiore ai sette giorni.

Breve descrizione

Puoi avviare e arrestare facilmente le istanze di Amazon RDS in pochi minuti. Questa caratteristica supporta il risparmio sui costi per i database che non devono essere sempre in esecuzione. Puoi arrestare un'istanza di database per un massimo di sette giorni. Se non avvii manualmente l'istanza database dopo sette giorni, l'istanza viene avviata automaticamente. Ciò accade affinché l'istanza non rimanga indietro sugli aggiornamenti di manutenzione richiesti per l'hardware, il sistema operativo sottostante o la versione del motore di database.

Per arrestare l'istanza RDS per più di sette giorni senza perdere gli aggiornamenti di manutenzione richiesti, effettua le seguenti operazioni:

  1. Configura le autorizzazioni AWS Identity Access Management (IAM) per permettere ad AWS Lambda di eseguire le seguenti operazioni: avviare l'istanza. Arrestare l'istanza. Recuperare le informazioni sull'istanza.
  2. Aggiungere tag per le istanze RDS che desideri avviare e arrestare automaticamente.
  3. Creare una funzione Lambda per avviare l'istanza database.
  4. Creare una funzione Lambda per arrestare l'istanza database.
  5. Creare una pianificazione per eseguire le seguenti operazioni: avviare un'istanza database all'inizio della finestra di manutenzione settimanale. Arrestare un'istanza database alla fine della finestra di manutenzione.

Risoluzione

Configura le autorizzazioni IAM

Crea una policy IAM per permettere a Lambda di avviare e arrestare l'istanza e recuperare le informazioni sull'istanza.

1.    Apri la console IAM.

2.    Nel riquadro di navigazione, seleziona Policies (Policy).

3.    Scegli Crea policy.

4.    Scegli la scheda JSON.

5.    Copia la seguente policy e incollala nella scheda JSON per concedere le autorizzazioni IAM richieste:

{
    "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.    Scegli Successivo: tag.

7.    (Facoltativo) Per aggiungere un tag, scegli Aggiungi tag, quindi inserisci i valori appropriati per i campi Chiave e Valore - facoltativi.

8.    Scegli Successivo: verifica.

9.    Nella pagina Verifica policy, per Nome, inserisci il nome della policy. Consulta la sezione Riepilogo per vedere le autorizzazioni concesse dalla tua policy.

10.    Scegli Crea policy.

Per ulteriori informazioni, consulta Creazione di criteri nella scheda JSON.

Crea un ruolo IAM e quindi allega le policy richieste

  1. Apri la console IAM.
  2. Nel pannello di navigazione, scegli Ruoli.
  3. Scegli Crea ruolo.
  4. Per Seleziona il tipo di entità attendibile, seleziona Servizio AWS.
  5. In Oppure seleziona un servizio per visualizzarne i casi d'uso, scegli Lambda.
  6. Scegli Successivo: autorizzazioni.
  7. Per le Policy di filtro, inserisci il nome della policy creata nella sezione precedente. Quando viene visualizzata la policy creata, seleziona la policy. Per le Policy di filtro, inserisci AWSLambdaBasicExecutionRole. Quando viene visualizzata la policy gestita AWSLambDABasicExecutionRole creata, seleziona la policy.
  8. Scegli Successivo: tag.
  9. (Facoltativo) Per aggiungere un tag, inserisci i valori appropriati per i campi Chiave e Valore (facoltativo).
  10. Scegli Successivo: verifica.
  11. Nella pagina Crea ruolo, per Nome ruolo, inserisci il nome del ruolo che stai creando.
  12. Scegli Crea ruolo.

Per ulteriori informazioni, consulta Creazione di un ruolo per un servizio AWS (console).

Aggiungi tag per istanze database

  1. Apri la console di Amazon RDS.
  2. Nel pannello di navigazione, scegli Database.
  3. Scegli l'istanza database che desideri avviare e arrestare automaticamente.
  4. Nella sezione dettagli, scorri verso il basso fino alla sezione Tag.
  5. Nella scheda Tag, scegli Aggiungi. Per Chiave di tag, inserisci avvio automatico. Per Valore, inserisci . Scegli Aggiungi per salvare le modifiche.
  6. Scegli di nuovo Aggiungi. Per Chiave di tag, inserisci arresto automatico. Per Valore, inserisci . Scegli Aggiungi per salvare le modifiche.

Per ulteriori informazioni, consulta Aggiunta, elenco e rimozione di tag.

Crea una funzione Lambda per avviare le istanze database taggate

1.    Apri la Console Lambda.

2.    Nel pannello di navigazione, scegli Funzioni.

3.    Scegli Crea funzione.

4.    Seleziona Crea da zero.

5.    Per Nome funzione, inserisci il nome della funzione.

6.    Per Tempo di esecuzione, seleziona Python 3.7.

7.    Per Architettura, lascia la selezione di default di x86_64.

7.    Espandi Modifica ruolo di esecuzione predefinito.

8.    Per Ruolo di esecuzione, scegli Utilizza un ruolo esistente.

9.    Per Ruolo esistente, seleziona il ruolo IAM creato in precedenza.

10.    Scegli Crea funzione.

11.    Scegli la scheda Codice.

12.    Nell'editor Codice sorgente, elimina il codice di esempio e incolla quanto segue:

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.    Scegli File, scegli Salva, quindi scegli Implementa.

15.    Scegli la scheda Configurazione, scegli Configurazione generale, quindi scegli Modifica.

16.    In Timeout, effettua le seguenti operazioni: per min, seleziona 0. Per sec, seleziona 10. 17.    Scegli Salva.

Crea una funzione Lambda per arrestare le istanze database taggate

Per creare una funzione Lambda per arrestare le istanze database taggate, utilizza le istruzioni nella sezione precedente Crea una funzione Lambda per avviare le istanze database taggate con la seguente modifica:

Nell'editor Codice sorgente, elimina il codice di esempio e incolla quanto segue:

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)

Esegui test di funzionamento

Supponi che le istanze database taggate siano nello stato Arrestato. Per eseguire il test di funzionamento, effettua le seguenti operazioni:

  1. Apri l'elenco Funzioni Lambda .
  2. Scegli la funzione creata per avviare le istanze database .
  3. Scegli Operazioni, quindi fai clic su Test.
  4. Nella scheda Test, per Nome, inserisci il nome del tuo evento.
  5. Scegli Salva modifiche, quindi scegli Test.

Crea il programma

Supponi che la finestra di manutenzione settimanale per le istanze database taggate sia domenica 22:00 - 22:30. Puoi impostare una pianificazione creando due regole per quanto segue:

  • Avvia automaticamente l'istanza database 30 minuti prima dell'inizio della finestra di manutenzione
  • Arresta automaticamente l'istanza database 30 minuti dopo il termine della finestra di manutenzione

Per creare la regola per avviare automaticamente l'istanza database 30 minuti prima della finestra di manutenzione, effettua le seguenti operazioni:

  1. Apri l'elenco Funzioni Lambda .
  2. Scegli la funzione creata per avviare le istanze database.
  3. In Panoramica funzioni, scegli Aggiungi attivazione.
  4. Seleziona EventBridge (CloudWatch Events), quindi seleziona Crea una nuova regola.
  5. Per Nome regola, inserisci il nome della regola che desideri creare.
  6. Per Pianifica espressione, aggiungi un'espressione cron per la pianificazione automatica (Esempio: cron(30 21 ? * SUN *)).
  7. Scegli Aggiungi.

Utilizza le stesse istruzioni per creare un'altra regola per arrestare automaticamente l'istanza database 30 minuti dopo la finestra di manutenzione. Assicurati di modificare di conseguenza il nome della regola e l'espressione cron per la pianificazione automatica (Esempio: cron (00 23? * SOLE *)).