Amazon SQS サブスクリプションで Amazon SNS トピックからの通知を正常に受け取る方法を教えてください。

所要時間3分
0

Amazon Simple Queue Service (Amazon SQS) のサブスクリプションに、Amazon Simple Notification Service (Amazon SNS) トピックからの通知が届きません。

簡単な説明

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

注:

解決策

サブスクリプションのステータスを確認する

サブスクリプションが確認済み 状態にあり、確認待ちまたは、削除済み状態にないことを確認します。ステータスが確認待ちの場合は、サブスクリプションを確認します。ステータスが 削除済みの場合は、削除したサブスクリプションを再作成します

サブスクリプションが 確認済み状態になってもメッセージがキューに配信されない理由は次のとおりです。

  • SQS キューのアクセスポリシーまたは AWS キー管理サービス (AWS KMS) キーポリシーを設定していません。
  • メッセージは除外されます
  • メッセージは先入れ先出し (FIFO) トピックで重複排除されます。
  • サブスクリプションの RAW メッセージ配信を有効にしました。
  • メッセージは配信されましたが、Amazon SQS にメッセージが表示されません。

そうしないと、アクセス拒否エラーが表示されます。

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

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

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

SQS キューの SSE と連携するように AWS KMS キーポリシーを設定します。

SQS キューのサーバー側暗号化 (SSE) が有効になっている場合は、次の手順に従ってください。

  1. KMS キーがアクティブになっているかを確認します。

  2. SQS キューがカスタマーマネージド KMS キーを使用しているかどうかを確認します。「はい」の場合、キーポリシーは SNS トピックへの kms:Decryptkms:GenerateDataKey* 権限を付与する必要があります。

注:AWS マネージドキー はクロスアカウントサブスクリプションでは使用できません。

  1. Amazon 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 キーポリシーが SNS プリンシパルへのアクセスを許可していない場合、Amazon SNS メッセージ配信ステータスログには KMS.AccessDeniedException エラーが表示されます。

{    "notification": {
        "messageMD5Sum": "9ecb1c62c0de86ac894c5fd6c447fe1f",
        "messageId": "f762cbcb-8643-5ef3-95c8-9739fe5f07f6",
        "topicArn": "arn:aws:sns:::",
        "timestamp": "2023-06-01 10:41:32.114"
    },
    "delivery": {
        "deliveryId": "f7a48fb3-1d98-5fe8-ae45-d34165842b39",
        "destination": "arn:aws:sqs:::",
        "providerResponse": "{\"ErrorCode\":\"KMS.AccessDeniedException\",\"ErrorMessage\":\"null (Service: AWSKMS; Status Code: 400; Error Code: AccessDeniedException; Request ID: 00df5c7d-1834-4cfb-bc05-e5a7fccfa816; Proxy: null)\",\"sqsRequestId\":\"Unrecoverable\"}",
        "dwellTimeMs": 59,
        "statusCode": 400
    },
    "status": "FAILURE"
}

詳細については、Amazon SNS トピックに公開したメッセージが、サーバー側の暗号化が有効になっている Amazon SQS キューに配信されないのはなぜですか?を参照してください。

メッセージは除外されます

CloudWatch コンソールで、Amazon SNS の CloudWatch メトリクスを確認します。NumberOfNotificationsFilteredOut メトリクスをチェックして、メッセージがフィルターで除外されていることを確認します。メッセージがフィルターで除外されている場合は、SQS キューの SNS トピックサブスクリプションフィルターポリシーを確認してください。

SNS トピックサブスクリプションポリシーを確認するには、次の手順を実行します。

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

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

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

  4. [サブスクリプションフィルターポリシー]セクションを展開します。メッセージ属性またはメッセージ本文SNS サブスクリプションフィルターポリシーの範囲と一致するかどうかを確認します。属性または本文が一致しない場合は、フィルターポリシーを更新してください。

  5. [変更保存] を選択します。

詳細については、Amazon SNS メッセージフィルタリングをご参照ください。

メッセージは重複排除されます

Amazon SNS FIFO トピックと Amazon SQS FIFO キューは、メッセージコンテンツまたは重複排除 ID に基づくメッセージ重複排除をサポートしています。トピックに ContentBasedDeduplication が設定されている場合、システムはメッセージの内容に基づいて MessageDeduplicationId を生成します。ContentBasedDeduplication が設定されていない場合、ピックに公開されるすべてのメッセージには一意の MessageDeduplicationIDが必要です。

**MessageDeduplicationID ** パラメータを使用すると、 5 分間の重複排除間隔内に SNS トピックに公開されたメッセージを重複排除することができます。詳細については、FIFO トピックのメッセージ重複排除をご参照ください。

サブスクリプションの RAW メッセージ配信を有効にしました

未加工のメッセージ配信を使用する場合は公開された通知で送信するメッセージ属性が 10 個以下であることを確認してください。未加工のメッセージ配信でアクティブ化するメッセージの場合、Amazon SNS はメッセージ属性を SQS メッセージ属性にマッピングします。

次の例は、10 を超えるメッセージ属性を含む配信ステータスログです。

{    "notification": {
        "messageMD5Sum": "8fa14cdd754f91cc6554c9e71929cce7",
        "messageId": "22540375-973d-5c6d-8d9e-5f870de34c49",
        "topicArn": "arn:aws:sns:<region>:<account>:<topic name>",
        "timestamp": "2023-06-01 13:09:50.947"
    },
    "delivery": {
        "deliveryId": "9ccf7066-19e5-5bbb-a973-2c94833bc5fc",
        "destination": "arn:aws:sqs:<region>:<account>:<queue name>",
        "providerResponse": "{\\"ErrorCode\\":\\"InvalidParameterValue\\",\\"ErrorMessage\\":\\"Number of message attributes \[13\] exceeds the allowed maximum \[10\].\\",\\"sqsRequestId\\":\\"Unrecoverable\\"}",
        "dwellTimeMs": 31,
        "statusCode": 400
    },
    "status": "FAILURE"
}

メッセージは配信されたが、Amazon SQS にメッセージが表示されない

メッセージがキューに配信されても、次の理由によりポーリングできない場合があります。

**SNS サブスクリプションは SQS コンソールに表示されません **

SNS トピックアカウントから SQS サブスクリプションを作成した場合、そのサブスクリプションは SQS コンソールに表示されません。これは、SNS アカウントがサブスクリプションを所有しているため、サブスクリプションは SNS コンソールでのみ表示できるためです。

Amazon SQS コンソールから SNS サブスクリプションを作成した場合、SQS トピックアカウントがそのサブスクリプションを所有します。その後、SNS コンソールと SQS コンソールから SNS サブスクリプションを確認できます。

**SQS サブスクリプションが SNS トピックサブスクリプションの下に表示されない **

この問題は、同じ名前の SNS トピックを削除して再作成し、SQS サブスクリプションを削除しない場合に発生します。SQS サブスクリプションは、SNS コンソールのサブスクリプションリストまたは SNS リストサブスクリプション API 呼び出しで確認できます。オペレーションが実行されたタイムスタンプを確認するには、 DeleteTopic CreateTopic の SNS API 呼び出しに関する AWS CloudTrail イベントを確認してください。

関連情報

クロスアカウントの Amazon SQS エンドポイントを Amazon SNS トピックに設定するにはどうすればよいですか?

AWS公式
AWS公式更新しました 7ヶ月前
コメントはありません

関連するコンテンツ