将 Amazon SNS 消息发送到不同账户中的 Amazon SQS 队列 - Amazon Simple Notification Service
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

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

本文档介绍如何通过另一个账户中的一个或多个 Amazon SQS 队列订阅将通知发布到 Amazon SNS 主题。如果主题和队列在同一账户下,那么您可以采用相同方法设置主题和队列(参阅 扇出到 Amazon SQS 队列)。主要区别在于您处理订阅确认的方式,这取决于您如何为队列订阅主题。

最佳做法是尽可能遵循队列拥有者创建订阅部分中引用的步骤,因为当队列拥有者创建订阅时会自动进行确认。

注意

如果 Amazon SQS 队列有大量消息,建议队列所有者创建订阅。

队列拥有者创建订阅

创建 Amazon SQS 队列的账户是队列拥有者。如果订阅由队列所有者创建,那么此订阅无需确认。一旦 Subscribe 操作完成后,队列即开始接收来自主题的通知。主题所有者必须提供队列所有者的账户权限,允许其对主题调用 Subscribe 操作,从而让队列所有者订阅主题所有者的主题。

步骤 1:使用 Amazon Web Services Management Console 设置主题策略

  1. 登录 Amazon SNS 控制台

  2. 在导航面板上,选择 Topics(主题)。

  3. 选择一个主题,然后选择 Edit(编辑)。

  4. Edit MyTopic(编辑 MyTopic)页上,展开 Access policy(访问策略)部分。

  5. 输入以下策略:

    { "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 允许他们的队列订阅。

  6. 选择 Save changes(保存更改)。

    具有账户 111122223333 的凭证的用户可以订阅 MyTopic。

步骤 2:使用 Amazon Web Services Management Console 将 Amazon SQS 队列订阅添加到另一个 Amazon Web Services 账户 中的主题

在开始之前,请确保您具有主题和队列的 ARN,并且已授予该主题将消息发送到队列的权限

  1. 登录 Amazon SQS 控制台

  2. 在导航窗格中,选择 Queues(队列)。

  3. 从队列列表中,选择 queue(排队)以订阅 Amazon SNS 主题。

  4. 选择 Subscribe to Amazon SNS topic(订阅 Amazon SNS 主题)。

  5. Specify an Amazon SNS topic available for this queue menu(指定可用于此队列菜单的 Amazon SNS 主题)中,选择队列的 Amazon SNS topic(Amazon SNS 主题)。

  6. 选择 Enter Amazon SNS topic ARN(输入 Amazon SNS 主题 ARN),然后输入主题的 Amazon Resource Name (ARN)

  7. 选择 Save(保存)。

    注意
    • 要能够与服务通信,队列必须具有 Amazon SNS 的权限。

    • 由于您是队列的所有者,因此您无需确认订阅。

非队列所有者用户创建订阅

创建订阅但不是队列所有者的任何用户都必须确认订阅。

使用 Subscribe 操作时,Amazon SNS 向队列发送订阅确认。订阅将显示在 Amazon SNS 控制台中,其订阅 ID 设置为等待确认

要确认订阅,具有从队列中读取消息的权限的用户必须检索订阅确认 URL,而且订阅拥有者必须使用订阅确认 URL 以确认订阅。确认订阅前,向主题发布的通知不会发送至队列。要确认订阅,您可以使用 Amazon SQS 控制台或 ReceiveMessage 操作。

注意

在为终端节点订阅主题之前,请通过为队列设置 sqs:SendMessage 权限来确保队列可以接收来自主题的消息。有关更多信息,请参阅步骤 2. 为向 Amazon SQS 队列发送消息的 Amazon SNS 主题授予权限

步骤 1:使用 Amazon Web Services Management Console将 Amazon SQS 队列订阅添加到另一个 Amazon Web Services 账户中的主题

在开始之前,请确保您具有主题和队列的 ARN,并且已授予该主题将消息发送到队列的权限

  1. 登录 Amazon SNS 控制台

  2. 在导航面板中,选择 Subscriptions(订阅)。

  3. Subscriptions(订阅)页面上,选择 Create subscription(创建订阅)。

  4. Create subscription(创建订阅)页上的 Details(详细信息)部分中,执行以下操作:

    1. 对于 Topic ARN (主题 ARN),输入主题的 ARN。

    2. 对于 Protocol(协议),选择 Amazon SQS

    3. 对于 Endpoint(终端节点),输入队列的 ARN。

    4. 选择 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 Management Console确认订阅

  1. 登录 Amazon SQS 控制台

  2. 选择主题处于等待订阅阶段的队列。

  3. 选择 Send and receive messages(发送和接收消息),然后选择 Poll for messages(轮询消息)。

    队列中会收到一条带有订阅确认的消息。

  4. Body(正文)列中,执行以下操作:

    1. 选择 More Details(更多详情)。

    2. Message Details(消息详细信息)对话框中,找到并记下 SubscribeURL 值。这是您的订阅链接(下面的示例)。有关 API 令牌验证的更多详细信息,请参阅《Amazon SNS API 参考》中的 ConfirmSubscription

      https://sns.us-west-2.amazonaws.com/?Action=ConfirmSubscription&TopicArn=arn:aws:sns:us-east-2:123456789012:MyTopic&Token=2336412f37fb...
    3. 记下订阅确认链接。必须将 URL 从队列拥有者传递给订阅拥有者。订阅拥有者必须在 Amazon SNS 控制台中输入此 URL。

  5. 订阅拥有者 身份登录 Amazon SNS 控制台。订阅拥有者执行确认。

  6. 选择相关主题

  7. 在主题的订阅清单表格中选择相关订阅。它被标记为“Pending confirmation”(等待确认)。

  8. 选择 Confirm subscription(确认订阅)。

  9. 将出现一个提示订阅确认链接的模态框。粘贴 订阅确认链接。

  10. 在模态框中选择 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>

    已订阅队列已准备好接收来自主题的消息。

  11. (可选)如果您在 Amazon SNS 控制台中查看主题订阅,则可以看到等待确认消息已被 Subscription ID(订阅 ID)列中的订阅 ARN 取代。

如何强制订阅要求对取消订阅请求进行身份验证?

订阅拥有者必须在订阅确认后将 AuthenticateOnUnsubscribe 标志设置为 true。

  • 如果订阅由队列拥有者创建,则 AuthenticateOnUnsubscribe 自动设置为 true。

  • 在没有身份验证的情况下导航到订阅确认链接时,无法将 AuthenticateOnUnsubscribe 设置为 true。