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秒のより長いタイムアウトをサポートできます。