有很多选择可以做到这一点,我不知道哪个是最好的 . 我在开始时尝试做的如下:

ServiceInstance:
Type: "AWS::EC2::Instance"
Properties:
  ImageId: !Ref AmiId, !Ref LatestOnescoutAmi ]
  InstanceType: !Ref InstanceType
  SubnetId: !ImportValue vpc-stack-PublicASubnet
  SecurityGroupIds:
    - !Ref ServiceSecurityGroup
  KeyName: !Ref KeyName
  UserData:
    'Fn::Base64': !Sub |
      #cloud-config
      write_files:
        - path: /etc/sysconfig/cloudformation
          permissions: 0644
          owner: root
          content: |
            STACK_NAME=${AWS::StackName}
            AWS_REGION=${AWS::Region}
        - path: /etc/datadog-agent/conf.d/mysql.d/conf.yaml
          permissions: 0644
          owner: dd-agent
          content: |
            init_config:
            instances:
            - server: some-db-host
              user: some-admin
              pass: some-password
              port: 3306
              tags:
              - dbinstanceidentifier:someide

      runcmd:
        ## enable datadog agent
        - systemctl start datadog-agent
        - systemctl start application.service

但随后我的 /etc/datadog-agent/conf.d/mysql.d/conf.yaml 增长了,我有大约13个街区,将它们硬编码到模板中是不好的 . 最好保持模板通用,并将配置文件作为参数传递 . 但是,根据这个answer here,不可能将文件或文件内容传递给 Cloud 形成 .

上面的方法是我能看到的其他两个选项中最简单的方法 .

  • 将配置存储在SSM中,然后在ec2启动时将其恢复 .

  • 创建一个Autoscaling和启动组,它接受文件路径,但它比我需要的更复杂:

LaunchConfig:
    Type: AWS::AutoScaling::LaunchConfiguration
    Metadata:
      AWS::CloudFormation::Init:
        configSets:
          service_configuration:
          - datadog_setup
        datadog_setup:
          files:
            /etc/datadog-agent/conf.d/mysql.d/conf.yaml:
              content: "@file://./config/conf-${Env}.yaml"
              mode: "000644"
              owner: "root"
              group: "root"
          commands:
            start_datadog:
              command: service datadog-agent start

知道如何以简单,通用和安全的方式做到这一点吗?给出的例子将是值得赞赏的 . 提前致谢 .