Amazon Simple Notification Service
开发人员指南
AWS 文档中描述的 AWS 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 AWS 服务入门

向不同账户中的 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-1:123456789012:MyTopic" } ] }

设置策略

  1. 选择主题,然后选择主题的 ARN。

  2. 主题详细信息:我的主题页面上,选择其他主题操作编辑主题策略

  3. 编辑主题策略对话框中,选择高级视图,输入策略,然后选择更新

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

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

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

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

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

  4. 在导航面板上,选择 SNS 控制面板

  5. 控制面板中的其他操作部分,选择创建新订阅

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

  7. 对于协议,选择 Amazon SQS

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

  9. 选择 Subscribe

  10. 对于订阅请求已收到! 消息,您应看到您必须确认订阅的文本。由于您是队列所有者,因此无需确认订阅。选择 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-1:123456789012:MyTopic --protocol sqs --notification-endpoint arn:aws:sqs:us-east-1:111122223333:MyQ

注意

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

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

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

重要

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

当用户调用 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. 正文列中,选择更多详细信息

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

    https://sns.cn-north-1.amazonaws.cn/?Action=ConfirmSubscription&TopicArn=arn:aws:sns:cn-north-1:123456789012:MyTopic&Token=2336412f37fb687f5d51e6e241d09c805d352fe148e56f8cff30f023ff35db8bccbc62721725b074841be6524bb215b0c45ec571ba1e7faacc309940c0b4b9e511ab85eba671412a4c314ecd446127ff1a9cfe08642b8e3738e73c279dd3ae565bd98f842ed992a4742ebec0946ebd9a
  6. 在 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 列中的等待确认消息。已订阅队列已准备好接收来自主题的消息。