I have a rather complex set of CloudFormation templates that I use for provisioning the different environments of our infrastructure. However I recently got the request to tag t
This is possible using Fn::Transform
function and AWS macro AWS::Include
.
Fn::Transform
specifies a macro to perform custom processing on part of a stack template
More about Fn::Transform
on https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/intrinsic-function-reference-transform.html
AWS::Include
is an AWS CloudFormation macro which inserts a code snippet anywhere in your template.
More about AWS::Include
on https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/create-reusable-transform-function-snippets-and-add-to-your-template-with-aws-include-transform.html
You can reuse your tags that way:
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'
Your tags will be in a different template which will be placed on an S3 Bucket. This is the content of the file 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