備忘録です。
事象
Lambdaで作ったGoのバッチで440万件ほどのアイテムを作ろうとした所、下記エラーが出て途中終了していた。
{
"errorMessage": "operation error DynamoDB: PutItem, exceeded maximum number of attempts, 3, https response error StatusCode: 400, RequestID: XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX, api error ThrottlingException: Throughput exceeds the current capacity for one or more global secondary indexes. DynamoDB is automatically scaling your index so please try again shortly.",
"errorType": "withStack"
}
再実行しても、10分程で同様のエラーが出てエラー終了する。
原因
DynamoDBに設定されたキャパシティーを超えるリクエストを行うと400エラーを返却する様子。
AWSサポートからの回答
DynamoDB では内部的に自動でスケーリング処理を実行しており、その際一時的に API リクエストに対して 500 エラーを返す場合がございます。
また、その他の一時的な内部の問題により 500 エラーを返す場合もございます [1] 。
キャパシティーモード(オンデマンドモード / プロビジョニングモード)によらず同様のエラーが発生する可能性があります。
AWS では日々サービス改善に努めておりますが、一時的なエラーを完全に防ぐことは困難であること、ご理解いただければと存じます。
対応
バッチが止まってから4回時間を数分開けつつ再実行した所、その後数時間実行してもエラーが出なくなった。
AWS DynamoDBのスペックが勝手に上がっているのか、何度か再実行すれば拡張される様子。
大量データをCreateする場合は特に、再実行しても途中から問題なくアイテムを作成出来るように設計した方が良さそう。