SQSを利用したS3イベント通知の処理で、Lambda関数から断続的に発生するエラーを回避する方法を教えてください

2021.11.22

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

困っていた内容

SQSを利用したS3イベント通知を、Lambda関数で処理したいと考えています。

まず、S3イベント通知の Putイベント のメッセージ内容を確認し、PythonでPutイベントを処理するLambda関数を作成しました。

次に、このLambda関数をトリガーするSQS キューを作成しました。

それから、対象のS3バケットで、S3イベント通知をSQSキューに設定しました。

すると、Lambda関数で「[ERROR] KeyError: 'Records'」のエラーが発生しました。

S3イベント通知設定後、同様のエラーが数分おきに繰り返し発生しています。このエラーの回避方法を教えてください。

どう対応すればいいの?

2つの要因が影響しています。 順を追って説明します。

1) イベント通知のテストメッセージ

S3バケットにイベント通知を設定したタイミングで、S3 はテストメッセージを送信します。[1]

エラーが発生している直接の原因は、Lambda関数がこのテストメッセージを適切に処理できていないためです。

エラーが発生しないように、Lambda関数のコードを修正してください。

2) SQSのデッドレターキュー設定が無い

エラーが発生した後、Lambda関数が繰り返し実行されるのは、SQSのキューにメッセージが残り続けているからです。

SQSのキューに、デッドレターキューが設定されていない場合、 テストイベントのメッセージがSQSのキューに残り続けるため、 繰り返しLambda関数が実行され、断続的にエラーが発生します。

対応方法のまとめ

まず、SQSのキューに、デッドレターキューを設定し、エラーになったメッセージは、デッドレターキューに送信するようにしてください。 次に、Pythonのコードを修正し、テストイベントを適切に処理して、Lambda関数でエラーが起きないように設定してください。

参考資料

[1] Amazon S3 テストメッセージ

バケットにイベント通知を設定すると、Amazon S3 は次のようなテストメッセージを送信します。

{  
   "Service":"Amazon S3",
   "Event":"s3:TestEvent",
   "Time":"2014-10-13T15:57:02.089Z",
   "Bucket":"bucketname",
   "RequestId":"5582815E1AEA5ADF",
   "HostId":"8cLeGAmw098X5cv4Zkwcmo8vvZa3eH3eKxsPzbB9wrR+YstdA6Knx4Ip8EXAMPLE"
}

[2] Amazon SQS で AWS Lambda を使用する - AWS Lambda

メッセージが何回も処理に失敗する場合、Amazon SQS はこのメッセージをデッドレターキューに送信できます。 関数がエラーを返すと、Lambda はそのメッセージをキューに残します。可視性タイムアウトが発生すると、Lambda はメッセージをもう一度受信します。 多数の受信後に 2 番目のキューにメッセージを送信するには、ソースキューにデッドレターキューを設定します。