Skip to content

CloudFormation Basics

DevOps Philosophy

Why we use Terraform and not Chef, Puppet, Ansible, SaltStack, or CloudFormation

Tools

YAML

YAML notation for folded text: >

data: >
  Wrapped text
  will be folded
  into a single
  paragraph

  Blank lines denote
  paragraph breaks

Sample Templates

Templates for the US East (Northern Virginia) Region

AWSlabs on GitHub

Cloudonaut Templates

Free Templates for AWS CloudFormation (Cloudonaut)

Deploying Microservices with Amazon ECS, AWS CloudFormation, and an Application Load Balancer

Template Basics

Template Basics

Template Anatomy

---
AWSTemplateFormatVersion: "version date"

Description:
  String

Metadata:
  template metadata

Parameters:
  set of parameters

Mappings:
  set of mappings

Conditions:
  set of conditions

Transform:
  set of transforms

Resources:
  set of resources

Outputs:
  set of outputs

With examples:

---
AWSTemplateFormatVersion: "2010-09-09"

Description: >
  Here are some
  details about
  the template.

Metadata:
  Instances:
    Description: "Information about the instances"
  Databases:
    Description: "Information about the databases"

Parameters:
  InstanceTypeParameter:
    Type: String # String, Number, List<Number>, CommaDelimitedList e.g. "test,dev,prod", or an AWS-specific types such as Amazon EC2 key pair names and VPC IDs.
    Default: t2.micro
    AllowedValues:
      - t2.micro
      - m1.small
    Description: Enter t2.micro or m1.small. Default is t2.micro.
    # AllowedPattern: "[A-Za-z0-9]+" # A regular expression that represents the patterns you want to allow for String types.
    # ConstraintDescription: Malformed input-Parameter MyParameter must match pattern [A-Za-z0-9]+
    # MinLength: 2  # for String
    # MaxLength: 10
    # MinValue: 0   # for Number types.
    # MaxValue: 100
    # NoEcho: True

Mappings:
  RegionMap:
    us-east-1:
      "32": "ami-6411e20d"
    us-west-1:
      "32": "ami-c9c7978c"
    eu-west-1:
      "32": "ami-37c2f643"
    ap-southeast-1:
      "32": "ami-66f28c34"
    ap-northeast-1:
      "32": "ami-9c03a89d"

Conditions:
  CreateProdResources: !Equals [!Ref EnvType, prod]

Transform:
  set of transforms

Resources:
  Ec2Instance:
    Type: AWS::EC2::Instance
    Properties:
      InstanceType:
        Ref: InstanceTypeParameter # reference to parameter above
      ImageId: ami-2f726546

Outputs:
  VolumeId:
    Condition: CreateProdResources
    Value:
      !Ref NewVolume
  • The Ref function can refer to input parameters that are specified at stack creation time.

Examples

S3

Resources:
  HelloBucket:
    Type: AWS::S3::Bucket # AWS::ProductIdentifier::ResourceType

EC2

Resources:
  Ec2Instance:
    Type: AWS::EC2::Instance
    Properties:
      SecurityGroups:
        - Ref: InstanceSecurityGroup
      KeyName: mykey
      ImageId: ""
  InstanceSecurityGroup:
    Type: AWS::EC2::SecurityGroup
    Properties:
      GroupDescription: Enable SSH access via port 22
      SecurityGroupIngress:
        - IpProtocol: tcp
          FromPort: "22"
          ToPort: "22"
          CidrIp: 0.0.0.0/0

Modern CloudFormation Basics

Use YAML instead of JSON for modern templates.

AWSTemplateFormatVersion: "2010-09-09"
Description: A simple modern EC2 instance template
Parameters:
  InstanceType:
    Type: String
    Default: t3.micro
    AllowedValues: [t3.micro, t3.small, m5.large]
Resources:
  MyEC2Instance:
    Type: AWS::EC2::Instance
    Properties:
      InstanceType: !Ref InstanceType
      ImageId: ami-0c55b159cbfafe1f0
      Tags:
        - Key: Name
          Value: ModernInstance
Outputs:
  InstanceId:
    Value: !Ref MyEC2Instance