概要
この記事では、DynamoDBエクストリームで動くLambdaの起きがちなエラーの対処方法を紹介します。
エラー
まずはじめに、起こるエラーを紹介します。
[ERROR] KeyError: 'OldImage'
Traceback (most recent call last):
File "/var/task/lambda_function.py", line 7, in lambda_handler
old = event['Records'][0]['dynamodb']['OldImage']
変更前のデータが取得できないエラーです。
設定内容
Lambda関数のコードは下記のとおりです。
import json
def lambda_handler(event, context):
print(event)
new = event['Records'][0]['dynamodb']['NewImage']
old = event['Records'][0]['dynamodb']['OldImage']
print(new)
print(old)
# TODO implement
return {
'statusCode': 200,
'body': json.dumps('Hello from Lambda!')
}
DynamoDBに加えた変更は、下記のとおりです。
- 変更前
id | cast | favorite | program_name | time | weekday |
---|---|---|---|---|---|
mon2700 | [{"S":"フワちゃん"}] | false | フワちゃんのオールナイトニッポン0 | 27:00-28:30 | 1 |
- 変更後
id | cast | favorite | program_name | time | weekday |
---|---|---|---|---|---|
mon2700 | [{"S":"フワちゃん"}] | true | フワちゃんのオールナイトニッポン0 | 27:00-28:30 | 1 |
対処法
まず、原因ですが、
変更を加える以前の、DB登録時に、
OldImage
がないため吐いたエラーが残っていることが原因です。
DynamoDBエクストリームを有効にすると、
自動で、再試行
に -1
が設定されます。
これにより、Lambda関数内でエラーが起きた際に、無限に再試行を繰り返し、
DBに変更を加えても、前のエラーを吐き続けてしまいます。
対処法は、再試行
の値を、0以上に設定変更することです。
Lambda関数から 設定
を開き、トリガーを選択し、編集
を押下します。
追加設定
から 再試行
を 0
以上に変更し、保存
で設定変更完了です。
0
を設定すると、下記のように なし
が表示されます。
これで、DBの変更時にエラーが出ることは解消できます。
DB登録時にエラーが出ることに関しては、
Lambda関数の、OldImage取得部分を、OldImageが無くてもエラーを起こさない等、
コードに修正を加えることで解消できます。