Gérer le délai d'expiration de la passerelle API lorsque la fonction Lamda nécessite plus de 30 secondes pour se terminer

Aug 16 2020

Besoin de votre aide! Depuis la passerelle API, j'essaie de déclencher une fonction Lambda. Cette fonction Lambda va créer une pile CloudFormation et la pile va à son tour déployer une instance EC2. Vous trouverez ci-dessous une partie du code qui lance la création de la pile et attend que l'état de création de la pile soit défini sur terminé avant de pouvoir renvoyer une réponse. La chose est API Gateway a une valeur de délai d'attente codée en dur de 30 secondes et la création de la pile ne se termine pas avant 30 secondes. Dans ce scénario, la demande d'API expire juste en renvoyant une erreur de serveur interne. Comment gérer cela ?

# 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
    }
)

Réponses

ChrisWilliams Aug 16 2020 at 19:04

Peut-être qu'au lieu que Lambda crée directement la pile CloudFormation, il pourrait déclencher une fonction d'étape avec une fonction Lambda uniquement pour créer les piles CloudFormation. La fonction d'origine peut renvoyer l'ID d'exécution lorsqu'elle revient après avoir exécuté la fonction start_execution .

Cela présente 2 avantages, le premier est qu'il sera beaucoup plus rapide (une fois que l'exécution de la fonction d'étape a commencé, une réponse est renvoyée par le SDK, ce sera donc plus rapide), tout en étant résistant à l'échec (vous avez la possibilité de réessayer ou signaler les erreurs).

Sinon, si vous souhaitez que la demande elle-même le fasse dans la demande HTTP du client, vous devez examiner un ALB servant le trafic vers votre Lambda plutôt que API Gateway (qui a une coupure maximale). Un ALB peut prendre en charge un délai d'attente plus long allant jusqu'à 4 000 secondes .