Usando AWS re:Post, accetti AWS re:Post Termini di utilizzo

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

5 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

Puoi usare AWS Lambda e Amazon EventBridge per arrestare e avviare automaticamente istanze EC2.

Nota: di seguito viene fornita una semplice soluzione di esempio. Per una soluzione più avanzata, usa il Pianificatore di istanze su AWS. Per ulteriori informazioni, consulta Automate starting and stopping AWS instances.

Per utilizzare Lambda per arrestare e avviare 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.

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 Required AWS KMS key policy for use with encrypted volumes.

Risoluzione

Prerequisito: ottieni gli ID delle istanze EC2 che desideri arrestare e avviare.

Crea una policy e un ruolo IAM per la funzione Lambda

Completa i passaggi seguenti:

  1. Usa l'editor di policy JSON per creare una policy IAM. Inserisci il documento di policy JSON seguente 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.

  3. Collega la policy IAM al ruolo IAM.

Nota: se usi un volume Amazon Elastic Block Store (Amazon EBS), potrebbe essere necessaria una configurazione aggiuntiva. Se il volume Amazon EBS è crittografato con 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

Completa i passaggi seguenti:

  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, come ArrestaIstanzeEC2 o AvviaIstanzeEC2.
    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. Scegli la scheda Codice.

  6. Nella scheda lambda\ _function.py in Origine del codice, inserisci il codice seguente nell'editor di codice per interrompere le istanze:

    import boto3region = '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))

    Per avviare le istanze, inserisci il codice seguente nell'editor di codice:

    import boto3region = '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))

    Nota: sostituisci us-west-1 con la regione AWS in cui si trovano le istanze e InstanceIds con gli ID delle istanze che desideri arrestare e avviare.

  7. Scegli Distribuisci.

  8. Nella scheda Configurazione scegli Configurazione generale, quindi scegli Modifica.

  9. Imposta il Timeout su 10 secondi, quindi scegli Salva.

Testa le funzioni Lambda

Completa i passaggi seguenti:

  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 per l'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 Amazon EC2

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

CloudTrail

Per verificare che la funzione Lambda abbia arrestato o avviato l'istanza, puoi usare anche AWS CloudTrail.

Completa i passaggi seguenti:

  1. Apri la console CloudTrail.
  2. Nel pannello di navigazione scegli Cronologia degli eventi.
  3. Nell'elenco a discesa Attributi di ricerca 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 le funzioni Lambda

Completa i passaggi seguenti:

  1. Apri la console EventBridge.
  2. Scegli Crea regola.
  3. Inserisci un nome per la regola, come ArrestaIstanzeEC2 o AvviaIstanzeEC2.
  4. (Facoltativo) In Descrizione inserisci una descrizione per la regola.
  5. In Tipo di regola scegli Programma, quindi scegli Continua nel pianificatore EventBridge.
  6. In Modello di pianificazione, in Ricorrenza scegli Pianificazione ricorrente.
  7. In Tipo di pianificazione scegli Pianificazione basata sulla frequenza o Pianificazione basata su Cron, quindi completa uno dei passaggi seguenti:
    Per Pianificazione basata sulla frequenza, inserisci un valore di frequenza, quindi scegli un intervallo di tempo in minuti, ore o giorni.
    -oppure-
    Per Pianificazione basata su Cron, inserisci un'espressione che indichi a Lambda quando arrestare o avviare l'istanza.
    Nota: le espressioni Cron sono calcolate in UTC. Assicurati di adattare l'espressione al tuo fuso orario.
  8. Nella pagina Seleziona destinazioni scegli Funzione Lambda dall'elenco a discesa Destinazione.
  9. In Funzione scegli la funzione che arresta o avvia le istanze.
  10. Scegli Passa alla revisione e alla creazione, quindi scegli Crea.

Nota: puoi anche creare regole che reagiscano a eventi nel tuo account AWS.

Informazioni correlate

Tutorial: Create an EventBridge scheduled rule for AWS Lambda functions

Events from AWS services in EventBridge

Amazon EC2 billing and purchasing options

AWS UFFICIALE
AWS UFFICIALEAggiornata un mese fa