本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
为亚马逊SQS队列订阅亚马逊主题 SNS
要允许亚马逊SNS主题向亚马逊SQS队列发送消息,请执行以下任一操作:
-
使用 Amazon SQS 控制台
,这样可以简化流程。有关更多信息,请参阅《亚马逊简单SQS队列服务开发者指南》中的 “为亚马逊队列订阅亚马逊队列” SNS 主题。 -
按照以下步骤进行操作:
要了解如何设置主题以向位于不同的 AWS账户中的队列发送消息,请参阅使用其他账户向亚马逊SQS队列发送亚马逊SNS消息。
要查看用于创建向两个队列发送消息的主题的 AWS CloudFormation 模板,请参阅通过以下方式自动SQS发送亚马逊SNS到亚马逊的消息 AWS CloudFormation。
第 1 步:获取队ARN列和主题
在为队列订阅你的主题时,你需要一份该队列ARN的副本。同样,在授予主题向队列发送消息的权限时,您需要该ARN主题的副本。
要获取队列ARN,您可以使用 Amazon SQS 控制台或GetQueueAttributesAPI操作。
ARN从 Amazon SQS 控制台获取队列
登录 AWS Management Console 并打开 Amazon SQS 控制台,网址为https://console.aws.amazon.com/sqs/
。 -
选中要获取的队列的ARN复选框。
-
从 “详情” 部分复制该ARN值,以便您可以使用它来订阅 Amazon SNS 主题。
要获取主题ARN,您可以使用 Amazon SNS 控制台、sns-get-topic-attributes
命令或GetQueueAttributes
API操作。
要ARN从 Amazon SNS 控制台获取主题
登录 Amazon SNS 控制台
。 -
在导航面板上,选择ARN要获取的主题。
-
从 “详情” 部分复制该ARN值,以便您可以使用它来授予 Amazon SNS 主题向队列发送消息的权限。
第 2 步:向亚马逊SNS主题授予向亚马逊SQS队列发送消息的权限
为了使亚马逊SNS主题能够向队列发送消息,您必须在队列上设置允许该亚马逊SNS主题执行sqs:SendMessage
操作的策略。
获取主题和队列之后,方可为队列订阅主题。如果您尚未创建主题或队列,请您立刻创建。有关更多信息,请参阅创建主题,并参阅《Amazon Simple Queue Service 开发人员指南》中的创建队列。
要对队列设置策略,您可以使用 Amazon SQS 控制台或SetQueueAttributesAPI操作。在开始之前,请确保您拥有要允许向队列发送消息的主题的。ARN如果要为队列订阅多个主题,策略必须对于每个主题包含一个 Statement
元素。
使用 Amazon SQS 控制台对队列设置 SendMessage 策略
登录 AWS Management Console 并打开 Amazon SQS 控制台,网址为https://console.aws.amazon.com/sqs/
。 -
选择要设置其策略的队列的框,然后依次选择 Access policy(访问策略)选项卡、编辑。
-
在 Access policy(访问策略)部分中,定义谁可以访问您的队列。
-
添加允许主题操作的一项条件。
-
设置
Principal
为 Amazon SNS 服务,如下例所示。 -
使用
aws:SourceArn
或aws:SourceAccount
全局条件键来防止混淆代理场景。要使用这些条件键,请将值设置ARN为主题的。如果您的队列订阅了多个主题,则可以改用aws:SourceAccount
。
例如,以下策略允许 MyTopic 向发送消息 MyQueue。
{ "Statement": [ { "Effect": "Allow", "Principal": { "Service": "sns.amazonaws.com" }, "Action": "sqs:SendMessage", "Resource": "arn:aws:sqs:us-east-2:123456789012:MyQueue", "Condition": { "ArnEquals": { "aws:SourceArn": "arn:aws:sns:us-east-2:123456789012:MyTopic" } } } ] }
-
第 3 步:为队列订阅 Amazon SNS 主题
要通过主题向队列发送消息,您必须为队列订阅 Amazon SNS 主题。您可以通过队列来指定队列ARN。要订阅主题,您可以使用 Amazon SNS 控制台、sns-subscribe
CLI命令或Subscribe
API操作。在开始之前,请确保你有要订阅的队列。ARN
登录 Amazon SNS 控制台
。 -
在导航面板上,选择 Topics(主题)。
-
在主题 页上,选择一个主题。
-
在
MyTopic
页面上,在 “订阅” 页面中,选择 “创建订阅”。 -
在 Create subscription(创建订阅)页上的 Details(详细信息)部分中,执行以下操作:
-
验证主题ARN。
-
对于协议,请选择 Amazon SQS。
-
对于终端节点,输入 Amazon SQS 队列的。ARN
-
选择创建订阅。
确认订阅后,您新建订阅的“Subscription ID”将显示其订阅 ID。如果订阅由队列所有者创建,则订阅将自动确认,且订阅立刻可用。
一般情况下,您可以在您自己的账户中为您的队列订阅您自己的主题。但是,您还可以通过另一账户为队列订阅主题。如果创建订阅的用户并非队列所有者(例如,如果账户 A 的用户为账户 B 中的队列订阅账户 A 中的主题),则必须对订阅进行确认。有关通过不同账户订阅队列和确认订阅的更多信息,请参阅 使用其他账户向亚马逊SQS队列发送亚马逊SNS消息。
-
步骤 4:向用户授予对适当主题和队列操作的权限
您应使用 AWS Identity and Access Management (IAM) 仅允许相应的用户向亚马逊SNS主题发布消息以及从亚马逊SQS队列中读取/删除消息。有关控制IAM用户主题和队列操作的更多信息在 Amazon 上使用基于身份的政策 SNS,请参阅《亚马逊简单队列服务开发者指南》SQS中的 “亚马逊中的身份和访问管理”。
可以采取两种方式控制对主题或队列的访问:
-
向IAM用户或组添加策略。为用户授予主题或队列权限的最简单方式就是创建群组,并为该群组添加适当策略,然后向此群组添加用户。相比较而言,向群组添加或删除用户,比追踪您为单独用户而设定的各项策略要简单得多。
-
添加策略至主题或队列。如果您想将某个主题或队列的权限授予其他 AWS 账户,那么唯一的方法就是添加一个以 AWS 账户 您想要授予权限的委托人为其委托人的策略。
绝大多数情况下,您应使用第一种方法(通过向群组添加或删除适当用户的方式,向群组添加策略,管理用户权限)。如果您需要向另一账户的用户授予权限,那么应使用第二种方法。
向IAM用户或组添加策略
如果您向IAM用户或组添加了以下策略,则需要向该用户或群组中的成员授予对该主题执行sns:Publish
操作的权限 MyTopic。
{ "Statement": [ { "Effect": "Allow", "Action": "sns:Publish", "Resource": "arn:aws:sns:us-east-2:123456789012:MyTopic" } ] }
如果您向IAM用户或组添加了以下策略,则需要向该用户或组中的成员授予对队列 MyQueue 1 sqs:ReceiveMessage
和 MyQueue 2 执行和sqs:DeleteMessage
操作的权限。
{ "Statement": [ { "Effect": "Allow", "Action": [ "sqs:ReceiveMessage", "sqs:DeleteMessage" ], "Resource": [ "arn:aws:sqs:us-east-2:123456789012:MyQueue1", "arn:aws:sqs:us-east-2:123456789012:MyQueue2" ] } ] }
添加策略至主题或队列
以下策略示例显示如何为主题和队列授予另一账户授权。
注意
当您向其他用户授予对您账户中某项资源的 AWS 账户 访问权限时,也就是向拥有该资源的管理员级访问权限(通配符访问权限)的IAM用户授予权限。其他账户中的所有其他IAM用户都会被自动拒绝访问您的资源。如果您想向该IAM用户授予 AWS 账户 访问您资源的权限,则该账户或具有管理员级别访问权限的IAM用户必须将资源权限委托给这些IAM用户。有关跨账户委托的更多信息,请参阅《使用IAM指南》中的启用跨账户访问权限。
如果您向账户 123456789012 MyTopic 中的某个主题添加了以下策略,则需要向账户 111122223333 授予对该主题执行操作的权限。sns:Publish
{ "Statement": [ { "Effect": "Allow", "Principal": { "AWS": "111122223333" }, "Action": "sns:Publish", "Resource": "arn:aws:sns:us-east-2:123456789012:MyTopic" } ] }
如果您向账户 123456789012 MyQueue 中的队列添加了以下策略,则需要授予账户 111122223333 对该队列执行和操作的权限。sqs:ReceiveMessage
sqs:DeleteMessage
{ "Statement": [ { "Effect": "Allow", "Principal": { "AWS": "111122223333" }, "Action": [ "sqs:DeleteMessage", "sqs:ReceiveMessage" ], "Resource": [ "arn:aws:sqs:us-east-2:123456789012:MyQueue" ] } ] }
步骤 5:测试主题的队列订阅
通过发布主题,查看主题向队列发送的消息,可以测试主题的队列订阅情况。
使用 Amazon SNS 控制台向主题发布内容
-
使用 AWS 账户 或有权发布主题的IAM用户的证书,登录 AWS Management Console 并打开亚马逊SNS控制台,网址为https://console.aws.amazon.com/sns/
。 -
在导航面板上,选择主题,然后选择发布到主题。
-
在主题框中,输入主题(例如
Testing publish to queue
),在消息框中,输入一些文字(例如Hello world!
),然后选择发布消息。界面将显示如下消息:“Your message has been successfully published”(您的消息已成功发布)。
使用 Amazon SQS 控制台查看来自该主题的消息
-
使用 AWS 账户 或有权查看队列中消息的IAM用户的证书,登录 AWS Management Console 并打开亚马逊SQS控制台,网址为https://console.aws.amazon.com/sqs/
。 -
选择已订阅该主题的 queue(队列)。
-
选择 Send and receive messages(发送和接收消息),然后选择 Poll for messages(轮询消息)。界面将显示“Notification”类型消息。
-
在正文列中,选择更多详细信息。“消息详细信息” 框包含一个JSON文档,其中包含您向该主题发布的主题和消息。该消息与以下JSON文档类似。
{ "Type" : "Notification", "MessageId" : "63a3f6b6-d533-4a47-aef9-fcf5cf758c76", "TopicArn" : "arn:aws:sns:us-west-2:123456789012:MyTopic", "Subject" : "Testing publish to subscribed queues", "Message" : "Hello world!", "Timestamp" : "2012-03-29T05:12:16.901Z", "SignatureVersion" : "1", "Signature" : "EXAMPLEnTrFPa3...", "SigningCertURL" : "https://sns.us-west-2.amazonaws.com/SimpleNotificationService-f3ecfb7224c7233fe7bb5f59f96de52f.pem", "UnsubscribeURL" : "https://sns.us-west-2.amazonaws.com/?Action=Unsubscribe&SubscriptionArn=arn:aws:sns:us-west-2:123456789012:MyTopic:c7fe3a54-ab0e-4ec2-88e0-db410a0f2bee" }
-
选择关闭。您已经成功发布到一个主题,该主题向队列发送通知消息。