我想向账户 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 主题:
- 登录 AWS 管理控制台,然后导航至账户 A 中的 Amazon SQS 控制台。
- 选择队列,然后选择您的 SQS 队列。
- 在 SNS 订阅部分中,选择订阅 Amazon SNS 主题。
- 从下拉列表中选择选择一个主题。然后,选择输入 Amazon SNS 主题 ARN。
- 在可以向 Amazon SQS 队列发送通知的 Amazon SNS 主题文本字段中填写您的 SNS 主题 ARN。
- 选择保存。
- 登录 AWS 管理控制台,然后导航至账户 B 中的 Amazon SNS 控制台。
- 选择主题,然后选择您的 SNS 主题。
- 查看订阅部分,验证账户 B 中您的 SNS 主题的订阅是否已确认。
以主题所有者身份订阅
作为主题所有者,请按照以下步骤在另一个账户中订阅您的 SQS 队列:
修改账户 B 中的访问策略
- 登录 AWS 管理控制台,然后导航至账户 B 中的 Amazon SNS 控制台
- 选择主题,然后选择您的 SNS 主题。
- 选择页面右上角的编辑。
- 展开访问策略 - 可选部分。将以下访问策略复制并粘贴到 JSON 编辑器部分。(确保将 AWS 账户和 SNS 主题 ARN 替换为您自己的值。) 然后,选择底部的保存更改。
{
"Statement": [
{
"Effect": "Allow",
"Principal": {
"AWS": "111122223333"
},
"Action": "sns:Subscribe",
"Resource": "arn:aws:sns:us-east-2:123456789012:MyTopic"
}
]
}
修改账户 A 中的 SQS 队列
- 登录 AWS 管理控制台,然后导航至账户 A 中的 Amazon SQS 控制台。
- 选择队列,然后选择您的 SQS 队列。
- 选择页面右上角的编辑。
- 导航至访问策略部分。在 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 主题。
- 在订阅下,选择创建订阅。
- 选择协议下拉列表,然后选择 Amazon SQS。
- 选择创建订阅。
- 登录 AWS 管理控制台,然后导航至账户 A 中的 Amazon SQS 控制台。选择队列,然后选择您的 SQS 队列。
- 选择页面右上角的发送和接收消息。
- 选择轮询消息。在消息部分下,会显示一条来自 Amazon SNS 的消息。
- 选择消息 ID。找到 SubscribeURL,然后复制引号内的 URL。
- 将此 URL 链接粘贴到您的网络浏览器中。
- 登录 AWS 管理控制台,然后导航至账户 B 中的 Amazon SNS 控制台。选择主题,然后选择您的 SNS 主题。
- 查看订阅下的订阅状态,验证该订阅已确认。
故障排除提示
当我在 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 - 错误消息: 设置属性访问策略时出错。无效参数: 策略错误:空。”
使用以下步骤对错误进行故障排除:
最佳实践
对您的 SQS 队列的 SNS 订阅进行身份验证。进行此配置后,只有主题所有者和订阅所有者才可以从 SQS 主题取消订阅 SNS 队列。
相关信息
将 Amazon SNS 消息发送到不同账户中的 Amazon SQS 队列
允许 Amazon Simple Storage Service(Amazon S3)事件通知发布到主题
尝试向 Amazon SNS 主题添加订阅者时,如何解决授权错误?