はじめに
SQSをイベントソースにしてLambdaを実行する仕組みを検証している際、DLQの設定を行っているのに、実行に失敗した際のメッセージがDLQに移動しない!という状況に陥りました。
そもそもSQS側にDLQの設定があるので、どちらを利用すればいいのかというのを確かめるために検証していたのですが、少しハマったので共有します。
SQSをイベントソースにした場合のLambda呼び出しは「同期呼び出し」
これが分かっていなかったため、ずっと「非同期呼び出し」に関する説明を追っていました。
非同期呼び出しの場合、実行が失敗すると2回まで再試行を行う、という説明があるのですが、CloudwatchLogsで実行ログを確認しても再試行している様子がありません。念のため、ドキュメントで説明に使っているX-rayというサービスも使って実行のトレースをしてみましたが、実行は1度きりしか行っていないよう。
なぜ1回しか呼び出されないのか、その答えを求めて調べていると、今回の答えにたどり着きました。気づくきっかけになったのは以下の記事です。
これをきっかけに公式のドキュメントでもSQSは「同期呼び出し」であることがわかり、またDLQは「非同期呼び出し」の場合のみ有効であることがわかりました。
なおAWSのサービスからLambdaを呼び出す場合は、そのサービスがどの呼び出し方をしているかを確認するのが手っ取り早いです。
まとめ
- DLQ設定は非同期呼び出しでのみ有効
- SQSをイベントソースにした場合は同期呼び出し
- サービスごとに呼び出し方法を確認するべし