Обработка тайм-аута шлюза API, когда для выполнения функции Lamda требуется более 30 секунд

Aug 16 2020

Нужна ваша помощь! Из шлюза 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
    }
)

Ответы

ChrisWilliams Aug 16 2020 at 19:04

Возможно, вместо того, чтобы напрямую создавать стек CloudFormation, он мог бы запускать пошаговую функцию с функцией Lambda исключительно для создания стеков CloudFormation. Исходная функция могла возвращать идентификатор выполнения, когда она возвращается после выполнения функции start_execution .

Это дает два преимущества: первое заключается в том, что это будет намного быстрее (как только выполнение пошаговой функции начнется, ответ возвращается обратно SDK, поэтому это будет быстрее), а также устойчивость к сбоям (у вас есть возможность повторить попытку или уведомить об ошибках).

В качестве альтернативы, если вы хотите, чтобы сам запрос выполнял это в HTTP-запросе от клиента, вам нужно будет посмотреть на ALB, обслуживающий трафик для вашей Lambda, а не на шлюз API (который имеет максимальное ограничение). ALB может поддерживать более длительный тайм-аут до 4000 секунд .