Manejar el tiempo de espera de API Gateway cuando la función Lamda requiere más de 30 segundos para completarse
¡Necesito tu ayuda! Desde API Gateway, intento activar una función Lambda. Esta función de Lambda creará una pila de CloudFormation y la pila, a su vez, implementará una instancia de EC2. A continuación se muestra parte del código que inicia la creación de la pila y espera a que el estado de creación de la pila se configure para completarse antes de que pueda devolver una respuesta. La cuestión es que API Gateway tiene un valor de tiempo de espera codificado de forma rígida de 30 segundos y la creación de la pila no se completa antes de los 30 segundos. En este escenario, la solicitud de la API simplemente agota el tiempo de espera y devuelve un error interno del servidor. ¿Cómo manejo esto?
# 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
}
)
Respuestas
Tal vez, en lugar de que Lambda cree directamente la pila de CloudFormation, podría activar una función de paso con una función de Lambda únicamente para crear las pilas de CloudFormation. La función original podría devolver la identificación de ejecución cuando regresa después de ejecutar la función start_execution .
Esto tiene 2 beneficios, el primero es que será mucho más rápido (una vez que la ejecución de la función de paso ha comenzado, el SDK devuelve una respuesta para que sea más rápido), además de ser resistente a fallas (tiene la opción de reintentar o notificar errores).
Alternativamente, si desea que la solicitud en sí misma haga esto dentro de la solicitud HTTP del cliente, deberá buscar un ALB que entregue el tráfico a su Lambda en lugar de API Gateway (que tiene un límite máximo). Un ALB puede admitir un tiempo de espera más largo de hasta 4000 segundos .