In che modo posso interrompere e riavviare istanze Amazon EC2 a intervalli regolari con Lambda?

Ultimo aggiornamento: 2022-01-13

Vorrei ridurre l'utilizzo di Amazon Elastic Compute Cloud (Amazon EC2) interrompendo e avviando istanze EC2 automaticamente. In che modo posso farlo utilizzando AWS Lambda e Amazon EventBridge?

Breve descrizione

Nota: questa configurazione di esempio è una soluzione semplice. Per una soluzione più complessa, utilizza i pianificatore di istanze AWS. Per ulteriori informazioni, consulta In che modo posso interrompere e riavviare le mie istanze attraverso il pianificatore di istanze AWS?

Per interrompere e avviare istanze EC2 a intervalli regolari con Lambda, esegui le seguenti operazioni:

1.    Crea una policy personalizzata di AWS Identity and Access Management (IAM) e un ruolo di esecuzione per la funzione Lambda.

2.    Crea funzioni Lambda per interrompere e avviare le istanze EC2.

3.    Test delle funzioni Lambda.

4.    Crea regole EventBridge che attivano la tua funzione in base a una pianificazione.
Nota: puoi anche creare regole che si attivano su un evento che si svolge nel tuo account AWS.

In alternativa, puoi utilizzare il modello AWS CloudFormation fornito alla fine di questo articolo per automatizzare la procedura.

Risoluzione

Nota: se ricevi un errore Client all'avvio dopo aver completato la procedura seguente, consulta Quando avvio la mia istanza con volumi crittografati collegati, l'istanza si arresta immediatamente con l'errore "errore client all'avvio".

Ottieni gli ID delle istanze EC2 che desideri arrestare e avviare. Quindi, procedi come segue:

Crea una policy e un ruolo di esecuzione IAM per la funzione Lambda

1.    Crea una policy IAM utilizzando l'editor di policy JSON. Copia e incolla il seguente documento sulla policy JSON nell'editor della policy:

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "logs:CreateLogGroup",
        "logs:CreateLogStream",
        "logs:PutLogEvents"
      ],
      "Resource": "arn:aws:logs:*:*:*"
    },
    {
      "Effect": "Allow",
      "Action": [
        "ec2:Start*",
        "ec2:Stop*"
      ],
      "Resource": "*"
    }
  ]
}

2.    Crea un ruolo IAM per Lambda.

Importante: quando alleghi una policy di autorizzazioni a Lambda, assicuratii di scegliere la policy IAM appena creata.

Crea funzioni Lambda per interrompere e avviare le istanze EC2

1.    Nella console AWS Lambda, scegli Crea funzione.

2.    Seleziona Crea da zero.

3.    Per la sezione Informazioni di base segui queste istruzioni:
Per Nome funzione, inserisci un nome che la identifichi come la funzione utilizzata per arrestare le istanze EC2. Ad esempio, "StopEC2Instances".
Per Runtime, scegli Python 3.9..
In Autorizzazioni, espandi Modifica ruolo di esecuzione di default.
Per Ruolo di esecuzione, scegli Utilizza un ruolo esistente.
In Ruolo esistente, scegli il ruolo IAM che hai creato.

4.    Scegli Crea funzione.

5.    Sotto Codice, Codice sorgente, copia e incolla il seguente codice nel riquadro dell'editor nell'editor di codice ( lambda_function). Questo codice arresta le istanze EC2 identificate.

Esempio di codice funzione: arresto delle istanze EC2

import boto3
region = 'us-west-1'
instances = ['i-12345cb6de4f78g9h', 'i-08ce9b2d7eccf6d26']
ec2 = boto3.client('ec2', region_name=region)

def lambda_handler(event, context):
    ec2.stop_instances(InstanceIds=instances)
    print('stopped your instances: ' + str(instances))

Importante: Per regione, sostituisci "us-west-1" con la Regione AWS in cui si trovano le tue istanze. Per istanze, sostituisci gli esempi di ID dell'istanza EC2 con gli ID delle istanze specifiche che desideri interrompere e avviare.

