Come posso utilizzare Lambda per arrestare e avviare le istanze Amazon EC2 a intervalli regolari?

6 minuti di lettura
0

Desidero arrestare e avviare automaticamente le istanze Amazon Elastic Compute Cloud (Amazon EC2) per ridurre l'utilizzo di Amazon EC2.

Breve descrizione

Usa AWS Lambda e Amazon EventBridge per arrestare e avviare automaticamente le istanze EC2.

Nota: di seguito viene fornita una semplice soluzione di esempio. Per una soluzione più avanzata, utilizza AWS Instance Scheduler. Per ulteriori informazioni, consulta la pagina Automate starting and stopping AWS instances.

Per utilizzare Lambda per arrestare e avviare le istanze EC2 a intervalli regolari, completa i passaggi seguenti:

  1. Crea una policy AWS Identity and Access Management (IAM) personalizzata e un ruolo IAM per la funzione Lambda.
  2. Crea funzioni Lambda per arrestare e avviare le istanze EC2.
  3. Testa le funzioni Lambda.
  4. Crea pianificazioni EventBridge che eseguano la funzione in base a una pianificazione.
    Nota: puoi anche creare regole che reagiscano agli eventi nel tuo account AWS.

Risoluzione

Nota: dopo aver completato i seguenti passaggi, potresti ricevere un messaggio di errore Client error on launch. Per maggiori informazioni, consulta la pagina Quando avvio la mia istanza con i volumi crittografati collegati, l'istanza si arresta immediatamente con l'errore "errore del client all'avvio".

Ottieni gli ID delle istanze EC2 che desideri arrestare e avviare. Quindi, completa i passaggi seguenti.

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

  1. Usa l'editor di policy JSON per creare una policy IAM. Incolla il seguente documento di policy JSON nell'editor di 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 colleghi una policy di autorizzazione a Lambda, assicurati di scegliere la policy IAM.

Nota: se utilizzi un volume Amazon Elastic Block Store (Amazon EBS) crittografato da una chiave del Servizio AWS di gestione delle chiavi (AWS KMS) gestita dal cliente, aggiungi kms:CreateGrant alla policy IAM.

Crea funzioni Lambda per arrestare e avviare le istanze

  1. Apri la console Lambda, quindi scegli Crea funzione.
  2. Scegli Crea da zero.
  3. In Informazioni di base inserisci le seguenti informazioni:
    In Nome funzione inserisci un nome che descriva la funzione (ad esempio, "StopEC2Instances").
    In Runtime scegli Python 3.9.
    In Autorizzazioni espandi la voce Modifica del ruolo di esecuzione predefinito.
    In Ruolo di esecuzione scegli Utilizza un ruolo esistente.
    In Ruolo esistente scegli il ruolo IAM.
  4. Scegli Crea funzione.
  5. Nella scheda Codice, in Origine del codice incolla il codice seguente nel riquadro dell'editor di codice, nella scheda lambda_function. Questo codice arresta le istanze che identifichi:
    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))
    Sostituisci us-west-1 con la Regione AWS in cui si trovano le tue istanze. Sostituisci InstanceIds con gli ID delle istanze che desideri arrestare e avviare.
  6. Scegli Distribuisci.
  7. Nella scheda Configurazione scegli Configurazione generale, quindi scegli Modifica.
  8. Imposta il Timeout su 10 secondi, quindi scegli Salva.
    Nota: (facoltativo) è possibile modificare le impostazioni della funzione Lambda. Ad esempio, per arrestare e avviare più istanze, è possibile utilizzare valori diversi per Timeout e Memoria.
  9. Ripeti i passaggi da 1 a 7 per creare un'altra funzione. Completa i seguenti passaggi per consentire a questa funzione di avviare le tue istanze:
    Nel passaggio 3 inserisci un Nome funzione diverso. Ad esempio "StartEC2Instances".
    Nel passaggio 5, incolla il seguente codice nel riquadro dell'editor di codice, nella scheda lambda_function:
    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))

          Usa la tua Regione e gli stessi ID delle istanze.

