用于 Amazon SNS 访问控制的示例案例 - Amazon Simple Notification Service
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

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

用于 Amazon SNS 访问控制的示例案例

本节描述了针对访问控制的几个典型使用案例示例。

授予对主题的 Amazon Web Services 账户 访问权限

假设您在 Amazon SNS 系统中有一个主题。在最简单的情况下,您希望允许一个或多个 Amazon Web Services 账户 访问特定主题操作(例如 “发布”)。

使用 Amazon SNS API 操作 AddPermission 即可做到这一点。它需要一个主题、一个 Amazon Web Services 账户 ID 列表、一个操作列表和一个标签,然后自动在主题的访问控制策略中创建一个新声明。这样,您不需要编写自己的策略,因为 Amazon SNS 将自动为您生成新的策略语句。随后,您能使用标签通过调用RemovePermission取消这个策略语句。

例如,如果你调用 AddPermission arn: aws: sns: us-east-2:444455556666:,MyTopicID 为 1111-2222-3333 Amazon Web Services 账户 、Publish操作和标签,Amazon SNS 将生成并插入以下访问控制策略声明:grant-1234-publish

{ "Statement": [{ "Sid": "grant-1234-publish", "Effect": "Allow", "Principal": { "AWS": "111122223333" }, "Action": ["sns:Publish"], "Resource": "arn:aws:sns:us-east-2:444455556666:MyTopic" }] }

添加此语句后,拥有 Amazon Web Services 账户 1111-2222-3333 的用户可以向该主题发布消息。

限制 HTTPS 订阅

在以下示例中,您可以将通知传输协议限定为 HTTPS。

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

以下完整策略示例授予 Amazon Web Services 账户 ID 1111-2222-3333 订阅来自某个主题的通知的能力。

{ "Statement": [{ "Sid": "Statement1", "Effect": "Allow", "Principal": { "AWS": "111122223333" }, "Action": ["sns:Subscribe"], "Resource": "arn:aws:sns:us-east-2:444455556666:MyTopic", "Condition": { "StringEquals": { "sns:Protocol": "https" } } }] }

发布消息到 Amazon SQS 队列

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

此外,您需要了解如何编写自己的策略,因为 Amazon SQS AddPermission 操作不创建带条件的策略语句。

注意

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

{ "Statement": [{ "Sid": "Allow-SNS-SendMessage", "Effect": "Allow", "Principal": { "Service": "sns.amazonaws.com" }, "Action": ["sqs:SendMessage"], "Resource": "arn:aws:sqs:us-east-2:444455556666:MyQueue", "Condition": { "ArnEquals": { "aws:SourceArn": "arn:aws:sns:us-east-2:444455556666:MyTopic" } } }] }

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

前述策略是您可以编写并添加到特定队列的 Amazon SQS 策略的一个例子。它将授予访问亚马逊 SNS 和其他 Amazon 服务的权限。Amazon SNS 为所有新创建的主题授予默认策略。默认策略允许所有其他 Amazon 服务访问您的主题。此默认策略使用一个aws:SourceArn条件来确保 Amazon 服务仅代表您拥有的 Amazon 资源访问您的主题。

允许 Amazon S3 事件通知发布到主题

在这种情况下,您需要配置主题的策略,以便其他人 Amazon Web Services 账户的 Amazon S3 存储桶可以发布到您的主题中。有关通过 Amazon S3 发布通知的更多信息,请转至设置存储桶事件的通知

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

下面的示例语句使用 SourceAccount 条件,确保只有 拥Amazon S3有者账户才能访问主题。在本例中,主题所有者是 111122223333,Amazon S3 所有者是 444455556666。该示例指出,允许将 444455556666 拥有的任何 Amazon S3 存储桶发布到。 MyTopic

{ "Statement": [{ "Effect": "Allow", "Principal": { "Service": "s3.amazonaws.com" }, "Action": "sns:Publish", "Resource": "arn:aws:sns:us-east-2:111122223333:MyTopic", "Condition": { "StringEquals": { "AWS:SourceAccount": "444455556666" } } }] }

向 Amazon SNS 发布事件时,以下服务支持 aws:SourceAccount

  • Amazon API Gateway

  • 亚马逊 CloudWatch

  • Amazon DevOps Guru

  • 亚马逊 ElastiCache

  • 亚马逊 EventBridge

  • 亚马逊 GameLift

  • Amazon Pinpoint SMS 和 Voice API

  • Amazon RDS

  • Amazon Redshift

  • Amazon S3 Glacier

  • Amazon SES

  • Amazon Simple Storage Service

  • Amazon CodeCommit

  • Amazon Directory Service

  • Amazon Lambda

  • Amazon Systems Manager Incident Manager

