使用AWS CloudFormation配置跨账户共享SNS Topic的CloudTrail
解决多账户CloudTrail共用集中式SNS Topic的CloudFormation配置问题
嘿,我刚碰到过类似的场景,给你梳理下怎么搞定这个问题!
首先你得知道:CloudFormation里的SnsTopicName参数是用来在当前部署账户创建新的SNS Topic的,这就是为什么你每个子账户都会生成新Topic的原因。要关联跨账户的已有Topic,你得用SnsTopicARN属性,而不是名称——这是关键的第一步!
接下来分两步操作:
1. 给主账户的集中式SNS Topic配置跨账户权限
首先要在托管SNS Topic的主账户里,允许子账户的CloudTrail服务向这个Topic发布消息。你需要给SNS Topic添加一个权限策略,示例如下(可以直接在主账户的SNS控制台配置,或者用CloudFormation模板管理):
{ "Version": "2008-10-17", "Id": "CloudTrailCrossAccountPublishPolicy", "Statement": [ { "Sid": "AllowSubAccountCloudTrailPublish", "Effect": "Allow", "Principal": { "Service": "cloudtrail.amazonaws.com" }, "Action": "sns:Publish", "Resource": "arn:aws:sns:ap-southeast-1:1111111111:SNSTopic", "Condition": { "StringEquals": { "AWS:SourceAccount": [ "2222222222", # 替换成你的子账户ID "3333333333" # 多个子账户可以继续添加 ] } } } ] }
这个策略只允许指定子账户的CloudTrail服务向这个Topic发送消息,安全性更高。如果想允许所有子账户(不推荐,除非是完全信任的组织内账户),可以去掉Condition部分。
2. 修改子账户的CloudTrail CloudFormation模板
把原来的SnsTopicName字段替换成SnsTopicARN,直接填入主账户的SNS Topic完整ARN即可。修改后的模板示例:
AWSTemplateFormatVersion: '2010-09-09' Description: Centralised CloudTrail linked to shared SNS Topic Resources: CloudTrail: Type: "AWS::CloudTrail::Trail" Properties: EnableLogFileValidation: false IncludeGlobalServiceEvents: true IsLogging: true IsMultiRegionTrail: true S3BucketName: company-cloudtrail-au TrailName: Trail1 SnsTopicARN: "arn:aws:sns:ap-southeast-1:1111111111:SNSTopic" # 这里用主账户的Topic ARN
额外注意事项
- 如果你的S3日志Bucket也是主账户的集中式Bucket,别忘了给子账户的CloudTrail服务配置向该Bucket写入日志的权限(同样通过Bucket策略实现)。
- 部署前可以先在子账户用AWS CLI测试下权限:比如用
aws cloudtrail update-trail --name Trail1 --sns-topic-arn arn:aws:sns:ap-southeast-1:1111111111:SNSTopic,如果能成功执行,说明权限配置没问题。
这样配置后,用CloudFormation部署子账户的CloudTrail时,就会直接关联到主账户的SNS Topic,不会再在子账户新建Topic了,完全不用手动修改控制台!
内容的提问来源于stack exchange,提问作者Scott
相关产品推荐
相关产品推荐

