Creare una policy di terminazione personalizzata con Lambda. - Dimensionamento automatico Amazon EC2

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.

Dimensionamento automatico Amazon EC2 utilizza le policy di terminazione per assegnare la priorità alle istanze da terminare per prime quando si riducono le dimensioni del gruppo con scalabilità automatica (indicato come scaling in (riduzione orizzontale). 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 Configurazione delle politiche di terminazione per Amazon EC2 Auto Scaling.

In questa sezione viene descritto come creare una policy di terminazione personalizzata utilizzando una funzione AWS Lambda , che Dimensionamento automatico Amazon EC2 richiama in risposta a determinati eventi. La funzione Lambda creata elabora le informazioni nei dati di input inviati da Dimensionamento automatico Amazon EC2 e restituisce un elenco di istanze pronte per la terminazione.

Una policy di terminazione personalizzata fornisce un controllo migliore su quali istanze vengono terminate e quando. Ad esempio, quando il gruppo con scalabilità automatica viene ridotto, Dimensionamento automatico Amazon EC2 non è in grado di determinare se siano in esecuzione carichi di lavoro che non devono essere interrotti. Con una funzione Lambda, puoi convalidare la richiesta di terminazione e attendere che il carico di lavoro venga completato, prima di restituire l'ID istanza a Dimensionamento automatico Amazon EC2 per la terminazione.

Dati di input

Amazon EC2 Auto Scaling genera un payload JSON 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 payload JSON per la scalabilità degli eventi che può avviare quando ribilancia il gruppo tra le zone di disponibilità.

Questo payload contiene informazioni sulla capacità che Dimensionamento automatico Amazon EC2 deve terminare, un elenco di istanze suggerite per la terminazione e l'evento che l'ha avviata.

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 con scalabilità automatica, 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à.

  • Instances rappresenta le istanze suggerite da Dimensionamento automatico Amazon EC2 per la terminazione in base alle informazioni contenute in CapacityToTerminate.

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

Le seguenti informazioni delineano i fattori più significativi nel modo in cui Dimensionamento automatico Amazon EC2 genera le Instancesnei 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 quando viene richiamata la funzione Lambda viene restituita una quantità superiore al numero richiesto di istanze, Dimensionamento automatico Amazon EC2 valuta ogni istanza rispetto alle altre policy di terminazione specificate per il gruppo con scalabilità automatica. 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 vengono restituite istanze o la funzione Lambda scade, Dimensionamento automatico Amazon EC2 attende per un breve periodo, prima di richiamare nuovamente la funzione. In ogni caso, su qualsiasi scala, continua a provare finché la capacità desiderata del gruppo è inferiore a quella 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, Dimensionamento automatico Amazon EC2 continua a tentare di terminare l'istanza identificata come eccedente la 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 terminazione di queste istanze sbilancia le zone di disponibilità, Dimensionamento automatico Amazon EC2 ribilancia gradualmente la distribuzione della 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 poter specificare il relativo Amazon Resource Name (ARN) nelle policy di terminazione per il tuo gruppo con scalabilità automatica.

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 principale sarà il Dimensionamento automatico Amazon EC2 service-linked role (Ruolo Dimensionamento automatico Amazon EC2 collegato ai servizi) associato al gruppo con scalabilità automatica.

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

    1. Scegli Account AWS.

    2. In (Principal (Principale), inserisci l'ARN del ruolo collegato ai servizi chiamanti, ad esempio arn:aws:iam::<aws-account-id>:role/aws-service-role/autoscaling.amazonaws.com/AWSServiceRoleForAutoScaling.

    3. Per Action, scegli lambda:. InvokeFunction

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

    5. Selezionare Salva.

  13. Dopo aver seguito queste istruzioni, continua specificando l'ARN della tua funzione nelle policy di terminazione per il tuo gruppo con scalabilità automatica. 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 EC2 Auto 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.

  • È possibile fare riferimento alla funzione Lambda utilizzando un ARN non qualificato (senza suffisso) o un ARN qualificato che abbia una versione o un alias come suffisso. Se utilizzi un ARN non qualificato (ad esempio, function:my-function), la policy basata su risorse deve essere creata sulla versione non pubblicata della funzione. Se utilizzi un ARN qualificato (ad esempio, function:my-function:1 or function:my-function:prod), la policy basata su risorse deve essere creata su quella specifica versione pubblicata della funzione.

  • Non è possibile utilizzare un ARN qualificato con il suffisso $LATEST. Se tenti di aggiungere una policy di terminazione personalizzata che si riferisce a un ARN qualificato con il suffisso $LATEST, ciò risulterà in 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 rimarrà 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.