跨AWS账号SNS无法向加密SQS队列发送消息问题排查
跨账号加密SNS到加密SQS消息投递失败(直接进DLQ)解决方案
问题场景
- 账号1:加密SNS主题(自有CMK),已配置允许账号2订阅的策略
- 账号2:加密SQS队列(自有CMK)+ 未加密DLQ,跨账号订阅账号1的SNS主题
- 现象:SQS禁用加密时消息投递正常,启用加密后消息直接进入DLQ
核心原因
账号1的SNS服务缺少两个关键权限:
- 向账号2的加密SQS队列发送消息的权限
- 使用账号2的KMS CMK加密消息以写入SQS的权限(现有KMS策略配置不够精准)
修复代码(账号2的CDK)
1. 添加SQS队列的跨账号访问策略
给目标SQS队列添加允许账号1的SNS主题发送消息的策略:
queue.addToResourcePolicy(new PolicyStatement({ sid: "AllowAccount1SNSToSendMessages", actions: ["sqs:SendMessage"], resources: [queue.queueArn], effect: Effect.ALLOW, principals: [new ArnPrincipal("<account_1_sns_topic_arn>")], }));
2. 优化KMS CMK的权限策略
替换原有宽泛的KMS权限配置,精准限制仅账号1的目标SNS主题能使用该密钥:
// 移除原有AccountPrincipal和无限制的ServicePrincipal策略,替换为以下内容 keyAlias.addToResourcePolicy(new PolicyStatement({ sid: "AllowAccount1SNSToUseKMSKey", actions: ["kms:GenerateDataKey", "kms:Decrypt"], resources: ["*"], effect: Effect.ALLOW, principals: [new ServicePrincipal("sns.amazonaws.com")], conditions: { "StringEquals": { "aws:SourceAccount": "<account_1_id>" }, "ArnLike": { "aws:SourceArn": "<account_1_sns_topic_arn>" } } }));
3. 确认账号1的SNS主题策略(必查)
确保账号1的SNS主题已配置允许账号2订阅的策略:
{ "Sid": "AllowAccount2ToSubscribe", "Effect": "Allow", "Principal": { "AWS": "<account_2_id>" }, "Action": "sns:Subscribe", "Resource": "<account_1_sns_topic_arn>" }
验证步骤
- 部署修改后的账号2 CDK栈
- 确认账号1的SNS主题策略生效
- 发送测试消息到账号1的SNS主题,检查是否正常投递到账号2的加密SQS队列
内容的提问来源于stack exchange,提问作者victormoraesgs
相关产品推荐
相关产品推荐

