Tutorial : Configurazione di un hook del ciclo di vita che richiama una funzione Lambda - Amazon EC2 Auto Scaling

Le traduzioni sono generate tramite traduzione automatica. In caso di conflitto tra il contenuto di una traduzione e la versione originale in Inglese, quest'ultima prevarrà.

Tutorial : Configurazione di un hook del ciclo di vita che richiama una funzione Lambda

In questo esercizio, crei una EventBridge regola Amazon che include uno schema di filtro che, se abbinato, richiama una AWS Lambda funzione come obiettivo della regola. Forniamo il modello di filtro e il codice di funzione di esempio da utilizzare.

Se tutto è configurato correttamente, al termine di questo tutorial, la funzione Lambda eseguirà un'operazione personalizzata all'avvio delle istanze. L'azione personalizzata registra semplicemente l'evento nel flusso di log CloudWatch Logs associato alla funzione Lambda.

Se questa operazione ha esito positivo, la funzione Lambda esegue anche un callback per consentire al ciclo di vita dell'istanza di procedere, ma consente all'istanza di abbandonare l'avvio e terminare se l'operazione fallisce.

La seguente illustrazione riassume il flusso di un evento di scalabilità orizzontale quando si utilizza una funzione Lambda per eseguire un'azione personalizzata. Dopo l'avvio di un'istanza, il ciclo di vita dell'istanza viene sospeso fino al completamento dell'hook del ciclo di vita, tramite timeout o facendo sì che Amazon EC2 Auto Scaling riceva un segnale di continuazione.

Il flusso per un evento di scalabilità orizzontale quando si utilizza una funzione Lambda per eseguire un'azione personalizzata.

Prerequisiti

Prima di iniziare questa esercitazione, crea un gruppo con scalabilità automatica, se non hai già uno. Per creare un gruppo con dimensionamento automatico, apri la pagina dei gruppi Auto Scaling nella console Amazon EC2 e scegli Crea gruppo con dimensionamento automatico.

Passaggio 1: creazione di un ruolo IAM con autorizzazioni per completare le operazioni del ciclo di vita

Prima di creare una funzione Lambda, è necessario innanzitutto creare un ruolo di esecuzione e una policy di autorizzazioni per permettere a Lambda di completare gli hook del ciclo di vita.

Come creare la policy
  1. Nella console IAM, apri Policies (Policy), quindi seleziona Create policy (Crea policy).

  2. Scegli la scheda JSON.

  3. Nella casella Policy Document (Documento policy), incolla il documento della policy nella casella, sostituendo il testo in corsivo con il numero di account e il nome del gruppo con scalabilità automatica.

    { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "autoscaling:CompleteLifecycleAction" ], "Resource": "arn:aws:autoscaling:*:123456789012:autoScalingGroup:*:autoScalingGroupName/my-asg" } ] }
  4. Seleziona Successivo.

  5. In Policy name (Nome policy), inserisci LogAutoScalingEvent-policy. Scegli Create Policy (Crea policy).

Dopo aver creato la policy, puoi creare un ruolo che la utilizzi.

Come creare il ruolo
  1. Nel riquadro di navigazione sulla sinistra, scegliere Roles (Ruoli).

  2. Scegli Crea ruolo.

  3. In Seleziona tipo di entità attendibile, scegli Servizio AWS .

  4. Per il tuo caso d'uso, scegli Lambda quindi scegli Successivo.

  5. In Aggiungi autorizzazioni, scegli la politica che hai creato (LogAutoScalingEvent-policy) e la politica denominata. AWSLambdaBasicExecutionRole Quindi, seleziona Next (Successivo).

    Nota

    La AWSLambdaBasicExecutionRolepolicy dispone delle autorizzazioni necessarie alla funzione per scrivere i log in Logs. CloudWatch

  6. Nella pagina Nome, revisione e creazione, per Nome ruolo, inserisci LogAutoScalingEvent-role e scegli Crea ruolo.

Passaggio 2: creazione di una funzione Lambda

Crea una funzione Lambda affinché serva da destinazione per gli eventi. La funzione Lambda di esempio, scritta in Node.js, viene richiamata da EventBridge quando viene emesso un evento corrispondente da Amazon EC2 Auto Scaling.

