Lamda関数の完了に30秒以上かかる場合のAPIGatewayタイムアウトの処理
Aug 16 2020
君の力が必要!API Gatewayから、Lambda関数をトリガーしようとしています。この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
おそらく、LambdaがCloudFormationスタックを直接作成する代わりに、CloudFormationスタックを作成するためだけにLambda関数を使用してステップ関数をトリガーすることができます。元の関数は、start_execution関数の実行後に戻ったときに、実行IDを返す可能性があります。
これには2つの利点があります。1つは、はるかに高速であり(ステップ関数の実行が開始されると、SDKによって応答が返されるため、これが高速になります)、障害に対する耐性があります(次のオプションがあります)。再試行するか、エラーを通知してください)。
または、リクエスト自体でクライアントからのHTTPリクエスト内でこれを実行する場合は、API Gateway(最大カットオフ)ではなく、Lambdaへのトラフィックを提供するALBを確認する必要があります。ALBは、最大4000秒のより長いタイムアウトをサポートできます。