Creare una policy di terminazione personalizzata con 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à.

Creare una policy di terminazione personalizzata con Lambda.

Amazon EC2 Auto Scaling utilizza le politiche di terminazione per stabilire la priorità delle istanze da terminare per prime quando si riducono le dimensioni del gruppo Auto Scaling (denominato scaling in). Il gruppo con scalabilità automatica utilizza una policy di terminazione di default, ma è possibile scegliere o creare policy di terminazione personalizzate. Per ulteriori informazioni su come scegliere una policy di terminazione di default, consulta Configura le politiche di terminazione per Amazon EC2 Auto Scaling.

In questo argomento, imparerai come creare una politica di terminazione personalizzata utilizzando una AWS Lambda funzione richiamata da Amazon EC2 Auto Scaling in risposta a determinati eventi. La funzione Lambda che crei elabora le informazioni nei dati di input inviati da Amazon Auto EC2 Scaling e restituisce un elenco di istanze pronte a terminare.

Una policy di terminazione personalizzata fornisce un controllo migliore su quali istanze vengono terminate e quando. Ad esempio, quando il gruppo Auto Scaling aumenta, Amazon EC2 Auto Scaling non è in grado di determinare se ci sono carichi di lavoro in esecuzione che non devono essere interrotti. Con una funzione Lambda, puoi convalidare la richiesta di terminazione e attendere il completamento del carico di lavoro prima di restituire l'ID dell'istanza ad Amazon Auto EC2 Scaling per la terminazione.

Dati di input

Amazon EC2 Auto Scaling genera un JSON payload per la scalabilità negli eventi e lo fa anche quando le istanze stanno per essere terminate a causa della durata massima dell'istanza o delle funzionalità di aggiornamento dell'istanza. Genera inoltre un JSON payload per la scalabilità degli eventi che può avviare quando ribilancia il gruppo tra le zone di disponibilità.

Questo payload contiene informazioni sulla capacità di cui Amazon EC2 Auto Scaling ha bisogno per terminare, un elenco di istanze suggerite per la chiusura e l'evento che ha avviato la chiusura.

Di seguito è riportato un esempio di payload:

{ "AutoScalingGroupARN": "arn:aws:autoscaling:us-east-1:<account-id>:autoScalingGroup:d4738357-2d40-4038-ae7e-b00ae0227003:autoScalingGroupName/my-asg", "AutoScalingGroupName": "my-asg", "CapacityToTerminate": [ { "AvailabilityZone": "us-east-1b", "Capacity": 2, "InstanceMarketOption": "on-demand" }, { "AvailabilityZone": "us-east-1b", "Capacity": 1, "InstanceMarketOption": "spot" }, { "AvailabilityZone": "us-east-1c", "Capacity": 3, "InstanceMarketOption": "on-demand" } ], "Instances": [ { "AvailabilityZone": "us-east-1b", "InstanceId": "i-0056faf8da3e1f75d", "InstanceType": "t2.nano", "InstanceMarketOption": "on-demand" }, { "AvailabilityZone": "us-east-1c", "InstanceId": "i-02e1c69383a3ed501", "InstanceType": "t2.nano", "InstanceMarketOption": "on-demand" }, { "AvailabilityZone": "us-east-1c", "InstanceId": "i-036bc44b6092c01c7", "InstanceType": "t2.nano", "InstanceMarketOption": "on-demand" }, ... ], "Cause": "SCALE_IN" }

Il payload include il nome del gruppo Auto Scaling, il relativo Amazon Resource Name ARN () e i seguenti elementi:

  • CapacityToTerminate descrive la quantità di capacità Spot o on demand impostata per la terminazione in una determinata zona di disponibilità.

  • Instancesrappresenta le istanze suggerite da Amazon EC2 Auto Scaling per la chiusura in base alle informazioni contenute. CapacityToTerminate

  • Cause descrive l'evento che ha attivato la terminazione: SCALE_IN, INSTANCE_REFRESH, MAX_INSTANCE_LIFETIME oppure REBALANCE.

