Gestisci il timeout del gateway API quando la funzione Lamda richiede più di 30 secondi per essere completata

Aug 16 2020

Bisogno del tuo aiuto! Dall'API Gateway, sto cercando di attivare una funzione Lambda. Questa funzione Lambda creerà uno stack CloudFormation e lo stack a sua volta distribuirà un'istanza EC2. Di seguito è riportata una parte del codice che avvia la creazione dello stack e attende che lo stato di creazione dello stack sia impostato per il completamento prima di poter restituire una risposta. Il fatto è che API Gateway ha un valore di timeout hardcoded di 30 secondi e la creazione dello stack non viene completata prima di 30 secondi. In questo scenario, la richiesta API va in timeout e restituisce un errore interno del server. Come gestisco questo?

# Create the CloudFormation Stack
StackID = cf_client.create_stack(
    StackName=stackname,
    TemplateURL='https://s3-bucket/template1.template',
    Capabilities=['CAPABILITY_NAMED_IAM']
)
waiter = cf_client.get_waiter('stack_create_complete')
waiter.wait(
    StackName=stackname,
    WaiterConfig={
        'Delay' : 5,
        'MaxAttempts' : 50
    }
)

Risposte

ChrisWilliams Aug 16 2020 at 19:04

Forse invece di Lambda che crea direttamente lo stack CloudFormation, potrebbe attivare una funzione passo con una funzione Lambda esclusivamente per creare gli stack CloudFormation. La funzione originale potrebbe restituire l'id di esecuzione quando ritorna dopo aver eseguito la funzione start_execution .

Questo ha 2 vantaggi, il primo è che sarà molto più veloce (una volta che l'esecuzione della funzione passo è iniziata, l'SDK restituisce una risposta, quindi sarà più veloce), oltre ad essere resiliente al fallimento (hai la possibilità di riprovare o notificare gli errori).

In alternativa, se desideri che la richiesta stessa esegua questa operazione all'interno della richiesta HTTP dal client, dovresti esaminare un ALB che serve il traffico al tuo Lambda anziché API Gateway (che ha un limite massimo). Un ALB può supportare un timeout più lungo fino a 4000 secondi .