【问题标题】:Reuse list of CloudFormation tags重用 CloudFormation 标签列表
【发布时间】:2018-03-07 14:37:43
【问题描述】:

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

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

我想写这个:

ECSAutoScalingGroup:
    Type: AWS::AutoScaling::AutoScalingGroup
    Properties: 
        ...
        Tags: !Ref ElTags

而不是

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

【问题讨论】:

  • 我们的 CF 模板是从基于 python 的 CF 模板制造商 Troposphere 生成的。您的用例是最好从另一个程序生成模板的原因之一。话虽如此,自动编辑大量模板以向每个模板添加一堆标签是相当容易的文本编辑
  • 我同意这很容易,但也容易出错。
  • 难以抽象出诸如通用标签集之类的东西是我们使用对流层的原因。您是否已将 AWS Config 配置为审核所有资源以检查标签是否正常?

标签: amazon-web-services amazon-cloudformation


【解决方案1】:

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

aws cloudformation create-stack --stack-name mystack \
--template-body file://my_template.yaml --tags file://my_tags.json

文件 my_tags.json 的格式为

[
    {"Key": "mytag", "Value": "val"},
    ...
]

或者,您可以通过 CodePipeline 部署您的堆栈并在 template configuration 中定义标签

【讨论】:

    【解决方案2】:

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

    Fn::Transform 指定一个宏来对零件进行自定义处理 堆栈模板

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

    AWS::Include 是一个 AWS CloudFormation 宏,可在模板的任何位置插入代码 sn-p。

    更多关于AWS::Includehttps://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'
    

    您的标签将位于不同的模板中,该模板将放置在 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
    

    【讨论】:

    • 虽然我的用例没有连接到标签,但您在此处描述的这种方法打开了许多重用之门。所以感谢您明确 Fn::Transform 和 Fn::Include
    猜你喜欢
    • 1970-01-01
    • 2021-12-11
    • 2015-03-04
    • 1970-01-01
    • 2020-01-15
    • 1970-01-01
    • 2018-10-03
    • 2015-10-25
    • 1970-01-01
    相关资源
    最近更新 更多