Skip to content

CloudFormation

Introduction

AWS CloudFormation is a service that enables you to model, provision, and manage AWS resources by treating infrastructure as code. It allows you to create and manage a collection of AWS resources using templates written in JSON or YAML format. Instead of manually creating and configuring resources through the AWS Console, you can describe your desired infrastructure in a template file, and CloudFormation handles the rest.

Core Concepts

Templates

Templates are JSON or YAML files that serve as blueprints for building AWS environments. They define all the AWS resources and their properties. A template can include:

  • Resources
  • Parameters
  • Mappings
  • Conditions
  • Outputs
  • Metadata

Stacks

A stack is a collection of AWS resources that you manage as a single unit. All resources described in a template are managed as part of the stack. Key aspects include:

  • Creation, updating, and deletion of resources as a group
  • Stack policies for resource protection
  • Role-based access control
  • Change sets for reviewing modifications

Change Sets

Change sets let you preview how proposed changes to a stack might impact your running resources before implementing them.

Template Structure

AWSTemplateFormatVersion: "2010-09-09"
Description: "A sample template"

Parameters:
  EnvironmentType:
    Type: String
    AllowedValues: 
      - prod
      - dev

Mappings:
  RegionMap:
    us-east-1:
      AMI: "ami-0123456789"

Resources:
  MyEC2Instance:
    Type: "AWS::EC2::Instance"
    Properties:
      InstanceType: t2.micro
      ImageId: !FindInMap [RegionMap, !Ref "AWS::Region", AMI]

Outputs:
  InstanceID:
    Description: "Instance ID"
    Value: !Ref MyEC2Instance

Template Components

Parameters

Parameters enable you to input custom values to your template each time you create or update a stack.

Parameters:
  InstanceType:
    Description: EC2 instance type
    Type: String
    Default: t2.micro
    AllowedValues:
      - t2.micro
      - t2.small
      - t2.medium

Mappings

Mappings are fixed key-value pairs that you can use to specify conditional parameter values.

Mappings:
  EnvironmentToInstanceType:
    dev:
      instanceType: t2.micro
    prod:
      instanceType: t2.small

Resources

Resources are the AWS components that will be created and configured.

Resources:
  MyS3Bucket:
    Type: AWS::S3::Bucket
    Properties:
      BucketName: !Sub "${AWS::StackName}-bucket"
      VersioningConfiguration:
        Status: Enabled

Outputs

Outputs declare values that you can import into other stacks or view in the AWS Console.

Outputs:
  BucketName:
    Description: Name of the created bucket
    Value: !Ref MyS3Bucket
    Export:
      Name: !Sub "${AWS::StackName}-BucketName"

Intrinsic Functions

CloudFormation provides several built-in functions for template management:

  • !Ref - References parameters or resources
  • !GetAtt - Gets an attribute from a resource
  • !Sub - Substitutes variables in a string
  • !Join - Joins values with a delimiter
  • !Split - Splits a string into a list
  • !Select - Selects an item from a list
  • !FindInMap - Returns a named value from a mapping

Best Practices

Template Design

  • Use descriptive names for resources
  • Implement proper tagging strategy
  • Use parameters for values that change
  • Implement proper error handling
  • Use nested stacks for reusable components

Security

  • Use IAM roles and policies
  • Implement stack policies
  • Enable encryption where possible
  • Use VPC endpoints
  • Follow the principle of least privilege

Cost Management

  • Use cost allocation tags
  • Implement lifecycle policies
  • Consider reserved instances
  • Monitor resource usage

Common Operations

Creating a Stack

aws cloudformation create-stack \
  --stack-name my-stack \
  --template-body file://template.yaml \
  --parameters ParameterKey=EnvironmentType,ParameterValue=prod

Updating a Stack

aws cloudformation update-stack \
  --stack-name my-stack \
  --template-body file://template.yaml

Deleting a Stack

aws cloudformation delete-stack \
  --stack-name my-stack

Troubleshooting

Common Issues

  1. Stack Creation Failures
  2. Check resource limits
  3. Verify IAM permissions
  4. Review dependency order

  5. Update Failures

  6. Use change sets to preview changes
  7. Check for protected resources
  8. Verify resource properties

  9. Deletion Failures

  10. Check for deletion policies
  11. Verify termination protection
  12. Review stack dependencies

Integration with Other AWS Services

CloudFormation integrates with numerous AWS services:

  • AWS Organizations
  • AWS Config
  • AWS Service Catalog
  • AWS Systems Manager
  • AWS CodePipeline
  • AWS CodeBuild
  • AWS CodeDeploy

Tools and Resources

Development Tools

  • AWS CloudFormation Designer
  • AWS CLI
  • AWS SDK
  • IDE plugins

Validation Tools

  • cfn-lint
  • CloudFormation Guard
  • TaskCat

Best Practices for CI/CD

  • Use version control for templates
  • Implement automated testing
  • Use change sets in deployment pipeline
  • Maintain separate stacks for different environments
  • Implement proper rollback strategies

Conclusion

AWS CloudFormation is a powerful service for infrastructure as code that enables consistent and repeatable deployments of AWS resources. By following best practices and utilizing its features effectively, you can manage complex infrastructure efficiently and reliably.

Additional Resources