将 Amazon SNS 消息发送到不同账户中的 Amazon SQS 队列
通过另一账户中的一项或多项 Amazon SQS 队列订阅,您可以向 Amazon SNS 主题发布通知。如果主题和队列在同一账户下,那么您可以采用相同方法设置主题和队列(参阅 扇出到 Amazon SQS 队列)。主要区别在于您处理订阅确认的方式,这取决于您如何为队列订阅主题。
队列拥有者创建订阅
创建 Amazon SQS 队列的账户是队列拥有者。如果订阅由队列所有者创建,那么此订阅无需确认。一旦 Subscribe
操作完成后,队列即开始接收来自主题的通知。主题所有者必须提供队列所有者的账户权限,允许其对主题调用 Subscribe
操作,从而让队列所有者订阅主题所有者的主题。
步骤 1:使用 Amazon Web Services Management Console 设置主题策略
登录 Amazon SNS 控制台
。 -
在导航面板上,选择 Topics(主题)。
-
选择一个主题,然后选择 Edit(编辑)。
-
在 Edit
MyTopic
(编辑 MyTopic)页上,展开 Access policy(访问策略)部分。 -
输入以下策略:
{ "Statement":[{ "Effect":"Allow", "Principal":{ "AWS":"111122223333" }, "Action":"sns:Subscribe", "Resource":"arn:aws:sns:us-east-2:123456789012:MyTopic" }] }
此策略授予账户
111122223333
对账户123456789012
中的MyTopic
调用sns:Subscribe
的权限。具有账户
111122223333
的凭证的用户可以订阅MyTopic
。此权限允许账户 ID 将权限委派给其 IAM 用户/角色。只有根账户或管理员用户才可以调用sns:Subscribe
。IAM 用户/角色还必须让sns:subscribe
允许他们的队列订阅。 -
选择保存更改。
具有账户
111122223333
的凭证的用户可以订阅 MyTopic。
步骤 2:使用 Amazon Web Services Management Console 将 Amazon SQS 队列订阅添加到另一个 Amazon Web Services 账户 中的主题
在开始之前,请确保您具有主题和队列的 ARN,并且已授予该主题将消息发送到队列的权限。
登录 Amazon SQS 控制台
。 -
在导航窗格中,选择 Queues(队列)。
-
从队列列表中,选择 queue(排队)以订阅 Amazon SNS 主题。
-
从 Actions(操作)中,选择 Subscribe to Amazon SNS topic(订阅 Amazon SNS 主题)。
-
从 Specify an Amazon SNS topic available for this queue menu(指定可用于此队列菜单的 Amazon SNS 主题)中,选择队列的 SNS topic(SNS 主题)。
-
选择 Enter Amazon SNS topic ARN(输入 Amazon SNS 主题 ARN),然后输入主题的 Amazon Resource Name (ARN)。
-
选择保存。
注意 -
要能够与服务通信,队列必须具有 Amazon SNS 的权限。
-
由于您是队列的所有者,因此您无需确认订阅。
-
非队列所有者用户创建订阅
创建订阅但不是队列所有者的任何用户都必须确认订阅。
使用 Subscribe
操作时,Amazon SNS 向队列发送订阅确认。订阅将显示在 Amazon SNS 控制台中,其订阅 ID 设置为等待确认。
要确认订阅,具有从队列读取消息权限的用户必须访问订阅 URL。确认订阅前,向主题发布的通知不会发送至队列。要确认订阅,您可以使用 Amazon SQS 控制台或 ReceiveMessage
操作。
在为终端节点订阅主题之前,请通过为队列设置 sqs:SendMessage
权限来确保队列可以接收来自主题的消息。有关更多信息,请参阅步骤 2. 为向 Amazon SQS 队列发送消息的 Amazon SNS 主题授予权限。
步骤 2:使用 Amazon Web Services Management Console 将 Amazon SQS 队列订阅添加到另一个 Amazon Web Services 账户 中的主题
在开始之前,请确保您具有主题和队列的 ARN,并且已授予该主题将消息发送到队列的权限。
登录 Amazon SNS 控制台
。 -
在导航面板中,选择 Subscriptions(订阅)。
-
在 Subscriptions(订阅)页面上,选择 Create subscription(创建订阅)。
-
在 Create subscription(创建订阅)页上的 Details(详细信息)部分中,执行以下操作:
-
对于 Topic ARN (主题 ARN),输入主题的 ARN。
-
对于 Protocol(协议),选择 Amazon SQS。
-
对于 Endpoint(终端节点),输入队列的 ARN。
-
选择 Create subscription(创建订阅)。
注意 -
要能够与服务通信,队列必须具有 Amazon SNS 的权限。
-
由于您是队列的所有者,因此您无需确认订阅。
-
-
使用 Amazon Web Services Management Console确认订阅
-
登录 Amazon SQS 控制台
。 -
选择主题处于等待订阅阶段的队列。
-
依次选择 Queue Action(队列操作)、View/Delete Messages(查看/删除消息)和 Start Polling for Messages(开始轮询消息)。
队列中会收到一条带有订阅确认的消息。
-
在 Body(正文)列中,执行以下操作:
-
选择 More Details(更多详情)。
-
在 Message Details(消息详细信息)对话框中,找到并记下 SubscribeURL 值,例如:
https://sns.us-west-2.amazonaws.com/?Action=ConfirmSubscription&TopicArn=arn:aws:sns:us-east-2:123456789012:MyTopic&Token=2336412f37fb...
-
-
在 Web 浏览器中,导航到此 URL。
将显示 XML 响应,例如:
<ConfirmSubscriptionResponse> <ConfirmSubscriptionResult> <SubscriptionArn>arn:aws:sns:us-east-2:123456789012:MyTopic:1234a567-bc89-012d-3e45-6fg7h890123i</SubscriptionArn> </ConfirmSubscriptionResult> <ResponseMetadata> <RequestId>abcd1efg-23hi-jkl4-m5no-p67q8rstuvw9</RequestId> </ResponseMetadata> </ConfirmSubscriptionResponse>
已订阅队列已准备好接收来自主题的消息。
-
(可选)如果您在 Amazon SNS 控制台中查看主题订阅,则可以看到等待确认消息已被 Subscription ID(订阅 ID)列中的订阅 ARN 取代。