Amazon SQS サブスクリプションが Amazon SNS トピックから正常に通知を受け取るようにするにはどうすればよいですか?

最終更新日: 2021 年 7 月 8 日

Amazon Simple Queue Service (Amazon SQS) サブスクリプションは、Amazon Simple Notification Service (Amazon SNS) トピックからの通知を受信しません。

簡単な説明

開始する前に、SNS トピックの Amazon CloudWatch 配信ステータスログを設定します。詳細については、CloudWatch を使用した Amazon SNS トピックのモニタリングをご参照ください。

その後、以下のステップでトラブルシューティングを試みます。

解決方法

SQS キューのアクセスポリシーを設定して Amazon SNS がメッセージを送信できるようにする

SQS キューのアクセスポリシーを表示するには、アクセスポリシーを設定します。

SQS キューのアクセスポリシーに SNS トピックの "sqs:SendMessage" アクションが含まれていない場合は、正しい許可でポリシーを更新します。許可は、Amazon SNS が SQS キューにメッセージを送信することを許可するものである必要があります。

SQS キューでサーバー側の暗号化を使用するように AWS KMS キーポリシーを設定する

SQS キューでサーバー側の暗号化が有効になっている場合は、次の操作を実行する必要があります。

1.    AWS KMS キーステータスを有効にします

2.    SQS キューがカスタマーマネージドキーを使用していることを確認します。KMS キーには、Amazon SNS に正しい許可を付与する AWS Key Management Service (AWS KMS) キーポリシーが必要です。

SNS イベントソースが kms:GenerateDataKey および kms:Decrypt API アクションを実行できるようにするには、KMS キーポリシーに以下のステートメントを追加します。

{
    "Sid": "Allow Amazon SNS to use this key",
    "Effect": "Allow",
    "Principal": {
        "Service": "sns.amazonaws.com"
   
    },
    "Action": [
        "kms:Decrypt",
        "kms:GenerateDataKey*"
    ],
    "Resource": "*"
}

KMS キーポリシーが設定されていない場合は、以下の KMS.AccessDeniedException エラーが Amazon SNS メッセージ配信ステータスログに表示されます。

{
    "notification": {
        "messageMD5Sum": "1234567890abcdefghijklmnopqrstu0",
        "messageId": "abcdef01-gh23-4i5j-678k-90l23m45nopq",
       
    "topicArn": "arn:aws:sns:us-east-1:111111111111:sns",
        "timestamp": "2021-06-17 17:08:10.299"
    },
    "delivery": {
        "deliveryId": "12a3b4c5-6789-0de1-fgh2-ij34k56lmn78",
        "destination": "arn:aws:sqs:us-east-1:111111111111:sns-sqs",
        "providerResponse": "{\"ErrorCode\":\"KMS.AccessDeniedException\",\"ErrorMessage\":\"null
    (Service: AWSKMS; Status Code: 400; Error Code: AccessDeniedException; Request ID: 12a345b6-7c89-0d1e-2f34-5gh67i8kl901; Proxy: null)\",\"sqsRequestId\":\"Unrecoverable\"}",
        "dwellTimeMs": 60,
       
    "attempts": 1,
        "statusCode": 400
    },
    "status": "FAILURE"
} 

サブスクライブした SQS キューのフィルターポリシーが SNS トピックから送信されたメッセージと一致することを確認します。

Amazon SNS の CloudWatch メトリクスで、NumberOfNotificationsFilteredOut メトリクスを確認します。

関数を呼び出している AWS Identity and Access Management (IAM) エンティティによって行われた Publish リクエストは、NumberOfNotificationsFilteredOut メトリクスに表示できます。このシナリオでは、SQS キューの SNS トピックサブスクリプションフィルターポリシーを確認します。

1.    Amazon SNS コンソールを開きます。

2.    ナビゲーションペインで、[Subscriptions] (サブスクリプション) を選択します。

3.    サブスクリプションを選択し、[Edit] (編集) を選択します。

4.    [Subscription filter policy] (サブスクリプションフィルターポリシー) セクションを展開します。

5.    サブスクリプションフィルターポリシーで、Publish リクエストメッセージ属性がフィルターポリシーで必要な属性と一致することを確認します。属性が一致しない場合は、Publish リクエストメッセージ属性を更新して、フィルターポリシーで必要な属性と一致するようにします。

注: 詳細については、Amazon SNS サブスクリプションのフィルターポリシーを参照してください。

6.    [Save changes] (変更を保存) を選択します。

raw メッセージ配信に関する問題をトラブルシューティングする

SQS キューサブスクリプションで raw メッセージ配信を有効にした場合は、発行された通知で 10 個以下のメッセージ属性を送信しようとしていることを確認します。

Amazon SNS は、raw 配信が有効なメッセージのメッセージ属性を SQS メッセージ属性にマッピングします。 10 を超えるメッセージ属性を使用すると、通知の配信が失敗し、配信ステータスログに次のエラーログが表示されます。

{
    "notification": {
        "messageMD5Sum": "5c10d6c5d7f246fc3fb85334b4ed55ca",
        "messageId": "50f51b06-ee71-56fc-b657-424391902ee7",
       
    "topicArn": "arn:aws:sns:us-east-1:111111111111:sns",
        "timestamp": "2021-06-17 16:51:45.468"
    },
    "delivery": {
        "deliveryId":
    "36b3ee88-bc85-5587-b2af-b7cdc3644e07",
    
        "destination": "arn:aws:sqs:us-east-1:111111111111:sns-sqs",
        "providerResponse": "{\"ErrorCode\":\"InvalidParameterValue\",\"ErrorMessage\":\"Number of message
    attributes [SENT DURING PUBLISH] exceeds the allowed maximum [10].\",\"sqsRequestId\":\"Unrecoverable\"}",
        "dwellTimeMs": 44,
        "attempts": 1,
       
    "statusCode": 400
    },
    "status": "FAILURE"
}

SNS FIFO トピックの通知の配信におけるメッセージの重複排除をトラブルシューティングする

SNS FIFO トピックは、メッセージの順序付けと重複排除を行います。重複排除 ID の通知が SNS FIFO トピックに正常に送信された場合、5 分間の重複排除間隔内に同じ重複排除 ID で発行されたメッセージは受け入れられますが、配信されません。

重複排除 ID は、Publish API オペレーションで設定できます。または、SNS FIFO トピックでコンテンツベースの重複排除が有効になっている場合は、メッセージ本文に基づいて FIFO トピックによって重複排除 ID が計算されます。

SNS FIFO トピックでは、メッセージがサブスクライブされたエンドポイントに配信された後でも、メッセージの重複除外 ID の追跡が継続されます。

詳細については、FIFO のトピックのメッセージ重複排除を参照してください。


この記事はお役に立ちましたか?


請求に関するサポートまたは技術サポートが必要ですか?