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 SNS 访问控制的案例

本节介绍了几个访问控制典型使用案例。

允许 AWS 账户访问一个主题

假设您在 Amazon SNS 系统中有一个主题。最简单的情况是,您希望让您的一个或多个 AWS 账户访问某个特定主题操作(例如,Publish)。

通过 Amazon SNS API 操作 AddPermission 即可做到这一点。它将获得一个主题,一组 AWS 账户 ID 号,一组操作措施和一个标签,且将自动在主题访问控制策略中创建一个新的语句。这样,您不需要编写自己的策略,因为 Amazon SNS 将自动为您征程新的策略语句。随后,您能使用标签通过调用RemovePermission取消这个策略语句。

例如,如果您使用 AWS 账户 ID 1111-2222-3333、Publish 操作及标签 give-1234-publish 对主题 arn:aws:sns:us-east-1:444455556666:MyTopic 调用 AddPermission,那么 Amazon SNS 会生成并插入以下访问控制策略语句:

Copy
{ "Version":"2012-10-17", "Id":"AWSAccountTopicAccess", "Statement" :[ { "Sid":"give-1234-publish", "Effect":"Allow", "Principal" :{ "AWS":"111122223333" }, "Action":["sns:Publish"], "Resource":"arn:aws:sns:us-east-1:444455556666:MyTopic" } ] }

添加这条语句之后,具有 AWS 账户 1111-2222-3333 的用户就可向该主题发布消息。

限制 HTTPS 订阅

在这样的使用情况下,为了安全起见,您想要只通过 HTTPS 允许您的主题订阅请求

当授权某人访问您的主题时,您需要了解如何编写您的策略,因为 Amazon SNS AddPermission 操作不让您指定协议限制。这样,您可编写你自己的策略,然后使用SetTopicAttributes操作为您新的策略设置新主题Policy属性。

以下完整策略示例让 AWS 账户 ID 1111-2222-3333 能够订阅一个主题的通知。

Copy
{ "Version":"2012-10-17", "Id":"SomePolicyId", "Statement" :[ { "Sid":"Statement1", "Effect":"Allow", "Principal" :{ "AWS":"111122223333" }, "Action":["sns:Subscribe"], "Resource": "arn:aws:sns:us-east-1:444455556666:MyTopic", "Condition" :{ "StringEquals" :{ "sns:Protocol":"https" } } } ] }

向一个 Amazon SQS 队列发布消息

在此使用案例中,您希望从您的主题发布消息至 Amazon SQS 队列。和 Amazon SNS 一样,Amazon SQS 将使用 Amazon 访问控制策略语言。为了让 Amazon SNS 发送消息,您将需要使用 Amazon SQS 操作 SetQueueAttributes 在队列中设置策略。

此外,您需要掌握如何编写自己的策略,因为 Amazon SQSAddPermission 操作不能创建带条件的策略语句。

需要注意的是,以下展示的例子是一个 Amazon SQS 策略(对您队列的访问进行控制),而不是一个 Amazon SNS 策略(对您主题的访问进行控制)。这些操作都是 Amazon SQS 操作,并且资源是队列的Amazon 资源名称 (ARN)。您可通过GetQueueAttributes操作检索队列的QueueArn属性决定队列的 ARN。

Copy
{ "Version":"2012-10-17", "Id":"MyQueuePolicy", "Statement" :[ { "Sid":"Allow-SNS-SendMessage", "Effect":"Allow", "Principal" :"*", "Action":["sqs:SendMessage"], "Resource": "arn:aws:sqs:us-east-1:444455556666:MyQueue", "Condition" :{ "ArnEquals" :{ "aws:SourceArn":"arn:aws:sns:us-east-1:444455556666:MyTopic" } } } ] }

这种策略,根据发送到队列信息的信息来源,利用aws:SourceArn条件限制对队列的访问。仅当消息来自您自己的主题时,您才可以使用这种策略允许 Amazon SNS 向您的队列发送消息。在该例中,您可以指定一个特定的主题,主题的 ARN 是 arn:aws:sns:us-east-1:444455556666:MyTopic。

前述策略是您可以编写并添加到特定队列的 Amazon SQS 策略的一个例子。该策略将授予 Amazon SNS 和其他 AWS 产品访问权限。Amazon SNS 为所有新建主题提供默认策略。这种默认策略能让所有其他 AWS 产品访问您的主题。默认策略使用一个aws:SourceArn条件确保 AWS 产品代表您拥有的 AWS 资源访问您的主题。

允许任何AWS资源向主题发布信息

在这种情况下,您想要配置一个主题策略以便另一个 AWS 账户资源(例如,Amazon S3 存储段,Amazon EC2 实例或 Amazon SQS 队列)能向主题发布消息。这个样例假定您编写自己的策略然后使用SetTopicAttributes操作为您新建策略设定主题Policy的属性。

在下列示例声明中,这些策略中的主题拥有者为 1111-2222-3333,AWS 资源拥有者为 4444-5555-6666。样例使 AWS 账户 ID 4444-5555-6666 能从 AWS 任何账户所有的 AWS 资源向 My-Topic 发布信息。

Copy
{ "Version":"2012-10-17", "Id":"MyAWSPolicy", "Statement" :[ { "Sid":"My-statement-id", "Effect":"Allow", "Principal" :"*", "Action":"sns:Publish", "Resource":"arn:aws:sns:us-east-1:111122223333:My-Topic", "Condition":{ "StringEquals":{ "AWS:SourceAccount":"444455556666" } } } ] }

允许 Amazon S3 存储段向主题发布消息

在本例中,您希望配置一个主题策略以便另外一个 AWS 账户的 Amazon S3 存储段能向您的主题发布消息。有关通过 Amazon S3 发布通知的更多信息,请转至设置存储段事件的通知

这个样例假定您编写自己的策略然后使用SetTopicAttributes操作为您新建策略设定主题Policy的属性。

以下示例语句通过使用 ArnLike 条件确保发出请求的资源的 ARN (AWS:SourceARN) 是一个 Amazon S3 ARN。您能使用类似的条件限制一组 Amazon S3 存储段的权限,甚至某个特定存储段的权限。在该示例中,主题所有者是 1111-2222-3333 并且 Amazon S3 所有者是 4444-5555-6666。该示例指出 4444-5555-6666 所拥有的任何 Amazon S3 存储桶都可以向 My-Topic 发布信息。

Copy
{ "Version":"2012-10-17", "Id":"MyAWSPolicy", "Statement" :[ { "Sid":"My-statement-id", "Effect":"Allow", "Principal" :"*", "Action":"sns:Publish", "Resource":"arn:aws:sns:us-east-1:111122223333:My-Topic", "Condition":{ "StringEquals":{ "AWS:SourceAccount":"444455556666" } , "ArnLike": {"AWS:SourceArn": "arn:aws:s3:*:*:*" } } } ] }