Amazon SNS デッドレターキュー (DLQ) - Amazon Simple Notification Service

Amazon SNS デッドレターキュー (DLQ)

デッドレターキューは、Amazon SNS サブスクリプションが受信者に正常に配信できないメッセージの送信先としての Amazon SQS キューです。クライアントエラーまたはサーバーエラーが原因で配信できないメッセージは、詳細な分析や再処理のためにデッドレターキューに保持されます。詳細については、「サブスクリプションの Amazon SNS デッドレターキューを設定する」および「Amazon SNS メッセージ配信の再試行」を参照してください。

注記
  • Amazon SNS サブスクリプションと Amazon SQS キューは、同じ AWS アカウントとリージョン内になければいけません。

  • 以下のために FIFO トピックでは、Amazon SNS サブスクリプションのデッドレターキューとして Amazon SQS FIFO キューを使用します。

  • 暗号化された Amazon SQS キューをデッドレターキューとして使用するには、Amazon SNS サービスプリンシパルに AWS KMS API アクションへのアクセス権を付与するキーポリシーのあるカスタム CMK を使用する必要があります。詳細については、このガイドの「保管時の暗号化」と、『Amazon Simple Queue Service デベロッパーガイド』の「サーバー側の暗号化 (SSE) と AWS KMS を使用した Amazon SQS データの保護」を参照してください。

メッセージ配信が失敗する理由

一般に、Amazon SNS がクライアント側またはサーバー側のエラーにより、サブスクライブされたエンドポイントにアクセスできない場合、メッセージの配信は失敗します。Amazon SNS がクライアント側のエラーを受信した場合、または対応する再試行ポリシーで指定された再試行回数を超えるメッセージに対してサーバー側のエラーを受信し続ける場合、Amazon SNS はメッセージを廃棄します。ただし、デッドレターキューがサブスクリプションに添付されている場合を除きます。配信に失敗しても、サブスクリプションのステータスは変更されません。詳細については、「Amazon SNS メッセージ配信の再試行」を参照してください。

クライアント側のエラー

Amazon SNS に古いサブスクリプションのメタデータがあると、クライアント側のエラーが発生する可能性があります。これらのエラーは、通常、所有者がエンドポイント (Amazon SNS トピックにサブスクライブされている Lambda 関数など) を削除した場合や、サブスクライブしているエンドポイントに添付されているポリシーを、Amazon SNS がエンドポイントにメッセージを配信できないように所有者が変更した場合に発生します。Amazon SNS は、クライアント側のエラーの結果として失敗したメッセージ配信を再試行しません。

サーバー側のエラー

サーバー側のエラーは、サブスクライブされたエンドポイントを担当するシステムが利用できなくなったり、Amazon SNS からの有効なリクエストを処理できないことを示す例外を返す場合に発生します。サーバー側のエラーが発生すると、Amazon SNS は一次バックオフ関数またはエクスポネンシャルバックオフ関数を使用して、失敗した配信を再試行します。Amazon SQS または AWS Lambda によってバックアップされた AWS 管理のエンドポイントに起因するサーバー側エラーについては、Amazon SNS は 23 日間にわたって 100,015 回まで配信を再試行します。

カスタマー管理のエンドポイント (HTTP、SMTP、SMS、モバイルプッシュなど) も、サーバー側のエラーを引き起こす可能性があります。Amazon SNS は、これらのタイプのエンドポイントへの配信も再試行します。HTTP エンドポイントはお客様定義の再試行ポリシーをサポートしますが、Amazon SNS は SMTP、SMS、およびモバイルプッシュエンドポイントに対して、内部配信再試行ポリシーを 6 時間にわたって 50 回に設定します。

デッドレターキューのしくみ

メッセージの配信はサブスクリプションレベルで行われるため、デッドレターキューは (トピックではなく) Amazon SNS サブスクリプションに添付されます。これにより、各メッセージの元のターゲットエンドポイントをより簡単に識別できます。

Amazon SNS サブスクリプションに関連付けられたデッドレターキューは、通常の Amazon SQS キューです。メッセージの保持期間の詳細については、『Amazon Simple Queue Service デベロッパーガイド』の「メッセージに関連するクォータ」を参照してください。Amazon SQS SetQueueAttributes API アクションを使用して、メッセージの保持期間を変更できます。アプリケーションの復元性を高めるために、デッドレターキューの最大保持期間を 14 日に設定することをお勧めします。

メッセージがデッドレターキューに移動する仕組み

メッセージは、再処理ポリシーを使用してデッドレターキューに移動されます。再処理ポリシーは、デッドレターキューの ARN を参照する JSON オブジェクトです。deadLetterTargetArn 属性は ARN を指定します。ARN は、Amazon SNS サブスクリプションと同じ AWS アカウント およびリージョンの Amazon SQS キューを指している必要があります。詳細については、「サブスクリプションの Amazon SNS デッドレターキューを設定する」を参照してください。

注記

FIFO トピックでは、Amazon SNS サブスクリプションのデッドレターキューとして Amazon SQS FIFO キューを使用します。

次の JSON オブジェクトは、SNS サブスクリプションに添付された再処理ポリシーのサンプルです。

{ "deadLetterTargetArn": "arn:aws:sqs:us-east-2:123456789012:MyDeadLetterQueue" }

メッセージをデッドレターキューから移動する方法

メッセージをデッドレターキューから移動するには、次の 2 つの方法があります。

  • Amazon SQS コンシューマロジックの作成を避ける - デッドレターキューをイベントソースとして Lambda 関数に設定して、デッドレターキューを吸い出します。

  • Amazon SQS コンシューマロジックを作成する - Amazon SQS API、AWS SDK、または AWS CLI を使用して、デッドレターキュー内のメッセージのポーリング、処理、削除を行うカスタムコンシューマーロジックを記述します。

デッドレターキューのモニタリングとログ記録方法

Amazon CloudWatch メトリクスを使用して、Amazon SNS サブスクリプションに関連付けられたデッドレターキューをモニタリングできます。すべての Amazon SQS キューは 1 分間隔で CloudWatch メトリクスを送信します。詳細については、『Amazon Simple Queue Service デベロッパーガイド』の「Amazon SQS で使用できる CloudWatch メトリクス」を参照してください。デッドレターキューを持つすべての Amazon SNS サブスクリプションも、CloudWatch メトリクスを出力します。詳細については、「CloudWatch を使用した Amazon SNS のモニタリング」を参照してください。

デッドレターキューのアクティビティを通知するには、CloudWatch メトリクスとアラームを使用できます。例えば、デッドレターキューが常に空であると予想される場合、NumberOfMessagesSent メトリクスの CloudWatch アラームを作成できます。アラームのしきい値を 0 に設定し、アラームが発動したときに通知する Amazon SNS トピックを指定できます。この Amazon SNS トピックは、任意のエンドポイントタイプ (E メールアドレス、電話番号、モバイルポケットベルアプリなど) にアラーム通知を配信できます。

CloudWatch Logs を使用して、Amazon SNS 配信が失敗する原因となる例外や、デッドレターキューに送信されるメッセージを調査できます。Amazon SNS は、配信の成功と失敗の両方を CloudWatch に記録できます。詳細については、「Amazon SNS メッセージ配信ステータス」を参照してください。