You need to enable JavaScript to run this app. IAM策略绑定SNS主题:未加密SNS投递加密SQS队列问题咨询
优惠活动
大模型
产品
解决方案
定价
更多

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角色,按以下步骤配置即可:

  1. 修改KMS密钥策略,新增一条声明给生产者IAM角色授权:
{
    "Sid": "Allow producer IAM role to use KMS key",
    "Effect": "Allow",
    "Principal": {
        "AWS": "替换为你创建的生产者IAM角色的ARN"
    },
    "Action": [
        "kms:GenerateDataKey",
        "kms:Decrypt"
    ],
    "Resource": "*"
}
  1. 给生产者IAM角色附加权限策略,允许它向SNS主题发布消息:
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": "sns:Publish",
            "Resource": "替换为你的SNS主题ARN"
        }
    ]
}
  1. 如果你还未配置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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.17 09:36:04