本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
将 Amazon SNS 消息发送到不同账户中的 Amazon SQS 队列
本文档介绍如何通过另一个账户中的一个或多个 Amazon SQS 队列订阅将通知发布到 Amazon SNS 主题。您可以像设置同一个账户一样设置主题和队列(参见将 Amazon SNS 通知扇出到 Amazon SQS 队列进行异步处理)。主要区别在于您如何处理订阅确认。这取决于你如何订阅队列中的话题。
我们建议尽可能按照队列所有者创建订阅部分中的步骤进行操作。队列所有者创建订阅时会自动进行确认。
注意
如果 Amazon SQS 队列有大量消息,建议队列所有者创建订阅。
队列拥有者创建订阅
创建 Amazon SQS 队列的账户是队列拥有者。如果订阅由队列所有者创建,那么此订阅无需确认。一旦 Subscribe 操作完成后,队列即开始接收来自主题的通知。要让队列所有者订阅主题,主题所有者必须向队列所有者的账户授予对该主题Subscribe执行操作的权限。
步骤 1:使用设置主题策略 Amazon Web Services 管理控制台
登录 Amazon SNS 控制台
。 -
在导航面板上,选择主题。
-
选择一个主题,然后选择 Edit(编辑)。
-
在 “编辑”
MyTopic页面上,展开 “访问策略” 部分。 -
输入以下策略:
{ "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 委托权限 user/role。只有 root 账户或管理员用户才能呼叫sns:Subscribe。IAM 还 user/role 必须sns:subscribe获得许可。 -
选择保存更改。
拥有账户凭证的用户
111122223333可以订阅 MyTopic。
第 2 步:向另一个主题添加 Amazon SQS 队列订阅 Amazon Web Services 账户 使用 Amazon Web Services 管理控制台
在开始之前,请确保您具有主题和队列的 ARN,并且已授予该主题将消息发送到队列的权限。
登录 Amazon SQS 控制台
。 -
在导航窗格中,选择 Queues(队列)。
-
从队列列表中,选择 queue(排队)以订阅 Amazon SNS 主题。
-
选择 Subscribe to Amazon SNS topic(订阅 Amazon SNS 主题)。
-
从 Specify an Amazon SNS topic available for this queue menu(指定可用于此队列菜单的 Amazon SNS 主题)中,选择队列的 Amazon SNS topic(Amazon 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 主题授予权限。
第 1 步:向另一个主题添加 Amazon SQS 队列订阅 Amazon Web Services 账户 使用 Amazon Web Services 管理控制台
在开始之前,请确保您具有主题和队列的 ARN,并且已授予该主题将消息发送到队列的权限。
登录 Amazon SNS 控制台
。 -
在导航面板中,选择订阅。
-
在订阅页面上,选择创建订阅。
-
在创建订阅页上的详细信息部分,执行以下操作:
-
对于 Topic ARN (主题 ARN),输入主题的 ARN。
-
对于 Protocol(协议),选择 Amazon SQS。
-
对于 Endpoint(终端节点),输入队列的 ARN。
-
选择 Create subscription(创建订阅)。
注意
-
要能够与服务通信,队列必须具有 Amazon SNS 的权限。
-
-
下面是允许 Amazon SNS 主题向 Amazon SQS 队列发送消息的示例策略声明。
{ "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" } } }
第 2 步:使用确认订阅 Amazon Web Services 管理控制台
-
登录 Amazon SQS 控制台
。 -
选择主题处于等待订阅阶段的队列。
-
选择 Send and receive messages(发送和接收消息),然后选择 Poll for messages(轮询消息)。
队列中会收到一条带有订阅确认的消息。
-
在 Body(正文)列中,执行以下操作:
-
选择 More Details(更多详情)。
-
在 Message Details(消息详细信息)对话框中,找到并记下 SubscribeURL 值。这是您的订阅链接(下面的示例)。有关 API 令牌验证的更多详细信息,请参阅
ConfirmSubscription《亚马逊 SNS API 参考》。https://sns.us-west-2.amazonaws.com/?Action=ConfirmSubscription&TopicArn=arn:aws:sns:us-east-2:123456789012:MyTopic&Token=2336412f37fb... -
记下订阅确认链接。必须将 URL 从队列拥有者传递给订阅拥有者。订阅所有者将该网址输入到亚马逊 SNS 控制台
。
-
-
以订阅拥有者 身份登录 Amazon SNS 控制台
。订阅拥有者执行确认。 -
选择相关主题。
-
在主题的订阅清单表格中选择相关订阅。它被标记为“Pending confirmation”(等待确认)。
-
选择 Confirm subscription(确认订阅)。
-
将出现一个提示订阅确认链接的模态框。粘贴 订阅确认链接。
-
在模态框中选择 Confirm subscription(确认订阅)。
将显示 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 取代。
如何强制订阅要求对取消订阅请求进行身份验证?
订阅拥有者必须在订阅确认后将 AuthenticateOnUnsubscribe 标志设置为 true。
-
如果订阅由队列拥有者创建,则
AuthenticateOnUnsubscribe自动设置为 true。 -
在没有身份验证的情况下导航到订阅确认链接时,无法将
AuthenticateOnUnsubscribe设置为 true。