サーバーレスフレームワークを使用しています。 Lambda関数はDynamoDBテーブルに接続して、テーブル内のアイテムを更新します。テーブルの読み取りと書き込みの容量単位は5で、auto_scalingは無効になっています。 AWS Lambda関数には128MBのメモリが割り当てられています。
私はパフォーマンステストにJmeterを使用しました.1000のリクエストを同時に送信し、一部の応答は完全な出力を提供し、他は内部サーバーエラー(502 Bad Gateway)を提供しました。 Cloudwatchでログを分析したところ、タスクタイムアウトエラーのみが発生しました。誰もが私にこのエラーが発生する理由とそれを解決する方法を提案できますか?
サーバーレスフレームワークを使用する場合のAWS Lambda関数のデフォルトのタイムアウトは6秒です。 documentation に記載されているように、それをより高い値に変更するだけです。
functions:
hello:
...
timeout: 10 # optional, in seconds, default is 6
DynamoDBテーブルには5つのWCUのみがプロビジョニングされていると述べたので、これは1秒あたり5つの書き込みのみが許可されることを意味します。
DynamoDBはバースト容量を提供し、300秒に相当する累積容量(5 WCUでは合計1500の書き込みリクエストに相当)を使用できますが、それらが使い果たされるとすぐにスロットルが開始されます。
DynamoDBクライアントには、指数バックオフを備えた自動再試行機能が組み込まれており、スロットルを認識するのに十分なほどスマートであるため、再試行が遅くなり、単一の書き込みが繰り返しスロットルされている場合、正常に完了するまで数秒かかることがあります。
Lambda関数はDynamoへの再試行を待機しているため、6秒でタイムアウトする可能性があります。
したがって、負荷テストを行うときは、依存関係がすべて適切にスケーリングされていることを確認してください。 1秒あたり1000リクエストで、それに応じてDynamoDBテーブルまたはインデックス、あるいはその両方の読み取り/書き込み容量割り当てをスケーリングするようにしてください。