Amazon Simple Notification Service
开发人员指南 (API Version 2010-03-31)
AWS 服务或AWS文档中描述的功能,可能因地区/位置而异。点 击 Getting Started with Amazon AWS to see specific differences applicable to the China (Beijing) Region.

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

通过另一账户中的一项或多项 Amazon SQS 队列订阅,您可以向 Amazon SNS 主题发送通知。如果主题和队列在同一账户下,那么您可以采用相同方法设置主题和队列(参阅 发送 Amazon SNS 消息至 Amazon SQS 队列)。唯一区别在于您处理订阅确认的方式,它取决于您如何订阅为队列订阅主题。

队列所有者创建订阅

如果订阅由队列所有者创建,那么此订阅无需确认。Subscribe 操作完成后,队列应尽早开始接收来自主题的通知。主题所有者必须为队列所有者账户授予权限,允许其调用主题的 Subscribe 操作,从而促成队列所有者成功订阅主题所有者的主题。以下策略添加至账户 123456789012 中的主题 MyTopic 时,此策略将向账户 111122223333 授予权限,允许其调用账户 123456789012 中MyTopic 的 sns:Subscribe 操作。

Copy
{ "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-1:123456789012:MyTopic" } ] }

针对 MyTopic 设置此策略后,用户可以通过账户 111122223333 的证书登录 Amazon SNS 控制台以订阅主题。

使用 Amazon SQS 控制台为 Amazon SQS 队列订阅另一账户的主题

  1. 利用包含队列的 AWS 账户或该账户下的 IAM 用户具备的凭证,登录 AWS 管理控制台 并通过 https://console.amazonaws.cn/sns/ 打开 Amazon SNS 控制台。

  2. 确保您已拥有主题和队列的 ARN。创建订阅时,需要主题和队列的 ARN。

  3. 确保您设置队列 sqs:SendMessage 权限,以便您接收来自主题的消息。有关更多信息,请参阅 步骤 2. 为向 Amazon SQS 队列发送消息的 Amazon SNS 主题授予权限

  4. 在导航窗格中,选定“SNS Dashboard”。

  5. 在 “Dashboard”中的“Additional Actions”部分,单击 “Create New Subscription”。

  6. 在“Topic ARN”框中,输入主题 ARN。

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

  8. 在“Endpoint”框中,输入队列 ARN。

  9. 单击“Subscribe”。

  10. 对于“Subscription request received!”(订阅请求已接收!)消息,您应看到您必须确认订阅的文本显示。由于您是队列所有者,因此无需确认订阅。单击 Close (关闭)。您已完成订阅处理,此时可将向主题发布的通知消息发送至队列。

用户还可以使用 AWS 账户 111122223333 的访问密钥和私有密钥发布 sns-subscribe 命令或调用 Subscribe API 操作来为 Amazon SQS 队列订阅账户 123456789012 中的 MyTopic。以下 sns-subscribe 命令为账户 111122223333 中的队列 MyQ 订阅账户 123456789012 中的主题 MyTopic。

Copy
aws sns subscribe --topic-arn arn:aws:sns:us-east-1:123456789012:MyTopic --protocol sqs --notification-endpoint arn:aws:sqs:us-east-1:111122223333:MyQ

注意

要能够发送,队列必须拥有 Amazon SNS 的权限。

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

如果订阅由非队列所有者用户创建(例如,当账户 A 中的主题所有者在账户 B 中添加队列订阅),则必须对订阅进行确认。

重要

订阅主题前,必须确保您已设置队列 sqs:SendMessage 权限,以便接收来自主题的消息。请参阅步骤 2. 为向 Amazon SQS 队列发送消息的 Amazon SNS 主题授予权限

当用户调用 Subscribe 操作时,将发送 SubscriptionConfirmation 类型消息至队列,并在Amazon SNS控制台中显示订阅,同时将其订阅 ID 设置为 等待确认。读取来自队列消息的用户必须访问消息 SubscribeURL 值中指定的 URL 后,方能确认订阅。确认订阅前,向主题发布的通知不会发送至队列。您可以利用 Amazon SQS 控制台或 ReceiveMessage API 操作确认订阅。

通过 Amazon SQS 控制台确认订阅

  1. 登录 AWS 管理控制台并通过以下网址打开 Amazon SQS 控制台:https://console.amazonaws.cn/sqs/

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

  3. 从“Queue Action”下拉列表中,选定“View/Delete Messages”,然后单击“Start Polling for Messages”。将显示 SubscriptionConfirmation 类型消息。

  4. 在“Body”列中,单击“More Details”。

  5. 在文本框中,查找 SubscribeURL 值,并复制 URL。该 URL 将与以下 URL 相似。

    Copy
    https://sns.us-west-2.amazonaws.com/?Action=ConfirmSubscription&TopicArn=arn:aws:sns:us-west-2:123456789012:MyTopic&Token=2336412f37fb687f5d51e6e241d09c805d352fe148e56f8cff30f023ff35db8bccbc62721725b074841be6524bb215b0c45ec571ba1e7faacc309940c0b4b9e511ab85eba671412a4c314ecd446127ff1a9cfe08642b8e3738e73c279dd3ae565bd98f842ed992a4742ebec0946ebd9a
  6. 在 Web 浏览器中,将 URL 粘贴进地址栏,访问 URL。界面将显示与以下 XML 文档相似的响应。

    Copy
    <ConfirmSubscriptionResponse xmlns="http://sns.amazonaws.com/doc/2010-03-31/"> <ConfirmSubscriptionResult> <SubscriptionArn>arn:aws:sns:us-west-2:123456789012:MyTopic:c7fe3a54-ab0e-4ec2-88e0-db410a0f2bee</SubscriptionArn> </ConfirmSubscriptionResult> <ResponseMetadata> <RequestId>dd266ecc-7955-11e1-b925-5140d02da9af</RequestId> </ResponseMetadata> </ConfirmSubscriptionResponse>

    查看 Amazon SNS 控制台中的主题订阅时,您将看到订阅 ARN 替换了 订阅 ID 列中的 等待确认 消息。已订阅队列已准备好接收来自主题的消息。