Come posso fare sì che la mia funzione Lambda funzioni correttamente con la mia istanza Amazon EC2 o con AWS Instance Scheduler?

Ultimo aggiornamento: 08/09/2021

Utilizzo un'istanza Amazon Elastic Compute Cloud (Amazon EC2) o AWS Instance Scheduler con una funzione AWS Lambda. Ma la mia funzione Lambda raggiunge il timeout, non viene richiamata o genera errori.

Breve descrizione

AWS Instance Scheduler può causare il funzionamento errato della funzione Lambda per i seguenti motivi:

  • Hai raggiunto il timeout dell'SDK. Per risolvere il problema, completa la procedura descritta nella sezione Correzione dei timeout dell'SDK.
  • Hai raggiunto il timeout della funzione. Per risolvere il problema, completa la procedura descritta nella sezione Impedire i timeout delle funzioni.
  • Non è stata attivata una regola di Amazon CloudWatch Events. Per risolvere il problema, completa la procedura descritta nella sezione Verificare che la regola pianificata sia stata richiamata.
  • Si è verificato il throttling della funzione. Per risolvere il problema, completa la procedura descritta nella sezione Impedire il throttling della funzione.
  • Hai invocazioni Lambda duplicate. Per risolvere il problema, completa la procedura descritta nella sezione Impedire gli errori utilizzando l'idempotenza.

Nota: AWS Instance Scheduler esegue funzioni Lambda a intervalli prestabiliti utilizzando una regola CloudWatch Events per pianificare la funzione Lambda. Ciò si traduce in un'invocazione asincrona della funzione Lambda, che ha un impatto sul modo in cui vengono gestiti gli errori di funzione. Se la funzione fallisce a causa di un errore durante l'esecuzione, lo stesso evento viene ripetuto fino a due volte per impostazione predefinita. Quindi, l'evento viene rimosso. In caso di throttling, l'evento può essere messo in coda per un massimo di sei ore prima che venga rimosso.

Risoluzione

Correzione dei timeout dell'SDK

Il timeout predefinito dell'SDK non viene sovrascritto nelle versioni precedenti di AWS Instance Scheduler. Se la chiamata API per l'avvio o l'arresto di un'istanza richiede più di 60 secondi per rispondere nelle versioni precedenti, la richiesta raggiunge il timeout.

Per risolvere questo problema, scarica la versione più recente di AWS Instance Scheduler o modifica il valore read_timeout dell'oggetto Config di Boto3 (sul sito Web Boto3). Ad esempio:

import boto3
from botocore.config import Config

client_config = Config(read_timeout=890)

ec2 = boto3.client('ec2', config=client_config)

Impedire i timeout delle funzioni

Se la funzione Lambda ha raggiunto il timeout, controlla se la funzione è in attesa di verificare che l'istanza EC2 sia stata avviata. Per ulteriori informazioni, consulta Perché non è possibile avviare l'istanza EC2?

Le istanze possono richiedere alcuni minuti per raggiungere lo stato RUNNING (IN ESECUZIONE). La funzione può raggiungere il timeout se il tempo necessario per raggiungere lo stato RUNNING (IN ESECUZIONE) è più lungo del timeout configurato per la funzione. Per risolvere questo problema, aumenta il timeout per la tua funzione modificando il valore Timeout di 300 (5 minuti) nel modello di AWS CloudFormation. Devi disporre di tempo sufficiente per l'avvio dell'istanza prima del timeout della funzione. Ad esempio:

"Runtime": "python3.7",
"Timeout": 300,
"TracingConfig": {
    "Mode": "Active"
}

Nota: le funzioni Lambda hanno un valore di timeout massimo configurabile di 15 minuti.

Se la funzione è in un cloud privato virtuale, devi consentire alla funzione di accedere a Internet per effettuare chiamate all'API Amazon EC2.

Verifica che la regola pianificata sia stata richiamata

Per risolvere i problemi relativi a una funzione Lambda che non viene richiamata da CloudWatch Events, consulta Perché la funzione Lambda non è stata avviata dalla mia regola CloudWatch Events?

Impedire il throttling della funzione

Per impedire il throttling della funzione, consulta Come posso risolvere i problemi di throttling della funzione Lambda con gli errori "Rate exceeded" e 429 "TooManyRequestsException"?

Per le invocazioni asincrone, le esecuzioni di throttling di Lambda sul tuo account possono influire sulla capacità di richiamare la funzione. Tutte le invocazioni asincrone vengono inviate a una coda di eventi prima di essere richiamate. Se anche un'altra funzione ha ricevuto un numero elevato di invocazioni asincrone, la coda degli eventi può restare in arretrato. Questo backlog non significa che il richiamo della tua funzione non sia riuscito. Questo backlog significa che l'evento è stato ritardato. Puoi visualizzare più invocazioni dopo che il backlog della coda degli eventi è stato eliminato. Per impostazione predefinita, gli eventi nella coda di eventi asincroni rimangono nella coda di eventi asincroni per un massimo di sei ore.

Impedire gli errori utilizzando l'idempotenza

Per evitare errori da invocazioni duplicate, rendi la tua funzione Lambda idempotente quando è configurata con un'invocazione asincrona.

Ricorda che le invocazioni Lambda asincrone possono verificarsi più di una volta a causa della consistenza finale con la coda di eventi.


Questo articolo è stato utile?


Hai bisogno di supporto tecnico o per la fatturazione?