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

2 分钟阅读
0

我想向账户 B 中的 Amazon SNS 主题订阅我账户 A 中的 Amazon SQS 队列。

简述

您可以以主题所有者的身份从 Amazon Simple Notification Service(Amazon SNS)主题创建订阅,也可以以队列所有者的身份从 Amazon Simple Queue Service(Amazon SQS)队列创建订阅。对于后者,Amazon SQS 队列需要相应的权限才能允许队列向 Amazon SNS 主题发送消息。

解决方案

先决条件

确保账户 B 中的 SNS 主题访问策略具有相应的权限。这允许账户 A 中的 SQS 队列订阅 SNS 主题。

以队列所有者身份订阅

作为队列所有者,请按照以下步骤将账户 A 中的 SQS 队列订阅到您在账户 B 中的 SNS 主题:

  1. 登录 AWS 管理控制台,然后导航至账户 A 中的 Amazon SQS 控制台
  2. 选择队列,然后选择您的 SQS 队列。
  3. SNS 订阅部分中,选择订阅 Amazon SNS 主题
  4. 从下拉列表中选择选择一个主题。然后,选择输入 Amazon SNS 主题 ARN
  5. 可以向 Amazon SQS 队列发送通知的 Amazon SNS 主题文本字段中填写您的 SNS 主题 ARN。
  6. 选择保存
  7. 登录 AWS 管理控制台,然后导航至账户 B 中的 Amazon SNS 控制台
  8. 选择主题,然后选择您的 SNS 主题。
  9. 查看订阅部分,验证账户 B 中您的 SNS 主题的订阅是否已确认。

以主题所有者身份订阅

作为主题所有者,请按照以下步骤在另一个账户中订阅您的 SQS 队列:

修改账户 B 中的访问策略

  1. 登录 AWS 管理控制台,然后导航至账户 B 中的 Amazon SNS 控制台
  2. 选择主题,然后选择您的 SNS 主题。
  3. 选择页面右上角的编辑
  4. 展开访问策略 - 可选部分。将以下访问策略复制并粘贴到 JSON 编辑器部分。(确保将 AWS 账户和 SNS 主题 ARN 替换为您自己的值。) 然后,选择底部的保存更改
{
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "AWS": "111122223333"
      },
      "Action": "sns:Subscribe",
      "Resource": "arn:aws:sns:us-east-2:123456789012:MyTopic"
    }
  ]
}

修改账户 A 中的 SQS 队列

  1. 登录 AWS 管理控制台,然后导航至账户 A 中的 Amazon SQS 控制台
  2. 选择队列,然后选择您的 SQS 队列。
  3. 选择页面右上角的编辑
  4. 导航至访问策略部分。在 JSON 编辑器中复制并粘贴以下访问策略。(确保将 SQS 队列 ARN 和 SNS 主题 ARN 替换为您自己的值。)
{
  "Sid": "Stmt1234",
  "Effect": "Allow",
  "Principal": "*",
  "Action": "sqs:SendMessage",
  "Resource": "arn:aws:sqs:us-west-2:111111111111:QueueName",
  "Condition": {
    "ArnEquals": {
      "aws:SourceArn": "arn:aws:sns:us-west-2:555555555555:TopicName"
    }
  }
}

通过账户 B 中的 SNS 主题订阅 SQS 队列

登录 AWS 管理控制台,然后导航至账户 B 中的 Amazon SNS 控制台。选择主题,然后选择您的 SNS 主题。

  1. 订阅下,选择创建订阅
  2. 选择协议下拉列表,然后选择 Amazon SQS
  3. 选择创建订阅
  4. 登录 AWS 管理控制台,然后导航至账户 A 中的 Amazon SQS 控制台。选择队列,然后选择您的 SQS 队列。
  5. 选择页面右上角的发送和接收消息
  6. 选择轮询消息。在消息部分下,会显示一条来自 Amazon SNS 的消息。
  7. 选择消息 ID。找到 SubscribeURL,然后复制引号内的 URL。
  8. 将此 URL 链接粘贴到您的网络浏览器中。
  9. 登录 AWS 管理控制台,然后导航至账户 B 中的 Amazon SNS 控制台。选择主题,然后选择您的 SNS 主题。
  10. 查看订阅下的订阅状态,验证该订阅已确认。

故障排除提示

当我在 Amazon SNS 控制台中创建订阅时,我的订阅在 SNS 控制台中仍处于待处理状态。

使用以下步骤对错误进行故障排除:

  • 删除您的订阅,然后从上面的第 9 步重新开始。
  • 通过使用以下命令检索 SubscriptionURL,使用 AWS CLI 轮询您的 SQS 队列:
aws sqs receive-message --queue-url https**:**//sqs.us-east-1.amazonaws.com/80398EXAMPLE/MyQueue --attribute-names All --message-attribute-names All --max-number-of-messages 10

**注意:**如果在运行 CLI 命令时收到错误,确保您使用的是最新版本的 AWS CLI。将此 URL 复制并粘贴到浏览器中以确认进行订阅。请务必将队列 URL 替换为您自己的队列 URL。

当我复制并粘贴我的 SNS 主题访问策略时,我收到错误“无法设置主题访问策略。
错误代码: InvalidParameter - 错误消息: 设置属性访问策略时出错。无效参数: 策略错误:空。”

使用以下步骤对错误进行故障排除:

  • 将访问策略复制并粘贴到 JSON Validator 工具中,以确保您策略的语法正确。
  • 查看您的访问策略,确保您没有重复的语句。确保您的第一个语句 ID 后有逗号。

最佳实践

对您的 SQS 队列的 SNS 订阅进行身份验证。进行此配置后,只有主题所有者和订阅所有者才可以从 SQS 主题取消订阅 SNS 队列。

相关信息

将 Amazon SNS 消息发送到不同账户中的 Amazon SQS 队列

允许 Amazon Simple Storage Service(Amazon S3)事件通知发布到主题

尝试向 Amazon SNS 主题添加订阅者时,如何解决授权错误?

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