Обработка тайм-аута шлюза API, когда для выполнения функции Lamda требуется более 30 секунд
Нужна ваша помощь! Из шлюза API я пытаюсь запустить лямбда-функцию. Эта функция Lambda собирается создать стек CloudFormation, а стек, в свою очередь, развернет экземпляр EC2. Ниже приведена часть кода, который инициирует создание стека и ожидает, пока будет установлен статус создания стека, прежде чем он сможет вернуть ответ. Дело в том, что API Gateway имеет жестко запрограммированное значение тайм-аута 30 секунд, а создание стека не завершается раньше, чем через 30 секунд. В этом сценарии запрос API просто истекает, возвращая внутреннюю ошибку сервера. Как мне с этим справиться?
# 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
}
)
Ответы
Возможно, вместо того, чтобы напрямую создавать стек CloudFormation, он мог бы запускать пошаговую функцию с функцией Lambda исключительно для создания стеков CloudFormation. Исходная функция могла возвращать идентификатор выполнения, когда она возвращается после выполнения функции start_execution .
Это дает два преимущества: первое заключается в том, что это будет намного быстрее (как только выполнение пошаговой функции начнется, ответ возвращается обратно SDK, поэтому это будет быстрее), а также устойчивость к сбоям (у вас есть возможность повторить попытку или уведомить об ошибках).
В качестве альтернативы, если вы хотите, чтобы сам запрос выполнял это в HTTP-запросе от клиента, вам нужно будет посмотреть на ALB, обслуживающий трафик для вашей Lambda, а не на шлюз API (который имеет максимальное ограничение). ALB может поддерживать более длительный тайм-аут до 4000 секунд .