Come posso far funzionare correttamente la mia funzione Lambda con l'istanza Amazon EC2 o con AWS Instance Scheduler?

Ultimo aggiornamento: 09/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 questo problema, completa i passaggi descritti nella sezione Come impedire i timeout delle funzioni.
  • Una regola di Amazon EventBridge non si è avviata. Per risolvere il problema, completa i passaggi descritti nella sezione Verifica 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 i passaggi descritti nella sezione Prevenire gli errori utilizzando l'idempotenza.

Nota: AWS Instance Scheduler esegue funzioni Lambda a intervalli prestabiliti utilizzando una regola EventBridge per pianificare la funzione Lambda. Ciò si traduce in una invocazione asincrona della funzione Lambda, che ha un impatto sul modo in cui vengono gestiti gli errori della funzione. Se la funzione non riesce a causa di un errore durante l'esecuzione, per impostazione predefinita, lo stesso evento viene ripetuto un massimo di due volte. Dopodiché viene rimosso. Se si verificano limitazioni, l'evento può essere messo in coda per un massimo di sei ore prima di essere 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)

Come 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 riesco ad avviare la mia 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) è maggiore del timeout configurato per la funzione. Per risolvere questo problema, aumenta il valore di 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.

Verificare che la regola pianificata sia stata richiamata

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

Prevenire la limitazione della funzione

Per prevenire la limitazione della funzione, consulta Come posso risolvere problemi di limitazione della funzione Lambda con 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 prima di essere richiamate vengono inviate a una coda di eventi. Se anche un'altra funzione ha ricevuto un numero elevato di invocazioni asincrone, la coda degli eventi può restare in backlog. 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?