使用 AWS Cloudformation 配置带有 SNS 主题的 CloudTrail

Using AWS Cloudformation to configure CloudTrail with SNS Topic

我是 AWS CloudFormation 的新手,我已经使用它毫无问题地将 CloudTrail 部署到多个账户,但是我正在尝试使用每个 CloudTrail 都可以使用的集中式 SNS 主题,如果我通过CloudTrail GUI 它可以工作,但我无法让 CloudFormation 工作。

---
AWSTemplateFormatVersion: '2010-09-09'
Description: Centralised CloudTrail
Resources: 
  CloudTrail:
Type: "AWS::CloudTrail::Trail"
Properties:
  EnableLogFileValidation: 'false'
  IncludeGlobalServiceEvents: 'true'
  IsLogging: 'true'
  IsMultiRegionTrail: 'true'
  S3BucketName: company-cloudtrail-au
  TrailName: Trail1
  SnsTopicName: SNSTopic

我正在尝试将 ARN 用于 SNS 主题(下面的示例),但我无法弄清楚如何告诉 CloudFormation 使用 ARN 而不是名称,如果我只是将名称放入其中在每个子帐户中创建一个新的 SNS 主题。

如果我在部署 CloudFormation 后转到 GUI,我可以将它指向正确的 ARN,它是集中式的,但它并不理想,如果 SNS 不打算跨账户共享,或者是否有,请告诉我更好的方法。

SNS 主题的示例 ARN - arn:aws:sns:ap-东南-1:1111111111:SNSTopic

解决方案取决于您创建集中式 SNS 的方式。如果它是使用 CF 模板创建的,您可以将 SNS 主题的 ARN 作为输出导出。参考 CloudFormation Output

在您创建 CloudTrail 的当前堆栈中,您可以使用导入选项引用 SNS 主题的 ARN。参考 Fn::ImportValue

(或)

如果您手动创建了 SNS 主题,您仍然可以将 SNS 的 ARN 作为参数传递给 Cloud Formation 创建堆栈调用。参考 Parameters

希望这对您有所帮助。

有多种方法可以将 Arn 传递给 SnsTopicName:

  1. 如果您在模板本身中创建了 SNS 主题 - 类型:AWS::SNS::Topic,那么您可以将 SNS 主题的 ARN 引用为
SnsTopicName: !GetAtt MY_SNS_Topic.Arn
  1. 如果您在控制台中手动创建了 SNS 主题,那么您可以将 Arn 指定为
SnsTopicName: !Sub "your-full-ARN-of-the-SNS-Topic"
  1. 您可以使用默认值从参数传递 ARN:value(arn)
Parameters:
 SNSTopic:
   Description: SNS Topic Name
   Type: String
   Default: arn:aws:sns:ap-southeast-1:1111111111:SNSTopic

##########
Properties:
 SnsTopicName: !Ref SNSTopic
  1. 您可以在单独的配置文件中定义 ARN,并将其作为参数传递给模板的部署函数或在调用脚本部署模板时传递
Filename - configfile.conf
SNSTopic="arn:aws:sns:ap-southeast-1:1111111111:SNSTopic"

AWS Serverless Template
Parameters:
 SNSTopic:
   Type: String
##########
Properties:
 SnsTopicName: !Sub "${SNSTopic}"