The ShortHand
macro provides convenience syntax to allow you to create short CloudFormation templates that expand into larger documents upon deployment to a stack.
See below for instructions to install and use the macro and for a full description of the macro's features.
-
You will need an S3 bucket to store the CloudFormation artifacts:
- If you don't have one already, create one with
aws s3 mb s3://<bucket name>
- If you don't have one already, create one with
-
Package the CloudFormation template. The provided template uses the AWS Serverless Application Model so must be transformed before you can deploy it.
aws cloudformation package \ --template-file macro.template \ --s3-bucket <your bucket name here> \ --output-template-file packaged.template
-
Deploy the packaged CloudFormation template to a CloudFormation stack:
aws cloudformation deploy \ --stack-name shorthand-macro \ --template-file packaged.template \ --capabilities CAPABILITY_IAM
-
To test out the macro's capabilities, try launching the provided example template:
aws cloudformation deploy \ --stack-name shorthand-macro-example \ --template-file example.template \ --capabilities CAPABILITY_IAM
To make use of the macro, add Transform: ShortHand
to the top level of your CloudFormation template.
Here is a trivial example template:
Transform: ShortHand
Resources:
- S3::Bucket
The ShortHand macro provides the following features to your CloudFormation templates:
-
A resource can be defined by a single string that contains its name, type, and proprties.
For example:
"MyBucket AWS::S3::Bucket AccessControl=PublicRead"
This would translate into:
MyBucket: Type: AWS::S3::Bucket Properties: AccessControl: PublicRead
-
You can omit the resource name and one will be generated for you.
For example:
"AWS::S3::Bucket AccessControl=PublicRead"
-
You can shorten the resource type name by omitting parts of it from the left. As long as the result unambiguously refers to a valid CloudFormation resource type, the
ShortHand
macro will deal with it.For example:
"Bucket AccessControl=PublicRead"
And:
"EC2::Instance" # We need the `EC2::` prefix as there are other resource types that end with `Instance` (e.g. `AWS::OpsWorks::Instance`)
-
All string values automatically use
Fn::Sub
if the value contains a sequence like${something}
For example:
"MyBucketPolicy BucketPolicy Bucket=${MyBucket}"
Will result in:
MyBucketPolicy: Type: AWS::S3::BucketPolicy Properties: Bucket: Fn::Sub: "${MyBucket}"
-
You can address sub-properties using dot-notation.
For example:
"MyBucket Bucket VersioningConfiguration.Status=Enabled"
-
If you need to specify lots of properties (as is often the case) you can use object synax instead of a string.
For example:
MyBucket S3::Bucket: AccessControl: PublicRead VersioningConfiguration.Status: Enabled
-
To make all of these features possible, the
Resources
section of your template must now be an array rather than an object.A full example template would look like this:
Transform: ShortHand Parameters: Name: Type: String Resources: - S3::Bucket BucketName=${Name}
Steve Engledow
Senior Solutions Builder
Amazon Web Services