'AWS cloud formation Template- providing Tags for the stack in the template

We wanted to use company specific Tags to the resources that we create in AWS for billing purposes. I am using a cloud formation template to spin up our Elasticbeanstalk instance and other project dependent resources. When I use the CloudFormation console to create a stack it asks me for Tags in the page after parameters. I have to manually input the Tags for that stack. However is there a way to specify those Tags (Tags for the stack) with in the cloud formation template itself? That way the Tag gets propagated to the other resources? I know that the cloud formation automatically tags the resources with the stack name. But we need company specific tags to bill separate departments.



Solution 1:[1]

In the template anatomy, you can't set stack-level tags directly. However you can create a wrapper template, having a single resource of AWS::CloudFormation::Stack.

You can define stack-level tags on that resource:

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

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

Solution 2:[2]

Contrary to what @lalyos says, you don't need to use nested stacks for this, just provide the tags that should apply to all resources as stack level tags.

These stack-level tags can be specified whether running the stack on the console or via CLI.

CLI example:

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 

... and generally add as many tags as you need, using the same format and allowing spaces between tag key-value pairs

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

Solution 3:[3]

You don't need any wrapper.. You can add tags to the stack on when you create/update it:

In Console: Console

You can also use the 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"
        }
        ...
      ]

Solution 4:[4]

You can build and deploy a CloudFormation template using aws-sam-cli. This command reads a samconfig.toml file where you can declare tags for all the resources of the stack (including CloudFormation stack itself)

Your samconfig.toml should look like:

[default.deploy.parameters]
stack_name = "your-application"
s3_bucket = "your-s3-for-cloudformation-stuff"
s3_prefix = "your-folder-name"
...
tags = "Stage=\"QA\""

and then run:

sam build --template <your-cloudformation-template.yml> && sam deploy

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1 Yves M.
Solution 2 Chux Uzoeto
Solution 3 mijhael3000
Solution 4 Leopoldo Varela