Le seguenti informazioni descrivono i fattori più importanti nel modo in cui Amazon EC2 Auto Scaling genera Instances i dati di input:

  • Il mantenimento dell'equilibrio tra le zone di disponibilità ha la precedenza quando un'istanza viene interrotta a causa della scalabilità degli eventi e delle terminazioni basate sull'aggiornamento delle istanze. Di conseguenza, se una zona di disponibilità ha più istanze delle altre zone di disponibilità usate dal gruppo, i dati di input contengono istanze che sono ammissibili per la terminazione solo dalla zona di disponibilità sbilanciata. Se le zone di disponibilità utilizzate dal gruppo sono bilanciate, i dati di input contengono istanze provenienti da tutte le zone di disponibilità del gruppo.

  • Quando utilizzi una mixed instances policy (policy istanze miste), anche mantenere le capacità Spot e on demand bilanciate in base alle percentuali desiderate per ogni opzione di acquisto ha la precedenza. Innanzitutto identifichiamo quale dei due tipi (Spot o on demand) dovrebbe essere terminato. Inoltre, individua quali istanze (all'interno dell'opzione di acquisto identificata) terminare e in quali zone di disponibilità, in modo che risultino in un maggior bilanciamento delle zone di disponibilità.

Dati di risposta

I dati di input e i dati di risposta collaborano per restringere l'elenco delle istanze da terminare.

Con l'input fornito, la risposta dalla funzione Lambda dovrebbe essere simile al seguente esempio:

{ "InstanceIDs": [ "i-02e1c69383a3ed501", "i-036bc44b6092c01c7", ... ] }

Gli InstanceIDs nella risposta rappresentano le istanze pronte per la terminazione.

In alternativa, è possibile restituire un set diverso di istanze pronte per la terminazione, che sovrascrive le istanze nei dati di input. Se quando viene richiamata la funzione Lambda nessuna istanza è pronta per la terminazione, è anche possibile scegliere di non restituire alcuna istanza.

Se nessuna istanza è pronta per la terminazione, la risposta dalla funzione Lambda dovrebbe essere simile alla seguente:

{ "InstanceIDs": [ ] }

Considerazioni

Quando usi una policy di terminazione personalizzata, tieni presente quanto segue:

  • La restituzione di un'istanza per prima, nei dati di risposta, non ne garantisce la terminazione. Se viene restituito un numero di istanze superiore a quello richiesto quando viene richiamata la funzione Lambda, Amazon EC2 Auto Scaling valuta ogni istanza rispetto alle altre politiche di terminazione specificate per il gruppo Auto Scaling. Quando sono presenti più policy di terminazione, tenta di applicare quella successiva nell'elenco e, se ci sono più istanze per la terminazione di quante ne siano necessarie, passa alla policy successiva, e così via. Se non vengono specificate altre policy di terminazione, per determinare quali istanze terminare, viene impiegata quella di default.

  • Se non viene restituita alcuna istanza o la funzione Lambda scade, Amazon Auto EC2 Scaling attende qualche istante prima di richiamare nuovamente la funzione. In ogni caso, per qualsiasi scala, continua a provare finché la capacità desiderata del gruppo è inferiore alla sua capacità attuale. Ad esempio, per terminazioni basate su aggiornamento, continua a provare per un'ora. Successivamente, se continua a non riuscire a terminare alcuna istanza, l'operazione di aggiornamento non riesce. Con la durata massima dell'istanza, Amazon EC2 Auto Scaling continua a cercare di terminare l'istanza identificata come eccedente la sua durata massima.

  • Poiché la funzione viene riprovata ripetutamente, assicurati di testare e correggere eventuali errori permanenti nel codice, prima di utilizzare una funzione Lambda come policy di terminazione personalizzata.

  • Se sostituisci i dati di input con il tuo elenco di istanze da terminare e la chiusura di queste istanze comporta uno squilibrio delle zone di disponibilità, Amazon Auto Scaling ribilancia gradualmente la distribuzione della EC2 capacità tra le zone di disponibilità. Innanzitutto, richiama la funzione Lambda per vedere se ci siano istanze pronte per la terminazione, in modo da determinare se iniziare il ribilanciamento. Se ci sono istanze pronte per essere terminate, avvia prima quelle nuove. Al termine dell'avvio delle istanze, rileva che la capacità attuale del gruppo è superiore alla capacità desiderata e avvia una scalabilità in caso di evento.

  • Una politica di terminazione personalizzata non influisce sulla possibilità di utilizzare anche la scalabilità nella protezione per proteggere determinate istanze dalla chiusura. Per ulteriori informazioni, consulta Usa la protezione scalabile in base alle istanze per controllare la terminazione dell'istanza.

Creazione della funzione Lambda

Inizia creando la funzione Lambda, in modo da poterne specificare Amazon Resource Name (ARN) nelle politiche di terminazione per il tuo gruppo Auto Scaling.

