跨账号SNS Topic发布报错:CloudWatch告警无SNS:Publish权限如何解决
跨账号SNS发布权限错误修复方案
核心问题
当前配置存在两处错误:
- 账号B侧的资源政策修改完全无效:通过
fromTopicArn导入的其他AWS账号的SNS Topic属于只读引用,你在账号B的CDK中调用addToResourcePolicy尝试修改账号A的SNS Topic资源政策,AWS会直接拒绝该操作,这段配置不会产生任何效果。 - 账号A的SNS Topic授权范围不匹配:你仅给账号B的根账号主体授予了
SNS:Publish权限,但实际发起请求的主体是账号B的CloudWatch服务,不属于根账号主体范畴,因此触发权限拒绝。
修复步骤
- 删除账号B中多余的无效配置,移除以下代码段:
ACCOUNTBTopic.addToResourcePolicy(new PolicyStatement({ resources: ['ACCOUNT-A-ARN'], actions: ['SNS:Publish'], effect: Effect.ALLOW, }))
账号B侧仅需要保留导入SNS Topic、配置CloudWatch告警SNS Action的代码即可。
- 修改账号A的CDK配置,给账号B的CloudWatch服务补充授权:
const accountATopic= new sns.Topic(this, 'accountATopic', { displayName: 'accountATopic' }); accountATopic.addSubscription(new snsSubscriptions.UrlSubscription('Externalurl')); // 原有账号B根账号授权保留,可满足账号B其他服务调用SNS的需求 accountATopic.grantPublish(new iam.AccountPrincipal('ACCOUNTB')); // 新增账号B CloudWatch服务发布授权,添加条件限制避免权限过宽 accountATopic.grantPublish(new iam.ServicePrincipal('cloudwatch.amazonaws.com', { conditions: { StringEquals: { "aws:SourceAccount": "ACCOUNTB" }, ArnLike: { "aws:SourceArn": "arn:aws:cloudwatch:*:ACCOUNTB:alarm:*" } } }));
- 重新部署账号A的CDK栈,等待资源政策更新完成后即可验证告警通知是否能正常发送到SNS Topic。
可选验证项
如果配置后仍有报错,可逐一检查以下配置:
- 确认两个账号的ID、SNS Topic ARN填写无拼写错误
- 确认两个账号属于同一AWS分区(中国区/国际区/GovCloud不能跨分区调用)
- 登录账号A的SNS控制台,检查Topic的资源政策是否已经包含CloudWatch服务的授权条目
内容的提问来源于stack exchange,提问作者user17071347
相关产品推荐
相关产品推荐

