BetaLight theme is in beta. Some UI element may not be optimized.

AWS CloudFormation Template Cheat Sheet

AWS CloudFormation is a powerful tool that allows the definition of cloud infrastructure as code(IaC). This cheat sheet provides a quick reference for creating and managing CloudFormation templates in YAML format.

Note: CloudFormation templates can also be written in JSON.

1. Basic Template Structure

Main Template

AWSTemplateFormatVersion: '2010-09-09'
Description: Main CloudFormation stacks # Provide a meaningful description of your stack

Resources: # Define all resources needed for infrastructure deployment
  IAMStack: # Resource stack name
    Type: 'AWS::CloudFormation::Stack' # Specify the type of resource, in this case, a nested stack
    Properties:
      TemplateURL: 'https://s3.ap-southeast-1.amazonaws.com/<bucket-name>/IAM-stack.yaml' # URL to the nested stack template

  VPCStack:
    Type: 'AWS::CloudFormation::Stack'
    Properties:
      TemplateURL: 'https://s3.ap-southeast-1.amazonaws.com/<bucket-name>/VPC-stack.yaml'

  EC2Stack:
    Type: 'AWS::CloudFormation::Stack'
    Properties:
      TemplateURL: 'https://s3.ap-southeast-1.amazonaws.com/<bucket-name>/EC2-stack.yaml'
      Parameters: # Parameters required by the EC2 stack
        SecurityGroupIds: !ImportValue BastionSecurityGroup # Import value from the output of another stack
        PublicSubnet1Id: !ImportValue PublicSubnetId
        PublicSubnet2Id: !ImportValue PrivateSubnetId

Stack Template

AWSTemplateFormatVersion: '2010-09-09'
Description: CloudFormation stack for infrastructure VPC

Resources:
  VPC:
    Type: 'AWS::EC2::VPC'
    Properties:
      CidrBlock: '10.0.0.0/16' # Define the CIDR block for the VPC
      EnableDnsSupport: true # Enable DNS support within the VPC
      EnableDnsHostnames: true # Enable DNS hostnames within the VPC
      Tags:
        - Key: Name
          Value: myVPC # Tag the VPC with a name

  PublicSubnet:
    Type: 'AWS::EC2::Subnet'
    Properties:
      VpcId: !Ref VPC # Reference the VPC resource created above
      CidrBlock: '10.0.1.0/24' # Define the CIDR block for the subnet
      AvailabilityZone: ap-southeast-1a # Specify the availability zone
      MapPublicIpOnLaunch: true # Automatically assign a public IP to instances launched in this subnet

  PrivateSubnet:
    Type: 'AWS::EC2::Subnet'
    Properties:
      VpcId: !Ref VPC
      CidrBlock: '10.0.2.0/24'
      AvailabilityZone: ap-southeast-1b
      MapPublicIpOnLaunch: false # No public IP assigned by default

  IGW:
    Type: 'AWS::EC2::InternetGateway' # Create an Internet Gateway

  BastionSecurityGroup:
    Type: 'AWS::EC2::SecurityGroup'
    Properties:
      GroupDescription: Allow SSH inbound traffic from all sources # Description of the security group
      VpcId: !Ref VPC
      SecurityGroupIngress:
        - IpProtocol: tcp
          FromPort: 22
          ToPort: 22
          CidrIp: '0.0.0.0/0' # Allow SSH from any IP

Outputs: # Define outputs to be used in other stacks
  VPCId:
    Description: 'VPC ID'
    Value: !Ref VPC
    Export:
      Name: 'VPCId' # Export the VPC ID for use in other stacks

  PublicSubnetId:
    Description: 'Public Subnet 1 ID'
    Value: !Ref PublicSubnet
    Export:
      Name: 'PublicSubnetId'

  PrivateSubnetId:
    Description: 'Private Subnet 2 ID'
    Value: !Ref PrivateSubnet
    Export:
      Name: 'PrivateSubnetId'

  BastionSecurityGroupId:
    Description: 'Bastion Security Group ID'
    Value: !Ref BastionSecurityGroup
    Export:
      Name: 'BastionSecurityGroupId'

2. Parameters

Parameters are used to customize templates.

Parameters:
  InstanceType:
    Description: 'EC2 instance type'
    Type: String
    Default: t2.micro
    AllowedValues:
      - t2.micro
      - t2.small
      - t2.medium
    ConstraintDescription: 'Must be a valid EC2 instance type.'

3. Outputs

Outputs allow exporting values from one stack to be used in another.

Outputs:
  VPCId:
    Description: 'VPC ID'
    Value: !Ref VPC
    Export:
      Name: 'VPCId'

4. Common Errors and Troubleshooting Tips

  • Syntax Errors: Always validate templates using the AWS CloudFormation console or CLI.
  • Resource Conflicts: Ensure unique names for resources to avoid conflicts.
  • Parameter Mismatch: Verify that parameter names and types match across templates.

Conclusion

Using CloudFormation to manage IaC can greatly simplify deployment and management tasks. Start experimenting with templates and see the benefits firsthand.

Additional Resources

Disclaimer: This example template is for educational purposes only and should not be copied for production use. It serves as a guide to understand the basic structure of a CloudFormation template.