注意点
こちらの記事の内容と現在のリトライ動作は異なっています。
詳細は下記の公式ドキュメントを参照してください。
エラー時のリトライ - AWS Lambda公式ドキュメント
AWS Lambda のイベントソースごとの呼び出しタイプ - Qiita
概要
Lambda ファンクション内で context.done()
の第1引数に null
以外の値を渡すと処理失敗となりリトライが発生する。
各イベントソースによるリトライ処理を調べてみた。
S3
- 処理失敗時には 3 分後に再度ファンクションが呼び出される。
-
context.invokeid
は前回と同じ値になる。 - リトライを含めて最大 3 回実行される。
ETagの比較
US Standard は全ての操作で結果整合性、それ以外のリージョンでは新規作成以外の操作で結果整合性をもって動作する。
Lambda に限らず S3 のオブジェクトを取得する場合は ETag を確認したほうがいい。
IfMatch
を渡せば指定の ETag にマッチした時だけ取得成功となる(失敗時は412が返ってくる)。
ちなみに、ここでは使っていないが s3.getObject()
の戻り値に含まれる ETag は二重にクォートされているので注意。
handler
s3.getObject({
Bucket: bucket,
Key: key,
IfMatch: event.Records[0].s3.object.eTag
}, function(err,data) {
if (err) {
console.log(JSON.stringify(err, null, 2));
context.done('error', err);
} else {
context.done();
}
});
err
{
"message": "At least one of the pre-conditions you specified did not hold",
"code": "PreconditionFailed",
"time": "2014-12-03T02:54:39.101Z",
"statusCode": 412,
"retryable": false
}
Kinesis
- Truncated Exponential Backoff というやつ?
- インターバルが 1 秒、 2 秒、 4 秒、 8 秒、 ・・・というふうに増えていく。
- インターバルは 60 秒前後が最大値っぽい。
-
context.invokeid
は毎回違う値になる。 - リトライを含めて最大 10 回実行される。
DynamoDB Streams
当然と言えば当然だけど Kinesis と同じ挙動だった。