You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

未加密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

相关产品推荐
方舟 Agent Plan

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

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