Creazione di una funzione Lambda (console)
  1. Aprire la pagina Functions (Funzioni) nella console Lambda.

  2. Sulla barra di navigazione nella parte superiore della schermata, seleziona la stessa Regione utilizzata durante la creazione del gruppo con dimensionamento automatico.

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

  4. In Basic information (Informazioni di base), inserisci un nome per la funzione in Function name (Nome funzione).

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

  6. Con la funzione aperta nella console, in Function code (Codice della funzione), incolla il codice nell'editor.

  7. Seleziona Deploy (Implementa).

  8. Facoltativamente, crea una versione pubblicata della funzione Lambda scegliendo la scheda Versions (Versioni)Scheda e quindi Publish new version (Pubblica nuova versione). Per ulteriori informazioni sul controllo delle versioni in Lambda, consulta Versioni delle funzioni Lambda nella Guida per gli sviluppatori di AWS Lambda .

  9. Se hai scelto di pubblicare una versione e desideri associare un alias a questa versione della funzione Lambda, scegli la scheda Aliases (Alias). Per ulteriori informazioni sugli alias in Lambda, consulta Alias delle funzioni Lambda nella Guida per gli sviluppatori di AWS Lambda

  10. Quindi, seleziona la scheda Configuration (Configurazione) e poi Permissions (Autorizzazioni).

  11. Scorri fino a Resource-based policy (Policy basata su risorse), quindi, scegli Add permissions (Aggiungi autorizzazioni). Le policy basate su risorse vengono impiegate per concedere le autorizzazioni per richiamare la funzione al principale specificato nelle policy stesse. In questo caso, il ruolo principale sarà il ruolo collegato al servizio Amazon EC2 Auto Scaling associato al gruppo Auto Scaling.

  12. Nella sezione Policy statement (Istruzione della policy), configura le autorizzazioni:

    1. Scegli Account AWS.

    2. Per Principal, inserisci il ARN ruolo collegato al servizio chiamante, ad esempio. arn:aws:iam::<aws-account-id>:role/aws-service-role/autoscaling.amazonaws.com/AWSServiceRoleForAutoScaling

    3. Per Azione, scegli lambda:. InvokeFunction

    4. In Statement ID (ID istruzione), inserisci un ID di istruzione univoco, ad esempio AllowInvokeByAutoScaling.

    5. Seleziona Salva.

  13. Dopo aver seguito queste istruzioni, continua a specificare la tua funzione nelle politiche ARN di cessazione del tuo gruppo Auto Scaling come passaggio successivo. Per ulteriori informazioni, consulta Modificare la politica di terminazione per un gruppo Auto Scaling.

Nota

Per esempi da utilizzare come riferimento per lo sviluppo della funzione Lambda, consulta il GitHub repository per Amazon Auto EC2 Scaling.

Limitazioni

  • Nelle policy di terminazione per un gruppo con scalabilità automatica è possibile specificare una sola funzione Lambda. Se sono specificate più policy di terminazione, è necessario specificare prima la funzione Lambda.

  • Puoi fare riferimento alla tua funzione Lambda utilizzando una funzione non qualificata ARN (senza suffisso) o ARN qualificata con una versione o un alias come suffisso. Se ARN viene utilizzata una non qualificata (ad esempio,function:my-function), la politica basata sulle risorse deve essere creata sulla versione non pubblicata della funzione. Se ARN viene utilizzato un qualificato (ad esempio, function:my-function:1 ofunction:my-function:prod), la politica basata sulle risorse deve essere creata su quella specifica versione pubblicata della funzione.

  • Non è possibile utilizzare un qualificato ARN con il suffisso. $LATEST Se si tenta di aggiungere una politica di terminazione personalizzata che fa riferimento a un qualificato ARN con il $LATEST suffisso, verrà generato un errore.

  • Il numero di istanze fornite nei dati di input è limitato a 30.000 istanze. Se sono presenti più di 30.000 istanze che potrebbero essere terminate, i dati di input includono "HasMoreInstances": true per indicare che viene restituito il numero massimo di istanze.

  • Il runtime massimo per la funzione Lambda è di due secondi (2000 millisecondi). La best practice è impostare il valore di timeout della funzione Lambda in base al runtime previsto. Le funzioni Lambda hanno un timeout di default di tre secondi, ma quest'ultimo può essere ridotto.

  • Se il runtime supera il limite di 2 secondi, qualsiasi scala in azione verrà sospesa fino a quando il tempo di esecuzione non scende al di sotto di questa soglia. Per le funzioni Lambda con tempi di esecuzione costantemente più lunghi, trova un modo per ridurre il tempo di esecuzione, ad esempio memorizzando nella cache i risultati in modo che possano essere recuperati durante le successive chiamate Lambda.