SQSを利用したS3イベント通知の処理で、Lambda関数から断続的に発生するエラーを回避する方法を教えてください
困っていた内容
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関数でエラーが起きないように設定してください。
参考資料
バケットにイベント通知を設定すると、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 番目のキューにメッセージを送信するには、ソースキューにデッドレターキューを設定します。