AWS 云形成模板 - 为模板中的堆栈提供标签

Posted

技术标签:

【中文标题】AWS 云形成模板 - 为模板中的堆栈提供标签【英文标题】:AWS cloud formation Template- providing Tags for the stack in the template 【发布时间】:2015-02-15 06:24:07 【问题描述】:

我们希望将公司特定标签用于我们在 AWS 中创建的资源以进行计费。我正在使用云形成模板来启动我们的 Elasticbeanstalk 实例和其他项目相关资源。当我使用 CloudFormation 控制台创建堆栈时,它会在参数之后要求我在页面中输入标签。我必须手动输入该堆栈的标签。但是,有没有办法在云形成模板本身中指定这些标签(堆栈的标签)?这样标签就会传播到其他资源?我知道云形成会自动用堆栈名称标记资源。但是我们需要公司特定的标签来为不同的部门开具账单。

【问题讨论】:

功能请求:github.com/aws-cloudformation/… 【参考方案1】:

在模板剖析中,不能直接设置栈级标签。但是,您可以创建一个包装模板,具有AWS::CloudFormation::Stack 的单一资源。

您可以在该资源上定义堆栈级标签:


  "AWSTemplateFormatVersion": "2010-09-09",
  "Description": "WrapperTemplate",

  "Resources": 
    "WrappedStackWithStackLevelTags": 
      "Type" : "AWS::CloudFormation::Stack",
      "Properties" : 
        "Tags" : [  "Key" : "Stage", "Value" : "QA"  ],
        "TemplateURL" : "your-original-template-s3-url"
      
    
  

【讨论】:

我什至不知道这是一个选项...这对标签继承非常有用。 这是您在模板中为整个堆栈设置 SNS 主题的方式吗? 男人非常有用!应更新标题以包含“云形成堆栈级别标签” 太棒了!但是你从哪里得到这种用法的知识呢?官方文档说“TemplateURL”属性是必需的...docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/… 这个可以不用设置templateUrl吗?我不想创建嵌套堆栈【参考方案2】:

在启动 AWS CloudFormation 时,所请求的标签将应用于 CloudFormation 堆栈本身,并且(在可能的情况下)还将传播到堆栈启动的资源。

这些标签可以传递给 CreateStack API 调用,或从 CLI:

见:create-stack CLI documentation

这些标签应用于整个堆栈,不包含在 CloudFormation 模板中。

但是,CloudFormation 模板可以包含正在创建的特定资源的标签。例如,在启动 Amazon EC2 实例时,可以在模板中包含标签:

"MyInstance" : 
  "Type" : "AWS::EC2::Instance",
  "Properties" : 
    "SecurityGroups" : [ "Ref" : "MySecurityGroup" ],
    "AvailabilityZone" : "us-east-1a",
    "ImageId" : "ami-20b65349",
    "Volumes" : [
      "VolumeId" :  "Ref" : "MyEBS" ,
      "Device" : "/dev/sdk"
    ],
    "Tags" : [
      "Key" : "Stage",
      "Value" : "QA"
    ]
  

【讨论】:

谢谢约翰。 (在可能的情况下)是我需要的提示。 cloudformation 不支持标记弹性 Beanstalk 环境,但是您可以手动标记它。我假设它是否支持通过控制台进行标记,它应该能够通过云形成来完成,我错了。 根据我的经验,CloudFormation 中的标签传播有点不可预测。令人失望的是,文档声称“所有堆栈级标签,包括自动创建的标签,都会传播到 AWS CloudFormation 支持的资源。”【参考方案3】:

与@lalyos 所说的相反,您不需要为此使用嵌套堆栈,只需提供应该应用于所有资源的标签作为堆栈级标签。

可以指定这些堆栈级标签是在控制台上还是通过 CLI 运行堆栈。

CLI 示例:

aws cloudformation create-stack --stack-name my-stack-name \
 --template-body file://path-to-template-file.yaml \
 --parameters ParameterKey=param1key,ParameterValue=param1value \
 --tags Key=tag1key,Value=tag1value \
        Key=tag2key,Value=tag2value \
        Key=tag3key,Value=tag3value 

...通常根据需要添加尽可能多的标签,使用相同的格式并允许标签键值对之间有空格

见: https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/cfn-console-add-tags.html

【讨论】:

我使用aws cloudformation deploy,效果很好!唯一的区别是标签以--tags Key1=Value1 Key2=Value2 的格式指定。见here【参考方案4】:

你不需要任何包装器.. 您可以在创建/更新堆栈时向堆栈添加标签:

在控制台中:

您也可以使用 aws cli:

aws cloudformation create-stack help

   --tags (list)
      Key-value  pairs  to  associate with this stack. CloudFormation also
      propagates these tags to supported resources in the stack.  You  can
      specify a maximum number of 50 tags.

      If  you  don't specify this parameter, CloudFormation doesn't modify
      the stack's tags. If you specify an empty value, CloudFormation  re-
      moves all associated tags.

      (structure)
          The Tag type enables you to specify a key-value pair that can be
          used to store information about an CloudFormation stack.

          Key -> (string)
             Required . A string used to identify this tag. You can  spec-
             ify  a maximum of 128 characters for a tag key. Tags owned by
             Amazon Web Services (Amazon Web Services) have  the  reserved
             prefix: aws: .

          Value -> (string)
             Required  .  A  string containing the value for this tag. You
             can specify a maximum of 256 characters for a tag value.

   Shorthand Syntax:

      Key=string,Value=string ...

   JSON Syntax:

      [
        
          "Key": "string",
          "Value": "string"
        
        ...
      ]

【讨论】:

以上是关于AWS 云形成模板 - 为模板中的堆栈提供标签的主要内容,如果未能解决你的问题,请参考以下文章

Aws云形成模板:如何为Kinesis资源提供保留期?

使用 cloudformation 模板的 AWS Lambda 的动态环境变量

AWS 云形成;将模板分解为多个文件并使用 cfn-include 传入变量

AWS - SAM cli yaml 模板不适用于 cloudformation 堆栈

云形成无效:SaaS身份与Cognito模板

如何从 aws cloudformation 模板为特定资源类型创建堆栈