允许 Amazon SES 向其他账户拥有的主题发布

您可以允许其他 Amazon 服务向另一个服务拥有的主题发布内容 Amazon Web Services 账户。假设您登录了 111122223333 账户,打开了 Amazon SES 并创建了一封电子邮件。要将有关此电子邮件的通知发布到 444455556666 账户拥有的 Amazon SNS 主题,您需要创建一个如下所示的策略。为此,您需要提供有关委托人(其他服务)和每个资源的所有权的信息。Resource 语句提供主题 ARN,其中包括主题所有者的账户 ID 444455556666。"aws:SourceOwner": "111122223333" 语句指定您的账户拥有该电子邮件。

{ "Version": "2008-10-17", "Id": "__default_policy_ID", "Statement": [ { "Sid": "__default_statement_ID", "Effect": "Allow", "Principal": { "Service": "ses.amazonaws.com" }, "Action": "SNS:Publish", "Resource": "arn:aws:sns:us-east-2:444455556666:MyTopic", "Condition": { "StringEquals": { "aws:SourceOwner": "111122223333" } } } ] }

向 Amazon SNS 发布事件时,以下服务支持 aws:SourceOwner

  • Amazon API Gateway

  • 亚马逊 CloudWatch

  • Amazon DevOps Guru

  • 亚马逊 ElastiCache

  • 亚马逊 GameLift

  • Amazon Pinpoint SMS 和 Voice API

  • Amazon RDS

  • Amazon Redshift

  • Amazon SES

  • Amazon CodeCommit

  • Amazon Directory Service

  • Amazon Lambda

  • Amazon Systems Manager Incident Manager

aws:SourceAccountaws:SourceOwner

重要

aws:SourceOwner 已弃用,新服务只能通过 aws:SourceArnaws:SourceAccount 与 Amazon SNS 集成。对于目前支持 aws:SourceOwner 的现有服务,Amazon SNS 仍保持向后兼容性。

aws:SourceAccountaws:SourceOwner 条件键由一些 Amazon Web Services 在它们发布到 Amazon SNS 主题时设置。如果支持,则该值将是服务代表其发布数据的 12 位 Amazon 账户 ID。一些服务支持其中一项,一些服务支持另一项。

允许组织中的账户 Amazon Organizations 向其他账户中的主题发布内容

该 Amazon Organizations 服务可帮助您集中管理账单,控制访问权限和安全性,并在整个系统中共享资源 Amazon Web Services 账户。

您可以在 Organizations 控制台中找到您的组织 ID。有关更多信息,请参阅从管理账户查看组织的详细信息

在此示例中,任何组织成员都myOrgId可以在账户 Amazon Web Services 账户 中向 Amazon SNS 主题发布内容MyTopic444455556666该策略使用 aws:PrincipalOrgID 全局条件键检查组织 ID 值。

{ "Statement": [ { "Effect": "Allow", "Principal": { "AWS": "*" }, "Action": "SNS:Publish", "Resource": "arn:aws:sns:us-east-2:444455556666:MyTopic", "Condition": { "StringEquals": { "aws:PrincipalOrgID": "myOrgId" } } } ] }

允许将任何 CloudWatch 警报发布到其他账户中的主题

在这种情况下,允许账户中的任何 CloudWatch 警报发布到账户111122223333中的 Amazon SNS 主题。444455556666

{ "Statement": [ { "Effect": "Allow", "Principal": { "AWS": "*" }, "Action": "SNS:Publish", "Resource": "arn:aws:sns:us-east-2:444455556666:MyTopic", "Condition": { "ArnLike": { "aws:SourceArn": "arn:aws:cloudwatch:us-east-2:111122223333:alarm:*" } } } ] }

仅限从特定 VPC 终端节点发布到 Amazon SNS 主题

在这种情况下,账户 444455556666 中的主题只允许从具有 ID vpce-1ab2c34d 的 VPC 终端节点发布。

{ "Statement": [{ "Effect": "Deny", "Principal": "*", "Action": "SNS:Publish", "Resource": "arn:aws:sns:us-east-2:444455556666:MyTopic", "Condition": { "StringNotEquals": { "aws:sourceVpce": "vpce-1ab2c34d" } } }] }