Per creare una funzione Lambda
  1. Aprire la pagina Functions (Funzioni) nella console Lambda.

  2. Scegli Create function (Crea funzione) e Author from scratch (Crea da zero).

  3. In Basic information (Informazioni di base) , per Function name (Nome funzione) , inserisci LogAutoScalingEvent.

  4. Per Runtime, scegli Node.js 18.x.

  5. Scorri verso il basso e scegli Cambia ruolo di esecuzione predefinito e in Ruolo di esecuzione scegli Utilizza un ruolo esistente.

  6. Per Ruolo esistente, scegli -role. LogAutoScalingEvent

  7. Non modificare gli altri valori di default.

  8. Scegli Crea funzione. Verrai riportato alla configurazione e al codice della funzione.

  9. Con la funzione LogAutoScalingEvent ancora aperta nella console, in Codice della funzione, nell'editor, incolla il seguente codice di esempio nel file denominato index.mjs.

    import { AutoScalingClient, CompleteLifecycleActionCommand } from "@aws-sdk/client-auto-scaling"; export const handler = async(event) => { console.log('LogAutoScalingEvent'); console.log('Received event:', JSON.stringify(event, null, 2)); var autoscaling = new AutoScalingClient({ region: event.region }); var eventDetail = event.detail; var params = { AutoScalingGroupName: eventDetail['AutoScalingGroupName'], /* required */ LifecycleActionResult: 'CONTINUE', /* required */ LifecycleHookName: eventDetail['LifecycleHookName'], /* required */ InstanceId: eventDetail['EC2InstanceId'], LifecycleActionToken: eventDetail['LifecycleActionToken'] }; var response; const command = new CompleteLifecycleActionCommand(params); try { var data = await autoscaling.send(command); console.log(data); // successful response response = { statusCode: 200, body: JSON.stringify('SUCCESS'), }; } catch (err) { console.log(err, err.stack); // an error occurred response = { statusCode: 500, body: JSON.stringify('ERROR'), }; } return response; };

    Questo codice registra semplicemente l'evento in modo che, alla fine di questo tutorial, sia possibile vedere apparire un evento nel flusso di log CloudWatch Logs associato a questa funzione Lambda.

  10. Seleziona Deploy (Implementa).

Fase 3: Creare una regola EventBridge

Crea una EventBridge regola per eseguire la funzione Lambda. Per ulteriori informazioni sull'utilizzo EventBridge, consultaUtilizzato EventBridge per gestire gli eventi di Auto Scaling.

Creazione di una regola tramite la console
  1. Apri la EventBridge console.

  2. Nel pannello di navigazione, scegli Regole.

  3. Scegli Crea regola.

  4. Per Define rule detail (Definisci dettagli della regola), effettua le seguenti operazioni:

    1. Per Nome, immetti LogAutoScalingEvent-rule.

    2. Per Event bus (Bus di eventi), scegli default. Quando un Servizio AWS utente genera un evento, questo passa sempre al bus eventi predefinito del tuo account.

    3. Per Rule type (Tipo di regola), scegli Rule with an event pattern (Regola con un modello di eventi).

    4. Seleziona Successivo.

  5. Per Build event pattern (Crea modello di eventi), procedi come segue:

    1. Per Event source, scegli AWS eventi o eventi EventBridge partner.

    2. Scorri verso il basso fino a Modello di evento ed esegui le seguenti operazioni:

      1. In Event source (Origine eventi), selezionare Servizi AWS.

      2. Per Servizio AWS, scegli Auto Scaling (Scalabilità automatica).

      3. In Event Type (Tipo di evento), seleziona Instance Launch and Terminate (Avvio e arresto dell'istanza).

      4. Per impostazione predefinita, la regola corrisponde a qualsiasi evento di aumento o riduzione orizzontale. Per creare una regola che ti avvisa quando esiste un evento di dimensionamento e un'istanza viene messa in stato di attesa a causa di un hook del ciclo di vita, scegli Specific instance event(s) (Evento/i di istanza specifici) e seleziona EC2 Instance-launch Lifecycle Action (Operazione del ciclo di vita per l'avvio dell'istanza EC2).

      5. Per impostazione predefinita, la regola corrisponde a qualsiasi gruppo con scalabilità automatica nella Regione. Affinché la regola corrisponda a un gruppo con dimensionamento automatico specifico, seleziona Nomi gruppi specifici, quindi seleziona il gruppo.

      6. Seleziona Successivo.

  6. Per Select target(s) (Seleziona destinazione/i), esegui queste operazioni:

    1. Per Target types (Tipi di target), scegli Servizio AWS.

    2. Per Select a target (Seleziona destinazione), scegli Lambda function (Funzione Lambda).

    3. Per Funzione, scegli LogAutoScalingEvent.

    4. Scegliere Next (Successivo) due volte.

  7. Nella pagina Rivedi e crea, scegli Crea regola.

Passaggio 4: aggiunta di un hook del ciclo di vita

In questa sezione, si aggiunge un hook del ciclo di vita in modo che Lambda esegua la funzione sulle istanze al momento dell'avvio.

Per aggiungere un hook del ciclo di vita
  1. Apri la pagina Gruppi con dimensionamento automatico nella console Amazon EC2.

  2. Seleziona la casella di controllo accanto al gruppo con dimensionamento automatico. Si aprirà un riquadro diviso nella parte inferiore della pagina.

  3. Nel riquadro inferiore, nella scheda Instance management (Gestione istanze) in Lifecycle hooks (Hook del ciclo di vita), scegli Create lifecycle hook (Crea hook del ciclo di vita).

  4. Per definire un hook del ciclo di vita per il dimensionamento orizzontale (avvio delle istanze), procedi come descritto di seguito:

    1. In Lifecycle hook name (Nome hook del ciclo di vita), inserisciLogAutoScalingEvent-hook.

    2. In Lifecycle transition (Transizione ciclo di vita), scegli Instance launch (Avvia istanza).

    3. In Heartbeat timeout (Timeout heartbeat), inserisci 300 per il numero di secondi di attesa della richiamata dalla funzione Lambda.

    4. In Default result (Risultato di default), scegli ABANDON (ABBANDONA). Ciò significa che se l'hook va in timeout senza ricevere un callback dalla funzione Lambda, il gruppo con scalabilità automatica terminerà una nuova istanza.

    5. (Facoltativo) Lascia Notification metadata (Metadati delle notifiche) vuoto. I dati degli eventi a cui passiamo EventBridge contengono tutte le informazioni necessarie per richiamare la funzione Lambda.

  5. Scegli Crea.

Passaggio 5: test e verifica dell'evento

Per effettuare il test dell'evento, aggiorna il gruppo con scalabilità automatica aumentando di 1 la capacità desiderata del gruppo con scalabilità automatica. La funzione Lambda viene richiamata pochi secondi dopo aver aumentato la capacità desiderata.

Per aumentare le dimensioni del gruppo con dimensionamento automatico
  1. Apri la pagina Gruppi con dimensionamento automatico nella console Amazon EC2.

  2. Seleziona la casella di controllo accanto al gruppo con scalabilità automatica per visualizzare i dettagli in un riquadro inferiore e visualizzare ancora le righe superiori del riquadro superiore.

  3. Nel riquadro inferiore, nella scheda Details (Dettagli) scegli Group details (Dettagli gruppo), Edit (Modifica).

  4. Per Desired capacity (Capacità desiderata), aumentare il valore corrente di 1.

  5. Scegli Aggiorna. Durante l'avvio o la terminazione di un'istanza, la colonna Status (Stato) visualizza lo stato Updating capacity (Aggiornamento della capacità.

Dopo avere aumentato la capacità desiderata, potrai verificare che la funzione Lambda è stata invocata.

Per visualizzare l'output della funzione Lambda
  1. Apri la pagina Log groups della CloudWatch console.

  2. Seleziona il nome del gruppo di log per la funzione Lambda (/aws/lambda/LogAutoScalingEvent).

  3. Seleziona il nome del flusso di log per visualizzare i dati forniti dalla funzione per l'istanza avviata.

Successivamente, è possibile verificare che l'istanza sia stata avviata correttamente dalla descrizione delle attività di dimensionamento.

Come visualizzare le attività di dimensionamento
  1. Dalla pagina Auto Scaling groups (Gruppi Auto Scaling), seleziona il gruppo.

  2. Nella scheda Activity (Attività) in Activity history (Cronologia attività), la colonna Status (Stato) indica se il gruppo con scalabilità automatica ha avviato correttamente le istanze.

    • Se l'azione ha avuto esito positivo, l'attività di dimensionamento avrà lo stato "Successful" (Riuscito).

    • In caso di errore, dopo aver atteso alcuni minuti, verrà visualizzata un'attività di dimensionamento con lo stato "Cancelled" (Annullato) e un messaggio di stato "Instance failed to complete user's Lifecycle Action: Lifecycle Action with token e85eb647-4fe0-4909-b341-a6c42EXAMPLE was abandoned: Lifecycle Action Completed with ABANDON Result". (Istanza non riuscita a completare l'azione ciclo di vita dell'utente: Azione ciclo di vita con token e85eb647-4fe0-4909-b341-a6c42EXAMPLE abbandonato: Azione ciclo di vita completata con risultato ABANDON).

Come ridurre le dimensioni del gruppo con scalabilità automatica

Se l'istanza aggiuntiva avviata per questo test non è necessaria, è possibile aprire la scheda Details (Dettagli) e ridurre di 1 il valore di Desired capacity (Capacità desiderata).

Fase 6: pulizia

Se hai finito di utilizzare le risorse create appositamente per l'esercitazione, segui la procedura seguente per eliminarle.

Come eliminare l'hook del ciclo di vita
  1. Apri la pagina Gruppi con dimensionamento automatico nella console Amazon EC2.

  2. Seleziona la casella di controllo accanto al gruppo con dimensionamento automatico.

  3. Nella scheda Instance management (Gestione istanze) in Lifecycle hooks (Hook del ciclo di vita), scegli Create lifecycle hook (Crea hook del ciclo di vita)(LogAutoScalingEvent-hook).

  4. Scegli Actions (Operazioni), Delete (Elimina).

  5. Per confermare, scegli di nuovo Delete (Elimina).

Per eliminare la EventBridge regola Amazon
  1. Apri la pagina delle regole nella EventBridge console Amazon.

  2. In Event bus (Bus di eventi), seleziona il bus di eventi associato alla regola (Default).

  3. Seleziona la casella di controllo accanto alla regola (LogAutoScalingEvent-rule).

  4. Scegli Elimina.

  5. Quando viene richiesta la conferma, digita il nome della regola e scegli Delete (Elimina).

Se hai finito di lavorare con la funzione di esempio, eliminala. È inoltre possibile eliminare il gruppo di log che memorizza i registri della funzione e il ruolo di esecuzione e la policy delle autorizzazioni creati dalla console.

Come eliminare una funzione Lambda
  1. Aprire la pagina Functions (Funzioni) nella console Lambda.

  2. Scegli la funzione (LogAutoScalingEvent).

  3. Scegli Operazioni > Elimina.

  4. Quando viene richiesta la conferma, digita delete per confermare l'eliminazione della funzione specificata e scegli Delete (Elimina).

Come eliminare il gruppo di log
  1. Apri la pagina Log groups della CloudWatch console.

  2. Scegli il gruppo di log della funzione (/aws/lambda/LogAutoScalingEvent).

  3. Scegli Actions (Azioni), Delete log group(s) (Elimina gruppo/i di log).

  4. Nella finestra di dialogo Delete log group(s) (Elimina gruppo/i di log) scegli Delete (Elimina).

Come eliminare il ruolo di esecuzione
  1. Apri la pagina Roles (Ruoli) della console IAM.

  2. Seleziona il ruolo della funzione (LogAutoScalingEvent-role).

  3. Scegli Elimina.

  4. Quando viene richiesta la conferma, digita il nome del ruolo e scegli Delete (Elimina).

Come eliminare la policy IAM
  1. Apri la pagina Policies (Policy) nella console IAM.

  2. Seleziona la policy creata (LogAutoScalingEvent-policy).

  3. Scegli Operazioni > Elimina.

  4. Quando viene richiesta la conferma, digita il nome della policy e scegli Delete (Elimina).

I seguenti argomenti correlati possono essere utili per creare EventBridge regole basate sugli eventi che si verificano alle istanze del gruppo Auto Scaling.

Per un tutorial che illustra come utilizzare il servizio di metadati di istanza (IMDS) per richiamare un'azione dall'interno dell'istanza stessa, consulta Tutorial: utilizza lo script di dati e i metadati dell'istanza per recuperare lo stato del ciclo di vita.