SQSから呼び出した(=イベントソースにSQSを指定した)Lambda関数が、失敗しているにも関わらずLambdaに設定したDLQにメッセージが送信されていなかった。長らく原因がわからなずにいたが、AWSのサポートの方に教えてもらったのでメモしておく。
SQSから呼び出した場合、Lambda関数は同期呼び出しになる。LambdaのDLQは非同期呼び出しの際に有効な機能である。そのため、LambdaイベントソースマッピングにSQSを使用している関数ではLambdaがエラーになってもDLQにメッセージは送られない。
リトライは、SQS側で可視性タイムアウト後に(メッセージ保持期間の間は)自動的に行われるが、それでも失敗した場合はSQSに設定したDLQにメッセージが送られる。そのため、SQS→Lambdaの場合のアラートなどはSQS側のDLQを対象とする必要がある。