6.    Scegli Implementa.

7.    Nella scheda Configurazione, seleziona Configurazione generale, Modifica. Imposta Timeout su 10 secondi, quindi seleziona Salva.

Nota: Configura le impostazioni della funzione Lambda secondo necessità per il tuo caso d'uso. Per esempio, se desideri interrompere e avviare più istanze, potrebbe essere necessario un valore diverso per Timeout e Memoria.

8.    Ripeti le fasi da 1 a 7 per creare un'altra funzione. Effettua le seguenti operazioni in modo che questa funzione avvii le istanze EC2:

Nel passaggio 3, inserisci un nome di funzione diverso da quello utilizzato in precedenza. Ad esempio, "StartEC2Instances".
Nel passaggio 5, copia e incolla il seguente codice nel riquadro dell'editor di codice ( lambda_function):

Esempio di codice funzione: avvio di istanze EC2

import boto3
region = 'us-west-1'
instances = ['i-12345cb6de4f78g9h', 'i-08ce9b2d7eccf6d26']
ec2 = boto3.client('ec2', region_name=region)

def lambda_handler(event, context):
    ec2.start_instances(InstanceIds=instances)
    print('started your instances: ' + str(instances))

Importante: per regione e istanze, utilizza gli stessi valori che hai utilizzato per far sì che il codice interrompesse le istanze EC2.

Test delle funzioni Lambda

1.    Nella Console AWS Lambda, scegli Funzioni.

2.    Scegli una delle funzioni che hai creato.

3.    Seleziona la scheda Codice.

4.    Nella sezione Codice sorgente, seleziona Test.

5.    Nella finestra di dialogo Configura evento di test, scegli Crea nuovo evento di test.

6.    Inserisci un nome per l'evento. Quindi, seleziona Crea.

Nota: non è necessario modificare il codice JSON per l'evento di test, la funzione non lo utilizza.

7.    Scegli Test per eseguire la funzione.

8.    Ripeti i passaggi da 1 a 6 per l'altra funzione creata.

Suggerimento: è possibile controllare lo stato delle istanze EC2 prima e dopo il test per verificare che le funzioni operino come previsto.

Crea regole EventBridge che attivano le funzioni Lambda

1.    Apri la Console di EventBridge.

2.    Seleziona Create role (Crea ruolo).

3.    Inserisci un nome per la tua regola, ad esempio "STOPEC2Instances". Facoltativamente, è possibile inserire una Descrizione.

4.    In Definisci modello, seleziona Pianificazione.

5.    Effettua una delle seguenti operazioni:

Per Tasso fisso di, inserisci un intervallo di tempo in minuti, ore o giorni.
Per Espressione cron , inserisci un'espressione che dica a Lambda quando interrompere le istanze. Per informazioni sulla sintassi delle espressioni, consulta Pianificare le espressioni per le regole.
Nota
: le espressioni cron sono valutate in UTC. Assicurati di impostare l'espressione per il fuso orario che preferisci.

6.    In Seleziona destinazioni, scegli la funzione Lambda dal menu a tendina Destinazione.

7.    Per Funzione, scegli la funzione che interrompe le istanze EC2.

8.    Scorri in basso e seleziona Crea.

9.    Ripeti le fasi da 1 a 8 per creare una regola che avvii le istanze EC2. Esegui le seguenti operazioni in modo diverso:

Inserisci un nome per la tua regola, ad esempio "StartEC2Instances".
(Facoltativo) Inserisci una Descrizione, ad esempio "Avvia le istanze EC2 ogni mattina alle 7:00".
Nel passaggio 5, per espressione cron, inserisci un'espressione che indichi a Lambda quando avviare le istanze.
Nel passaggio 7, per Funzione, scegli la funzione che avvia le istanze EC2.

(Facoltativo) Utilizza il pianificatore di istanze AWS per automatizzare la procedura

Per ulteriori informazioni, consulta Automatizzare l'avvio e l'arresto delle istanze AWS.