search
LoginSignup
26

More than 5 years have passed since last update.

posted at

updated at

Organization

S3、Kinesis/DynamoDB StreamsでのLambdaリトライ処理

注意点

こちらの記事の内容と現在のリトライ動作は異なっています。
詳細は下記の公式ドキュメントを参照してください。

エラー時のリトライ - 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 と同じ挙動だった。

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
What you can do with signing up
26