向不同账户中的 Amazon SQS 队列发送 Amazon SNS 消息
通过另一账户中的一项或多项 Amazon SQS 队列订阅,您可以向 Amazon SNS 主题发布通知。如果主题和队列在同一账户下,那么您可以采用相同方法设置主题和队列(参阅 将 Amazon SQS 队列作为订阅者)。唯一区别在于您处理订阅确认的方式,它取决于您如何订阅为队列订阅主题。
队列所有者创建订阅
如果订阅由队列所有者创建,那么此订阅无需确认。Subscribe
操作完成后,队列应尽早开始接收来自主题的通知。主题所有者必须为队列所有者账户授予权限,允许其调用主题的 Subscribe
操作,从而促成队列所有者成功订阅主题所有者的主题。在将以下策略添加至账户 123456789012
中的主题“我的主题”时,此策略将向账户 111122223333
授予权限,允许其调用账户 123456789012 中“我的主题”中的 sns:Subscribe
操作。
{ "Version":"2012-10-17", "Id":"MyTopicSubscribePolicy", "Statement":[{ "Sid":"Allow-other-account-to-subscribe-to-topic", "Effect":"Allow", "Principal":{ "AWS":"111122223333" }, "Action":"sns:Subscribe", "Resource":"arn:aws:sns:us-east-2:123456789012:MyTopic" } ] }
设置策略
-
选择主题,然后选择主题的 ARN。
-
在主题详细信息:我的主题页面上,选择其他主题操作、编辑主题策略。
-
在编辑主题策略对话框中,选择高级视图,输入策略,然后选择更新。
针对“我的主题”设置此策略后,用户可以通过账户 111122223333 的凭证登录 Amazon SNS 控制台以订阅主题。
使用 Amazon SQS 控制台为 Amazon SQS 队列订阅另一账户的主题
-
利用包含队列的 AWS 账户或该账户下的 IAM 用户的凭证,登录 AWS 管理控制台 并通过 https://console.amazonaws.cn/sns/ 打开 Amazon SNS 控制台。
-
确保您已拥有主题和队列的 ARN。创建订阅时,需要主题和队列的 ARN。
-
确保您设置队列
sqs:SendMessage
权限,以便您接收来自主题的消息。有关更多信息,请参阅 为主题授予向队列发送消息的权限。 -
在导航面板上,选择 SNS 控制面板。
-
在控制面板中的其他操作部分,选择创建新订阅。
-
在“Topic ARN”框中,输入主题 ARN。
-
对于协议,选择 Amazon SQS。
-
在“Endpoint”框中,输入队列 ARN。
-
选择 Subscribe。
-
对于订阅请求已收到! 消息,您应看到您必须确认订阅的文本。由于您是队列所有者,因此无需确认订阅。选择 Close。您已完成订阅处理,此时可将向主题发布的通知消息发送至队列。
用户还可以使用 AWS 账户 111122223333 的访问密钥和私有密钥来发布 sns-subscribe
命令或调用 Subscribe
API 操作,进而为 Amazon SQS 队列订阅账户 123456789012 中的“我的主题”。以下 sns-subscribe
CLI 命令为账户 111122223333 中的队列 MyQ 订阅账户 123456789012 中的主题“我的主题”。
aws sns subscribe --topic-arn arn:aws:sns:us-east-2:123456789012:MyTopic --protocol sqs --notification-endpoint arn:aws:sqs:us-east-2:111122223333:MyQ
注意
要能够发送,队列必须拥有 Amazon SNS 的权限。
非队列所有者用户创建订阅
如果订阅由非队列所有者用户创建(例如,当账户 A 中的主题所有者在账户 B 中添加队列订阅),则必须对订阅进行确认。
重要
订阅主题前,必须确保您已设置队列 sqs:SendMessage
权限,以便接收来自主题的消息。请参阅为主题授予向队列发送消息的权限。
当用户调用 Subscribe
操作时,将发送 SubscriptionConfirmation
类型消息至队列,并在Amazon SNS控制台中显示订阅,同时将其订阅 ID 设置为等待确认。读取来自队列消息的用户必须访问消息 SubscribeURL
值中指定的 URL 后,方能确认订阅。确认订阅前,向主题发布的通知不会发送至队列。您可以利用 Amazon SQS 控制台或 ReceiveMessage API 操作确认订阅。
通过 Amazon SQS 控制台确认订阅
-
登录 AWS 管理控制台并通过以下网址打开 Amazon SQS 控制台:https://console.amazonaws.cn/sqs/。
-
选择主题处于等待订阅阶段的队列。
-
从 Queue Action (队列操作) 下拉列表中,选择 View/Delete Messages (查看/删除消息),然后选择 Start Polling for Messages (开始轮询消息)。将显示 SubscriptionConfirmation 类型消息。
-
在正文列中,选择更多详细信息。
-
在文本框中,查找 SubscribeURL 值,并复制 URL。该 URL 将与以下 URL 相似。
https://sns.cn-north-1.amazonaws.cn/?Action=ConfirmSubscription&TopicArn=arn:aws:sns:cn-north-1:123456789012:MyTopic&Token=2336412f37fb687f5d51e6e241d09c805d352fe148e56f8cff30f023ff35db8bccbc62721725b074841be6524bb215b0c45ec571ba1e7faacc309940c0b4b9e511ab85eba671412a4c314ecd446127ff1a9cfe08642b8e3738e73c279dd3ae565bd98f842ed992a4742ebec0946ebd9a
-
在 Web 浏览器中,将 URL 粘贴进地址栏,访问 URL。界面将显示与以下 XML 文档相似的响应。
<ConfirmSubscriptionResponse xmlns="http://sns.amazonaws.cn/doc/2010-03-31/"> <ConfirmSubscriptionResult> <SubscriptionArn>arn:aws:sns:cn-north-1:123456789012:MyTopic:c7fe3a54-ab0e-4ec2-88e0-db410a0f2bee</SubscriptionArn> </ConfirmSubscriptionResult> <ResponseMetadata> <RequestId>dd266ecc-7955-11e1-b925-5140d02da9af</RequestId> </ResponseMetadata> </ConfirmSubscriptionResponse>
查看 Amazon SNS 控制台中的主题订阅时,您将看到订阅 ARN 替换了订阅 ID 列中的等待确认消息。已订阅队列已准备好接收来自主题的消息。