IAM策略绑定SNS主题:未加密SNS投递加密SQS队列问题咨询
报错原因
你收到MalformedPolicyDocumentException报错是因为KMS密钥策略属于资源型策略,所有权限声明(Statement)必须指定Principal字段,明确授权给哪个身份,你新增的两条语句都没有填写Principal,同时还有两个配置错误:
- KMS密钥策略仅用于管控KMS相关操作的权限,不能在其中声明
sqs:SendMessage这类非KMS服务的权限,该权限需要配置到SQS队列的资源策略中 - KMS密钥策略的
Resource字段固定填*即可,不需要填写KMS密钥自身ARN
问题1解答
IAM角色不能直接绑定到SNS主题、SQS队列这类资源,AWS没有为这类服务资源直接绑定IAM角色的能力。为特定资源授予权限共有三种常见方式:
- 资源型策略:SNS主题、SQS队列、KMS密钥都支持附加资源型策略,直接在策略中指定允许的身份(IAM用户/角色、AWS服务主体等)对该资源执行对应操作即可
- IAM身份策略:给需要访问资源的IAM身份(用户、角色、用户组)附加权限策略,明确允许该身份访问对应资源
- 服务关联角色:仅适用于AWS服务内部的访问场景,由AWS预先定义权限边界,不需要手动配置
问题2解答
指南中提到的producer(生产者)指的是所有往SNS主题发布消息的实体,既不是SNS主题本身,也不是AWS根账户:
- 如果你用EC2实例往SNS发消息,EC2关联的IAM角色就是生产者
- 如果你用Lambda函数触发SNS,Lambda的执行角色就是生产者
- 如果你在控制台手动发消息,你登录使用的IAM用户就是生产者
正确配置步骤
你已经创建了生产者IAM角色,按以下步骤配置即可:
- 修改KMS密钥策略,新增一条声明给生产者IAM角色授权:
{ "Sid": "Allow producer IAM role to use KMS key", "Effect": "Allow", "Principal": { "AWS": "替换为你创建的生产者IAM角色的ARN" }, "Action": [ "kms:GenerateDataKey", "kms:Decrypt" ], "Resource": "*" }
- 给生产者IAM角色附加权限策略,允许它向SNS主题发布消息:
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": "sns:Publish", "Resource": "替换为你的SNS主题ARN" } ] }
- 如果你还未配置SQS队列的资源策略,新增以下声明允许SNS向队列投递消息:
{ "Sid": "Allow SNS to send messages to encrypted SQS", "Effect": "Allow", "Principal": { "Service": "sns.amazonaws.com" }, "Action": "sqs:SendMessage", "Resource": "替换为你的SQS队列ARN", "Condition": { "ArnEquals": { "aws:SourceArn": "替换为你的SNS主题ARN" } } }
内容的提问来源于stack exchange,提问作者dmoini
相关产品推荐
相关产品推荐

