AWS SDKのDynamoDB Clientを使うときにはmaxRetriesを設定しておいた方が良いという話
https://gyazo.com/6c88783a8ac8c4bc7ab321e2c1c6574f
例えば AWS SDK for JavaScript の DynamoDB Client では code: dynamodb-experiment.js
import { DynamoDB } from 'aws-sdk';
const ddbClient = new DynamoDB({ region: 'us-east-1' });
console.log(ddbClient.config);
// =>
// ...
// region: 'us-east-1',
// maxRetries: undefined,
// httpOptions: { timeout: 120000 },
// ...
こんな感じでデフォルト値が設定されていて、リクエストしたときにDynamoDB?ネットワーク?の調子が悪いとエラーを吐かずに2分間リトライし続けるようになっている。
Lambdaのタイムアウト値がこれより短いとClientがエラーを吐くこともなく、後続の処理も行われず、プツッと強制終了するような感じになる。(Lambdaエラーにはなるが、アプリケーションコードでエラーハンドリングできない)
ちゃんとClientにmaxRetriesを設定しておいて、アプリケーションでエラーハンドリングを実装しておくのが吉。(timeout: 1, maxRetries: undefined で設定して試すとエラーを吐くまでに時間がかかり、 timeout: 1, maxRetries: 3 とかにするとすぐにエラーを吐くようになった。このことからtimeout値は内部的に諦めてリトライするまでの上限値のようなもので、これだけ小さくしても内部的に短い間隔でリトライしまくるようになってしまうようだった。とりあえずmaxRetriesを定めるのが大事。)
例:
code: use-dynamodb.js
...
const ddbClient = new DynamoDB({
region: 'us-east-1',
maxRetries: 5,
httpOptions: { timeout: 2000 }
});
await ddbClient.getItem(params).promise()
.catch((err) => { console.log('error!'); });
...