跨账号SNS/SQS订阅故障:双方使用独立客户管理KMS密钥
跨账号SNS到SQS(不同KMS密钥)消息接收失败解决方案
跨账号场景下,SNS主题(账号A,用key_A加密)向SQS队列(账号B,用key_b加密)发送消息时,需完成两次加解密转换,权限配置缺失会导致消息无法投递,即使订阅状态显示已确认。
一、权限流向梳理
- 账号A的SNS需读取自身加密的主题内容:使用key_A解密消息
- SNS需将消息重新加密为SQS支持的格式:使用账号B的key_b加密
- 账号B的SQS接收消息后,使用key_b解密内容
二、具体权限配置
1. 账号A的KMS密钥key_A策略
需要允许账号A的SNS服务对该密钥执行解密和重加密源操作,确保SNS能读取主题中的加密消息:
{ "Version": "2012-10-17", "Statement": [ // 保留已有的其他权限,新增以下语句 { "Sid": "AllowSNSDecryptForCrossAccountDelivery", "Effect": "Allow", "Principal": { "Service": "sns.amazonaws.com" }, "Action": [ "kms:Decrypt", "kms:ReEncryptFrom" ], "Resource": "*", "Condition": { "StringEquals": { "aws:SourceAccount": "{账号A的ID}", "aws:SourceArn": "arn:aws:sns:{区域}:{账号A的ID}:{你的SNS主题名称}" } } } ] }
2. 账号B的KMS密钥key_b策略
需要允许账号A的SNS服务对该密钥执行加密、重加密目标和生成数据密钥操作,确保SNS能将消息转换为SQS可解密的格式:
{ "Version": "2012-10-17", "Statement": [ // 保留已有的其他权限,新增以下语句 { "Sid": "AllowAccountASNSEncryptForSQS", "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::{账号A的ID}:root" }, "Action": [ "kms:Encrypt", "kms:ReEncryptTo", "kms:GenerateDataKey*", "kms:DescribeKey" ], "Resource": "*", "Condition": { "StringEquals": { "aws:SourceAccount": "{账号A的ID}", "aws:SourceArn": "arn:aws:sns:{区域}:{账号A的ID}:{你的SNS主题名称}" } } } ] }
3. 账号B的SQS队列权限策略
确认已允许账号A的SNS主题向该队列发送消息(若未配置需添加):
{ "Version": "2012-10-17", "Statement": [ { "Sid": "AllowAccountASNSSendMessage", "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::{账号A的ID}:root" }, "Action": "sqs:SendMessage", "Resource": "arn:aws:sqs:{区域}:{账号B的ID}:{你的SQS队列名称}", "Condition": { "ArnEquals": { "aws:SourceArn": "arn:aws:sns:{区域}:{账号A的ID}:{你的SNS主题名称}" } } } ] }
三、验证步骤
- 重新发送测试消息到账号A的SNS主题
- 检查SQS队列的消息接收情况
- 若仍失败,查看AWS CloudTrail中的KMS和SNS/SQS相关日志,定位具体的权限拒绝事件
内容的提问来源于stack exchange,提问作者BaronVonChai
相关产品推荐
相关产品推荐

