如何获取我的 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 队列发送消息。

将您的 AWS KMS 密钥策略配置为在 SQS 队列上使用服务器端加密

如果在 SQS 队列上启用了服务器端加密,则必须执行以下操作:

1.    启用 AWS KMS 密钥状态

2.    验证您的 SQS 队列使用的是客户管理的密钥。KMS 密钥必须具有向 Amazon SNS 授予正确权限的 AWS Key Management Service (AWS KMS) 密钥策略

要允许 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 密钥策略,那么 Amazon SNS 消息传送状态日志将显示以下 KMS.AccessDeniedException 错误:

{
    "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 (保存更改)

解决原始消息传输问题

如果您为 SQS 队列订阅启用了原始消息传输,请验证在已发布的通知中发送的消息属性不超过 10 个

Amazon SNS 将启用原始传输的消息的消息属性映射到 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 主题,则在五分钟重复数据删除间隔内发布的任何具有相同重复数据删除 ID 的消息都将被接受,但不会传送。

您可以在 Publish API 操作中配置重复数据删除 ID。或者,如果针对 SNS FIFO 主题启用了基于内容的重复数据删除功能,则由 FIFO 主题根据消息正文计算重复数据删除 ID。

SNS FIFO 主题将继续跟踪消息重复数据删除 ID,即使在消息传递到订阅的端点之后也是如此。

有关更多信息,请参阅 FIFO 主题的消息重复数据删除


这篇文章对您有帮助吗?


您是否需要账单或技术支持?