如何讓我的 Amazon SQS 訂閱成功收到 Amazon SNS 主題的通知?

3 分的閱讀內容
0

我的 Amazon Simple Queue Service (Amazon SQS) 訂閱收不到來自 Amazon Simple Notification Service (Amazon SNS) 主題的通知。

簡短說明

在開始之前,為您的 SNS 主題設定 Amazon CloudWatch 傳遞狀態日誌記錄。如需詳細資訊,請參閱使用 CloudWatch 監控 Amazon SNS 主題

注意:

  • 如需有關臨界值外洩警示的資訊,請參閱為 Amazon SNS 指標設定 CloudWatch 警報
  • 如需有關端點的訊息傳遞狀態的資訊,請參閱使用 AWS 管理主控台設定傳遞狀態日誌記錄
  • 若要確認傳遞狀態,請從 CloudWatch 存取主題的傳遞日誌。若要檢查訊息是否已傳遞至佇列,請將 SNS 主題的 NumberOfMessagesPublishedNumberOfNotificationsDelivered 指標與 Amazon SQS 佇列的 NumberOfMessagesSent CloudWatch 指標進行比較。

解決方法

確證訂閱狀態

確認訂閱處於已確認狀態,而非處於待確認已刪除狀態。如果狀態為待確認,則確認訂閱。如果狀態為已刪除,則重新建立已刪除的訂閱

下列原因是訂閱處於已確認 狀態但訊息未傳送到佇列的原因:

  • 您沒有設定 SQS 佇列的存取政策或 AWS Key Management Service (KMS) 金鑰政策。
  • 訊息被過濾掉。
  • 在「先出」(FIFO) 主題中會先刪除重複的訊息。
  • 您已為訂閱啟用原始訊息傳送。
  • 訊息已傳送,但您在 Amazon SQS 中看不到訊息。

您收到拒絕存取錯誤

設定 SQS 佇列的存取政策,以允許 Amazon SNS 傳送訊息

若要檢視 SQS 佇列的存取政策,請設定您的存取政策

如果 SQS 佇列的存取政策不包含 SNS 主題的 SendMessage API 動作,則使用正確的權限更新政策。這些權限必須允許 Amazon SNS 將訊息傳送到 SQS 佇列。

設定 AWS KMS 金鑰政策,以與 SQS 佇列中的 SSE 一起使用

如果已為 SQS 佇列開啟伺服器端加密 (SSE),請依照下列步驟執行:

1.    確定已啟用 AWS KMS key

2.    檢查您的 SQS 佇列是否使用客戶管理的 KMS 金鑰。金鑰政策應授予 kms:Decryptkms:GenerateDataKey 權限給 SNS 主題。

**注意:**您無法在跨帳戶訂閱中使用 AWS 受管金鑰

3.    若要允許 Amazon SNS 服務執行 kms:GenerateDataKeykms: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 金鑰政策未授予 Amzon 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 訊息篩選

訊息被刪除重複

根據訊息內容或重複刪除 ID,Amazon SNS FIFO 主題和 Amazon SQS FIFO 佇列支援訊息重複刪除。如果主題已設定 ContentBasedDeduplication,則系統會根據訊息內容產生 MessageDeduplicationId。如果未設定 ContentBasedDeduplication,則發佈到主題的每條訊息都必須具有唯一的 MessageDeduplicationId

使用 MessageDeduplicationId 參數可在 5 分鐘重複資料刪除間隔內刪除發佈至 SNS 主題的重複訊息。如需詳細資訊,請參閱 FIFO 主題的訊息重複資料刪除

您已為訂閱啟用原始訊息傳送

如果您使用原始訊息傳遞,請確認您在發佈的通知中傳送的訊息屬性不超過 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 訂閱時,就會發生此問題。您可以在 SNS 主控台上的訂閱清單中或從 SNS ListSubscriptions API 呼叫中查看 SQS 訂閱。若要檢查執行作業時的時間戳記,請檢閱 DeleteTopicCreateTopic SNS API 呼叫的 AWS CloudTrail 事件。

相關資訊

如何將我的跨帳戶 Amazon SQS 端點設定為 Amazon SNS 主題?

AWS 官方
AWS 官方已更新 7 個月前