概要
この記事では、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が無くてもエラーを起こさない等、
コードに修正を加えることで解消できます。
