未加密SNS主题消息无法送达加密SQS队列及KMS策略报错咨询
问题根因与解决方案
报错触发原因
- KMS 客户托管密钥(CMK)的策略属于基于资源的访问策略,所有权限声明语句必须显式指定
Principal字段,声明权限授予的对象,你新增的两条语句未配置Principal,因此触发格式错误。 - 你混淆了策略的适用范围:
sqs:SendMessage属于SQS队列的权限,完全不应该写在KMS密钥策略中,放错了策略载体。 - 官方指南中无
Principal的示例是针对IAM身份策略(挂载在用户/角色/服务身份上的策略),这类策略默认将挂载的身份作为Principal,因此不需要显式声明,不能直接套用到KMS资源策略上。
解决方案
步骤1:修正KMS密钥策略
删掉你新增的两条错误语句,保留原有配置即可,你已经配置的sns.amazonaws.com服务主体的kms:GenerateDataKey、kms:Decrypt权限已经满足SNS向加密SQS推送消息的KMS调用要求,不需要额外加KMS权限。
如果是跨账号场景(SNS主题和SQS队列属于不同AWS账号),才需要在KMS策略中额外添加SNS所属账号的根身份作为Principal,示例:
{ "Sid": "Allow cross account SNS to use KMS", "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::${sns_aws_account_id}:root" }, "Action": [ "kms:GenerateDataKey", "kms:Decrypt" ], "Resource": "*" }
步骤2:配置SQS队列访问策略
把你之前写错位置的sqs:SendMessage权限,添加到SQS队列的访问策略中,示例配置如下:
{ "Version": "2012-10-17", "Id": "sqs-sns-access-policy", "Statement": [ { "Sid": "Allow SNS topic to send message to SQS", "Effect": "Allow", "Principal": { "Service": "sns.amazonaws.com" }, "Action": "sqs:SendMessage", "Resource": "${sqs_queue_arn}", "Condition": { "ArnEquals": { "aws:SourceArn": "${sns_topic_arn}" } } } ] }
步骤3:可选验证项
如果完成上述配置后仍然收不到消息,可检查:
- SNS订阅的协议为
SQS,端点填写的是SQS队列的ARN无误 - 如果SNS消息携带自定义属性,可开启订阅的「原始消息传递」选项,避免属性封装影响消息解析
内容的提问来源于stack exchange,提问作者dmoini
相关产品推荐
相关产品推荐

