如何让我的 Amazon SQS 订阅成功收到来自我的 Amazon SNS 主题的通知?

3 分钟阅读
0

我的 Amazon Simple Queue Service (Amazon SQS) 订阅收不到来自我的 Amazon Simple Notification Service (Amazon SNS) 主题的通知。

简短描述

在开始之前,请为您的 SNS 主题配置 Amazon CloudWatch 传送状态日志记录。有关详细信息,请参阅使用 Amazon CloudWatch 监控 Amazon SNS 主题

注意:

解决方法

验证订阅状态

确认订阅处于已确认状态,而非待确认已删除状态。如果状态为待确认,请确认订阅。如果状态为已删除,则重新创建已删除的订阅

如果订阅为已确认状态,但消息未传送到队列,可能是出于以下原因:

  • 您没有配置 SQS 队列的访问策略或 AWS Key Management Service (AWS KMS) 密钥政策。
  • 相应消息已被筛除。
  • 相应消息属于按照先进先出 (FIFO) 原则删除重复数据之后的主题。
  • 您为订阅激活了原始消息传送。
  • 消息已送达,但您没有在 Amazon SQS 中看到消息。

您收到“Access denied”错误

配置 SQS 队列的访问策略,以允许 Amazon SNS 发送消息

要查看 SQS 队列的访问策略,请配置您的访问策略

如果 SQS 队列的访问策略对于 SNS 主题不包括 SendMessage API 操作,请更新您的策略以包含正确的权限。该权限必须允许 Amazon SNS 向 SQS 队列发送消息。

配置 AWS KMS 密钥政策,以便对 SQS 队列使用 SSE

如果为 SQS 队列启用了服务器端加密 (SSE),请执行以下操作:

  1. 确保 AWS KMS 密钥已激活。

  2. 检查您的 SQS 队列是否使用了客户自主管理型 KMS 密钥。密钥政策必须对 SNS 主题授予 kms:Decryptkms:GenerateDataKey 权限。

**注意:**您不能在跨账户订阅中使用 AWS 托管式密钥

  1. 要允许 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 密钥政策未授予对 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 消息筛选

已删除消息中的重复数据

根据消息内容或重复数据删除 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 控制台的订阅列表中查看 SQS 订阅,也可以从 SNS ListSubscriptions API 调用中查看 SQS 订阅。要查看执行操作的时间戳,请查看 DeleteTopicCreateTopic SNS API 调用的 AWS CloudTrail 事件。

相关信息

如何将我的跨账户 Amazon SQS 端点配置为 Amazon SNS 主题?

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