Help us understand the problem. What is going on with this article?

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

More than 3 years have passed since last update.

注意点

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

エラー時のリトライ - AWS Lambda公式ドキュメント
AWS Lambda のイベントソースごとの呼び出しタイプ - Qiita

概要

Lambda ファンクション内で context.done() の第1引数に null 以外の値を渡すと処理失敗となりリトライが発生する。
各イベントソースによるリトライ処理を調べてみた。

S3

  • 処理失敗時には 3 分後に再度ファンクションが呼び出される。
  • context.invokeid は前回と同じ値になる。
  • リトライを含めて最大 3 回実行される。

ETagの比較

US Standard は全ての操作で結果整合性、それ以外のリージョンでは新規作成以外の操作で結果整合性をもって動作する。
Lambda に限らず S3 のオブジェクトを取得する場合は ETag を確認したほうがいい。

http://docs.aws.amazon.com/ja_jp/AmazonS3/latest/dev/Introduction.html#Regions

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 と同じ挙動だった。

ryo0301
lifull
日本最大級の不動産・住宅情報サイト「LIFULL HOME'S」を始め、人々の生活に寄り添う様々な情報サービス事業を展開しています。
https://lifull.com/
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした