同時実行可能なLambda関数の上限に達したときに何が起こるか

同時実行可能なLambda関数の上限に達したときに何が起こるか

S3 バケットに 200 個の jsonl (json-lines) ファイルがあります。各ファイルには、DynamoDB に書き込まれる 100,000 個の JSON が含まれています。

Lambda を使用して S3 からファイルをダウンロードし、それを DynamoDB にバッチ書き込みます (ファイルは既にテーブル スキーマと完全に一致しています)。

ファイルは 200 個ありますが、200 個の Lambda を同時に呼び出すことはできません。DynamoDB は 1 秒あたり 10,000 WCU に制限されているため、1 秒あたり 10,000 行しか書き込めません。また、Lambda はタイムアウトするまで 300 秒しか持続しません。

これを行う最善の方法は何ですか?

私が現在考えているのは、一度に 5 つの Lambda を非同期的に呼び出し、ログ ファイルを監視していくつ完了したかを確認し、1 つが完了した後にのみ次の Lambda を呼び出すというものでした。

または...

設定できますか?同時実行制限Lambda 関数の場合は 5 に設定し、その後非同期的に関数を 200 回 (ファイルごとに 1 回) 呼び出しますか? 1 つの Lambda が完了すると、AWS は自動的に次の Lambda をトリガーしますか?

答え1

Amazon Docsより:

詳細はこちら

関数に同時実行制限を設定すると、Lambda は、残りの関数を処理するトラフィックの量に関係なく、割り当てがその関数にのみ適用されることを保証します。その制限を超えると、関数は調整されます。調整されたときの関数の動作は、イベント ソースによって異なります。詳細については、調整動作を参照してください。

次に、スロットリング動作を扱う AWS ドキュメントから: https://docs.aws.amazon.com/lambda/latest/dg/concurrent-executions.html#スロットリング動作

関数に関連付けられた同時実行制限に達すると、その関数へのそれ以上の呼び出しリクエストは調整されます。つまり、呼び出しでは関数が実行されません。調整された呼び出しごとに、関数の Amazon CloudWatch スロットル メトリックが増加します。AWS Lambda は、調整された呼び出しリクエストを、そのソースに応じて異なる方法で処理します。

同期呼び出し: 関数が同期的に呼び出され、スロットルされた場合、Lambda は 429 エラーを返し、呼び出し元のサービスが再試行を担当します。ThrottledReason エラー コードは、関数レベルのスロットル (指定されている場合) またはアカウント レベルのスロットル (以下の注記を参照) のどちらに遭遇したかを示します。各サービスには独自の再試行ポリシーがある場合があります。たとえば、CloudWatch Logs は失敗したバッチを最大 5 回再試行し、再試行の間に遅延が発生します。イベント ソースとその呼び出しタイプのリストについては、「サポートされているイベント ソース」を参照してください。

非同期呼び出し: Lambda 関数が非同期的に呼び出され、スロットルされた場合、AWS Lambda はスロットルされたイベントを最大 6 時間まで自動的に再試行し、再試行の間には遅延が生じます。非同期イベントは、Lambda 関数の呼び出しに使用される前にキューに入れられることに注意してください。

したがって、同時実行制限を設定すると (すべての関数でデフォルトで 1000 に設定されています)、AWS は 429 ステータス コード (要求応答用) を返すか、関数を自動的にキューに入れて最大 6 時間再試行するようです。

ただし、再試行間の遅延機能がどのように機能するかは指定されていません。

関連情報