Share Your AWS re:Post Experience - Quick 3 Question Survey
Help us improve AWS re:Post! We're interested in understanding how you use re:Post and its impact on your AWS journey. Please take a moment to complete our brief 3-question survey.
为什么我无法发布或订阅 Amazon SNS 主题?
我无法发布或订阅 Amazon Simple Notification Service (Amazon SNS) 主题。我该如何解决此问题?
简短描述
若没有所需权限,AWS Identity and Access Management (IAM) 资源或身份将无法发布或订阅 Amazon SNS 主题。
要授予发布或订阅 Amazon SNS 主题所需的 IAM 权限,请根据您的使用案例执行以下操作之一。
**注意:**Amazon SNS 使用基于 IAM 身份的访问策略和基于 Amazon SNS 资源的访问策略来授予对 SNS 主题的访问权限。您可以使用 IAM 策略限制用户或角色对 Amazon SNS 操作和主题的访问。IAM 策略只能限制 AWS 账户内的用户访问,而不能限制其他 AWS 账户的访问。有关更多信息,请同时参阅 IAM 和 Amazon SNS 策略。
解决方法
向其他 AWS 服务授予发布到 Amazon SNS 主题的权限
您的 Amazon SNS 主题的基于资源的策略必须允许其他 AWS 服务向主题发布消息。查看主题的访问策略以确认它具有所需的权限,并根据需要添加这些权限。
要添加所需的权限,请编辑 Amazon SNS 主题的访问策略,使其包含以下权限声明。
重要提示:将 <service> 替换为 AWS 服务。
{ "Sid": "Allow-AWS-Service-to-publish-to-the-topic", "Effect": "Allow", "Principal": { "Service": "<service>.amazonaws.com" }, "Action": "sns:Publish", "Resource": "arn:aws:sns:your_region:123456789012:YourTopicName" }
**重要提示:**这些权限允许有权访问您的 SNS 主题的 Amazon Resource Name (ARN) 的任何人通过服务终端节点向主题发布消息。您可以添加全局条件键来限制对特定资源的发布权限。以下示例使用 arnLike 条件运算符和 aws:SourceArn 全局条件键。有关更多信息,请参阅 Amazon SNS 访问控制的示例案例。
将 Amazon SNS 发布权限限制到特定资源的 IAM 策略示例
**重要提示:**将 <region> 替换为资源的 AWS 区域。将 <account-id> 替换为您的账户 ID。将 <resource-name> 替换为资源的名称。将 <service> 替换为 AWS 服务。
{ "Sid": "Allow-AWS-Service-to-publish-to-the-topic", "Effect": "Allow", "Principal": { "Service": "<service>.amazonaws.com" }, "Action": "sns:Publish", "Resource": "arn:aws:sns:your_region:123456789012:YourTopicName", "Condition": { "ArnLike": { "aws:SourceArn": "arn:aws:<service>:<region>:<account-id>:<resource-type>:<resource-name>" } } }
注意:Amazon S3 不支持 FIFO SNS 主题。如果主题策略中有 S3 ARN,请确保它不是存储桶文件夹的路径。例如:arn:aws:s3:*:*:mys3-bucket/*
允许 IAM 用户或角色订阅和发布到 Amazon SNS 主题
默认情况下,只有主题拥有者可以发布或订阅主题。要允许其他 IAM 实体订阅和发布到您的主题,您的主题的基于身份的策略必须授予所需的权限。
**重要提示:**确保 IAM 实体的策略或 SNS 主题的访问策略均未明确拒绝访问 SNS 资源。有关更多信息,请参阅显式拒绝与隐式拒绝之间的区别。
如果 IAM 实体和 SNS 主题位于不同的 AWS 账户中
请执行以下两项操作:
1. 将 IAM 策略声明附加到允许实体运行“sns:Subscribe”和“sns:Publish”操作的 IAM 实体。有关说明,请参阅添加和删除 IAM 身份权限。
以下是一个基于 IAM 身份的策略示例,该策略允许 IAM 实体订阅和发布 SNS 主题:
{ "Statement": [ { "Effect": "Allow", "Action": [ "sns:Publish", "sns:Subscribe" ], "Resource": "arn:aws:sns:your_region:123456789012:YourTopicName" } ] }
2. 将 SNS 策略声明附加到您主题的访问策略,以允许 IAM 实体运行“sns:Subscribe”和“sns:Publish”操作。有关说明,请参阅如何编辑我的 Amazon SNS 主题的访问策略?
以下是允许 IAM 实体订阅和发布 SNS 主题的 Amazon SNS 主题访问策略示例:
{ "Statement": [ { "Sid": "Allow-SNS-Permission", "Effect": "Allow", "Principal": { "AWS": "111122223333" }, "Action": [ "sns:Publish", "sns:Subscribe" ], "Resource": "arn:aws:sns:your_region:123456789012:YourTopicName" } ] }
注意:****委托人可以是基于 IAM 身份的用户或角色,也可以是 AWS 账号。有关更多信息,请参阅 AWS JSON 策略元素:Principal。
如果 IAM 实体和 SNS 主题在同一账户中
请执行以下任一操作,但不能同时执行两项操作:
将 IAM 策略声明附加到允许实体运行“sns:Subscribe”和“sns:Publish”操作的 IAM 实体。
-或者-
将 SNS 策略声明附加到您主题的访问策略,以允许 IAM 实体运行“sns:Subscribe”和“sns:Publish”操作。
有关策略声明示例,请参阅本文的如果 IAM 实体和 SNS 主题位于不同的 AWS 账户中部分。
(对于激活服务器端加密 (SSE) 的主题)确认您的主题有必要的 AWS Key Management (AWS KMS) 权限
如果您的主题已激活 SSE,则您的 Amazon SNS 主题必须使用客户管理的 AWS KMS 密钥。此 KMS 密钥必须包含自定义密钥策略,此策略授予其他 AWS 服务足够的密钥使用权限。
以下权限是最低要求:
“kms:Decrypt”
“kms:GenerateDataKey*”
要设置必要的 AWS KMS 权限,请执行以下操作:
1. 创建由客户管理的新 KMS 密钥,并且包含访问其他 AWS 服务所需的必要权限。
2. 使用刚创建的自定义 KMS 密钥为您的 Amazon SNS 主题配置 SSE。
3. 配置 AWS KMS 权限,允许其他 AWS 服务向您的已加密主题发布消息。
允许其他 AWS 服务向加密 SNS 主题发布消息的 IAM 策略声明示例
重要提示:将 <service> 替换为 AWS 服务。
{ "Sid": "Allow-a-service-to-use-this-key", "Effect": "Allow", "Principal": { "Service": "<service>.amazonaws.com" }, "Action": [ "kms:Decrypt", "kms:GenerateDataKey*" ], "Resource": "*" }
相关信息

相关内容
- AWS 官方已更新 3 个月前
- AWS 官方已更新 2 年前
- AWS 官方已更新 1 年前
- AWS 官方已更新 8 个月前