Amazon SQS サブスクリプションで Amazon SNS トピックからの通知を正常に受け取る方法を教えてください。
Amazon Simple Queue Service (Amazon SQS) のサブスクリプションに、Amazon Simple Notification Service (Amazon SNS) トピックからの通知が届きません。
簡単な説明
開始する前に、SNS トピックの Amazon CloudWatch 配信ステータスのログ記録を設定します。詳細については、CloudWatch を使った Amazon SNS トピックのモニタリングをご参照ください。
注:
- しきい値違反に関するアラートについては、Amazon SNS メトリックスの CloudWatch アラームの設定」をご参照ください。
- エンドポイントへのメッセージ配信ステータスについては、AWS マネジメントコンソールを使用した配信ステータスのロギングの設定をご参照ください。
- 配信ステータスを確認するには、CloudWatch からトピックの配信ログにアクセスします。メッセージがキューに配信されたことを確認するには、SNS トピックのNumberOfMessagesPublishedとNumberOfNotificationsDeliveredメトリックスを、Amazon SQS キューのNumberOfMessagesSent CloudWatch メトリックスと比較します。
解決策
サブスクリプションのステータスを確認する
サブスクリプションが確認済み 状態にあり、確認待ちまたは、削除済み状態にないことを確認します。ステータスが確認待ちの場合は、サブスクリプションを確認します。ステータスが 削除済みの場合は、削除したサブスクリプションを再作成します。
サブスクリプションが 確認済み状態になってもメッセージがキューに配信されない理由は次のとおりです。
- 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) が有効になっている場合は、次の手順に従ってください。
-
KMS キーがアクティブになっているかを確認します。
-
SQS キューがカスタマーマネージド KMS キーを使用しているかどうかを確認します。「はい」の場合、キーポリシーは SNS トピックへの kms:Decrypt と kms:GenerateDataKey* 権限を付与する必要があります。
注:AWS マネージドキー はクロスアカウントサブスクリプションでは使用できません。
- 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 トピックサブスクリプションポリシーを確認するには、次の手順を実行します。
-
Amazon SNS コンソールを開きます。
-
ナビゲーションペインで、[サブスクリプション] を選択します。
-
サブスクリプションを選択し、**[編集]**を選択します。
-
[サブスクリプションフィルターポリシー]セクションを展開します。メッセージ属性またはメッセージ本文が SNS サブスクリプションフィルターポリシーの範囲と一致するかどうかを確認します。属性または本文が一致しない場合は、フィルターポリシーを更新してください。
-
[変更を保存] を選択します。
詳細については、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 にメッセージが表示されない
メッセージがキューに配信されても、次の理由によりポーリングできない場合があります。
- 現在送信中であるか、消費者がメッセージを受信して処理したためにメッセージが見えなくなっている。コンシューマーがメッセージを受信して処理したかどうかを確認するには、「受信したメッセージ数」または表示されないメッセージのおよその数」CloudWatch メトリクスを使用します。
- メッセージに遅延キューを設定したか、メッセージタイマーを使用してメッセージが送信されました。メッセージを確認するには、ApproximateNumberOfMessagesDelayed CloudWatch メトリックスを使用します。
**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 トピックに設定するにはどうすればよいですか?
関連するコンテンツ
- 質問済み 10ヶ月前lg...
- 質問済み 9ヶ月前lg...
- AWS公式更新しました 2年前