Testa le funzioni Lambda

  1. Apri la console Lambda, quindi scegli Funzioni.
  2. Scegli una delle funzioni.
  3. Scegli la scheda Codice.
  4. Nella sezione Origine del codice scegli Esegui il test.
  5. Nella finestra di dialogo Configura evento di test scegli Crea un nuovo evento di test.
  6. Inserisci un Nome evento. Quindi scegli Crea.
    Nota: non modificare il codice JSON per l'evento di test.
  7. Scegli Esegui il test per eseguire la funzione.
  8. Ripeti i passaggi da 1 a 7 per l'altra funzione.

Verifica lo stato delle istanze

Console di gestione AWS

Prima e dopo il test controlla lo stato delle istanze per confermare che le funzioni vengano eseguite correttamente.

CloudTrail

Per verificare che la funzione Lambda abbia arrestato o avviato l'istanza, usa AWS CloudTrail per controllare la presenza di eventi.

  1. Apri la console CloudTrail.
  2. Nel pannello di navigazione, scegli Cronologia degli eventi.
  3. Scegli l'elenco a discesa Attributi di ricerca, quindi scegli Nome evento.
  4. Nella barra di ricerca inserisci StopInstances per esaminare i risultati. Quindi, inserisci StartInstances.

Se non ci sono risultati, la funzione Lambda non ha arrestato né avviato le istanze.

Crea regole EventBridge che eseguono funzioni Lambda

  1. Apri la console EventBridge.
  2. Seleziona Crea regola.
  3. Inserisci un nome per la regola (ad esempio, "StopEC2Instances"). (Facoltativo) In Descrizione inserisci una descrizione per la regola.
  4. In Tipo di regola scegli Programma, quindi scegli Continua nel pianificatore EventBridge.
  5. Come modello di pianificazione, scegli Pianificazione ricorrente.
  6. In Modello di pianificazione, in Ricorrenza scegli Pianificazione ricorrente.
  7. In Tipo di programma scegli un tipo di pianificazione, quindi completa i seguenti passaggi:
    In Pianificazione basata su tariffa, inserisci un valore per la tariffa, quindi scegli un intervallo di tempo in minuti, ore o giorni.
    -oppure-
    In Pianificazione basata su cron, inserisci un'espressione che indichi a Lambda quando interrompere l'istanza. Per informazioni sulla sintassi delle espressioni, consulta la pagina Creazione di una regola Amazon EventBridge eseguita in base a una pianificazione.
    Nota: le espressioni Cron sono calcolate in UTC. Assicurati di adattare l'espressione al tuo fuso orario.
  8. In Seleziona destinazioni scegli Funzione Lambda dall'elenco a discesa Destinazione.
  9. In Funzione scegli la funzione che arresta le istanze.
  10. Scegli Passa alla revisione e alla creazione, quindi scegli Crea.
  11. Ripeti i passaggi da 1 a 10 per creare una regola per avviare le istanze. Completa i passaggi seguenti:
    Inserisci un nome per la regola (ad esempio, "StartEC2Instances").
    (Facoltativo) In Descrizione inserisci una descrizione per la regola (ad esempio, "Avvia le istanze EC2 ogni mattina alle 7:00").
    Al passaggio 7, in Espressione Cron inserisci un'espressione che indichi a Lambda quando avviare le istanze.
    Al passaggio 9, in Funzione scegli la funzione che avvia le istanze.

Nota: a volte una funzione Lambda arresta un'istanza e non è in grado di riavviarla. Ciò si verifica quando un volume Amazon Elastic Block Store (Amazon EBS) è crittografato e il ruolo Lambda non è autorizzato a utilizzare la chiave di crittografia. Per ulteriori informazioni, consulta la pagina Policy delle chiavi AWS KMS richiesta per l'uso con volumi crittografati e Policy delle chiavi in AWS KMS.

Informazioni correlate

Tutorial: pianificazione delle funzioni AWS Lambda mediante EventBridge

Eventi derivanti dai servizi AWS

Aggiunta di operazioni di arresto ad allarmi Amazon CloudWatch

Opzioni di acquisto delle istanze

AWS UFFICIALE
AWS UFFICIALEAggiornata 8 mesi fa