GAT技術ブログ

株式会社ギブ・アンド・テイクの技術ブログ

GAT技術ブログ

デッドレターキュー (DLQ) 通知を一元化!Lambda × クロスアカウント SNS の設定方法

はじめに(目的・背景)

「Lambda のデッドレターキュー(以下、DLQ) 通知先として、別アカウントの SNS トピックを指定したい ——
でもその方法に関する情報が少なく、マネジメントコンソールでもそれらしい設定項目が見当たらない...」

そんな課題に直面したことはありませんか?

私自身、DLQ 通知をアカウント横断で一元管理する必要があり、クロスアカウント構成を模索していましたが、参考になる情報がほとんどなく、手探りでの検証を余儀なくされました。

そこで本記事では、Lambda 関数の DLQ 通知先として、別 AWS アカウントの SNS トピックを指定する方法を、以下の観点から解説します

  • Lambda の DLQ 通知先に SNS を指定する方法

  • マネジメントコンソールで選べない「クロスアカウント SNS」の設定方法

  • 必要な IAM / SNS アクセスポリシーの具体的な書き方

同じように、「DLQ 通知の通知先をアカウント横断で 1 つの SNS トピックに集約したい」と考えている方の参考になれば幸いです。


Lambda の DLQ 通知をクロスアカウントで設定する方法

構成概要

Lambda 関数で発生したエラーを、別アカウントにある SNS トピックへ送信し、DLQ 通知を一元管理する構成です。

  • AWS アカウント A:Lambda 関数が存在するアカウント

  • AWS アカウント B:SNS トピックが存在するアカウント

Lambda と SNS トピックは、いずれも事前に作成済みの前提とします。

設定の流れは以下の通りです。

  • SNS トピック側(アカウント B)に、Lambda 側(アカウント A)からの sns:Publish を許可するポリシーを追加

  • ② Lambda にアタッチされた IAM ロールに、SNS トピックへの sns:Publish 権限を付与

  • CLI で update-function-configuration を実行し、DLQ 通知先を設定

設定手順

1. SNS トピック側(アカウント B):ポリシーで Lambda からの Publish を許可

SNS トピックに、アカウント A の Lambda 関数からの Publish を許可するアクセスポリシーを追加します。

既存のアクセスポリシーに以下のポリシー内容を追記しました。

{
      "Sid": "cross-account-lambda-access",
      "Effect": "Allow",
      "Principal": {
        "AWS": "arn:aws:iam::<AWSアカウントAのアカウントID>:root"
      },
      "Action": "sns:Publish",
      "Resource": "arn:aws:sns:<リージョン>:<AWSアカウントBのアカウントID>:<SNSトピック名>"
}

この追記した権限は、以下の AWS re:Post の内容を参考にしています。 ※参考:Cross-Account Dead-Letter Queue for Lambda(2025年10月20日アクセス)

2. Lambda 側(アカウント A):実行ロールに SNS への Publish 権限を付与

Lambda 関数にアタッチしている IAM ロールに、SNS トピックへの sns:Publish 権限を追加します。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": "sns:Publish",
            "Resource": "arn:aws:sns:<リージョン>:<AWSアカウントBのアカウントID>:<SNSトピック名>"
        }
    ]
}
3. Lambda 側(アカウント A):DLQ 通知先を CLI で設定

マネジメントコンソールでは、同一アカウントの SNS トピックしか選択できないため、CLI を使って設定を行います。

なお、以下の DLQ 通知先の SNS トピックを選択するプルダウンには、ARN を直接入力することはできません。

Lambda が存在する AWS アカウント A 側の AWS CloudShell などで以下のコマンドを実行します。

 aws lambda update-function-configuration \
  --function-name <Lambda 関数名> \
  --dead-letter-config TargetArn=arn:aws:sns:<リージョン>:<AWSアカウントBのアカウントID>:<トピック名>

設定が正しく反映されると、Lambda 関数の非同期呼び出し設定に通知先として指定した SNS トピックが登録されます。

動作確認

Lambda の DLQ は非同期呼び出し時のみ発火します。

動作確認のため、Lambda 関数をエラーになるように修正し、CloudShell から非同期で呼び出します。

 aws lambda invoke \
  --function-name <Lambda 関数名> \
  --invocation-type Event \
  --cli-binary-format raw-in-base64-out \
  --payload '{"errorMessage":"Simulate DLQ notification"}' event.json

実行結果は以下の通りで、ステータスコード 202 が返されました。

Event呼び出しタイプの場合、呼び出しのアクションが成功すると、HTTP ステータスコード 202 が返ります。

HTTP ステータスコードは、成功したリクエストの 200 の範囲内にあります。RequestResponse呼び出しタイプの場合、ステータスコードは 200 です。Event呼び出しタイプの場合、ステータスコードは 202 です。

※引用:AWS公式ドキュメント「AWS Lambda API リファレンス」(2025年10月19日アクセス)URL:https://docs.aws.amazon.com/ja_jp/lambda/latest/api/API_Invoke.html

その後、AWS アカウント B の SNS トピック経由で、以下の通り DLQ 通知を正常に受信できたことを確認できました。


まとめ

本記事では、Lambda 関数の DLQ 通知先として、別アカウントの SNS トピックを指定する方法について解説しました。

アカウントをまたいで DLQ 通知を一元管理したい方の参考になれば幸いです。