重用CloudFormation标记列表

Bra*_*lle 10 amazon-web-services aws-cloudformation

我有一套相当复杂的CloudFormation模板,用于配置我们基础架构的不同环境.但是我最近收到了使用相当广泛的标签列表(如15)标记创建的资源的请求.

将标签硬编码到每个模板文件中对我来说似乎不是一个好主意.我宁愿创建一次标记列表,并为每个可标记资源引用它们.问题是:我甚至不确定这是可能的.您是否知道可以实现可重复使用的标签列表?

我想写这个:

ECSAutoScalingGroup:
    Type: AWS::AutoScaling::AutoScalingGroup
    Properties: 
        ...
        Tags: !Ref ElTags
Run Code Online (Sandbox Code Playgroud)

而不是

ECSAutoScalingGroup:
    Type: AWS::AutoScaling::AutoScalingGroup
    Properties: 
        ...
        Tags: !Ref ElTags
            - Key: Name
              Value: !Join ["-", [!Ref EnvironmentName, 'ecs-as-group'] ]
              PropagateAtLaunch: true
            - Key: TEAM
              Value: !Ref TeamName
              PropagateAtLaunch: true
Run Code Online (Sandbox Code Playgroud)

Mic*_*nko 5

如果您不将标签传递给模板而是在部署期间引用它们,则可以轻松地重用标签。标签将传播到堆栈的所有资源。类似于下面的命令可能会满足您的需求:

aws cloudformation create-stack --stack-name mystack \
--template-body file://my_template.yaml --tags file://my_tags.json
Run Code Online (Sandbox Code Playgroud)

文件 my_tags.json 的格式为

[
    {"Key": "mytag", "Value": "val"},
    ...
]
Run Code Online (Sandbox Code Playgroud)

或者,您可以通过 CodePipeline 部署您的堆栈并在模板配置中定义标签


小智 4

这可以使用Fn::Transform函数和 AWS 宏来实现AWS::Include

Fn::Transform指定一个宏来对堆栈模板的一部分执行自定义处理

更多Fn::Transform关于https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/intrinsic-function-reference-transform.html

AWS::Include是一个 AWS CloudFormation 宏,它会在模板中的任意位置插入代码片段。

更多关于AWS::Include关于https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/create-reusable-transform-function-snippets-and-add-to-your-template-with-aws-include-transform.html

您可以这样重复使用标签:

Resources:
  TestSG:
    Type: AWS::EC2::SecurityGroup
    Properties:
      GroupDescription: 'SG for testing'
      GroupName: testSG
      SecurityGroupIngress:
        - CidrIp: '0.0.0.0/0'
          FromPort: 80
          IpProtocol: tcp
          ToPort: 80
      'Fn::Transform': 
        Name: AWS::Include 
        Parameters: 
          Location: 's3://bucket-name/tags.yaml'

  TestRole:
    Type: AWS::IAM::Role
    Properties: 
      AssumeRolePolicyDocument:
        Version: 2012-10-17
        Statement:
          - Effect: Allow
            Principal:
              Service: lambda.amazonaws.com
            Action: sts:AssumeRole
      ManagedPolicyArns: 
        - 'arn:aws:iam::aws:policy/AmazonS3ReadOnlyAccess'
      RoleName: testRole
      'Fn::Transform': 
        Name: AWS::Include 
        Parameters: 
          Location: 's3://bucket-name/tags.yaml'
Run Code Online (Sandbox Code Playgroud)

您的标签将位于不同的模板中,该模板将放置在 S3 存储桶上。这是文件tags.yaml的内容:

Tags: 
  - Key: tag1
    Value: value1
  - Key: tag2
    Value: value2
  - Key: tag3
    Value: value3
  - Key: tag4
    Value: value4
  - Key: tag5
    Value: value5
  - Key: tag6
    Value: value6
  - Key: tag7
    Value: value7
  - Key: tag8
    Value: value8
  - Key: tag19
    Value: value9
  - Key: tag10
    Value: value10
Run Code Online (Sandbox Code Playgroud)