AWS Cloudformation 

Cloud sculpturing the AWS way

Tusa Viktor
Xively

Infrastructure as Code

  • Declarative

    • Declarative definition of the resources and their connections in the infrastructure and the code which applies the definition.

  • Repeatable

    • Applying the infrastructure definition over-and-over should yield the same result

  • Composable

    • Low-level building blocks of the infrastructure which are general enough to be reusable. (Resource-Oriented Infrastructure)

  • Verifiable

    • Should be able to test the resources and their connections.

AWS Cloudformation

  • Public Cloud = Resources  + Management API
    • Not declarative
  • Cloudformation 
    • Declarative format for resource provisioning
  • Supports almost every AWS resource

Cloudformation format

  • Supports JSON and YAML
  • Structured format with some "metaprogramming" capabilities
  • Template validation
    • Syntactic and basic semantic validation
  • Stacks and templates
    • Stack is the group of the created resources described by the template

Template anatomy

  • Format Version, Description, Metadata
  • Parameters
    • Typed parameters which can be referenced from the template resources section
  • Mappings
    • Specify "dictionaries" where values can be retrieved by a given key.
    • Usage example: Key: region, Values: AMI ids
  • Conditions
    • Specify simple conditions to influence resources creation
    • Eg: "IsProduction" : {"Fn::Equals" : [{"Ref" : "Environment"}, "production"]}

Template Anatomy #2

 

  • Transforms
    • Very new, came with the AWS "serverless" solution
    • Acts like a source macro in functional languages
  • Resources
    • The main part, which contains the resource descriptions
  • Output
    • References resource attributes, available after stack creation finished

Resources

  • Typed AWS Resource description JSON object
    • Type means schema here
  • DeletionPolicy property
    • Prevents deletion of the actual resource when the stack is deleted
  • DependsOn
    • Dependency relation between resources
  • Special resource: WaitHandle
    • Waits, until a pre-signed URL is called a specified times
    • pre-signed URL can be created with the WaitConditionHandle resource

Template "Metaprogramming"

 

  • Reference
    • Can reference parameters or other resources
    • Can be used where a value is needed
    • { "Ref": "Environment"}
  • Functions
    • Attribute query of resources
    • Basic string manipulation/interpolation
    • Select value from mappings
    • Conditional functions
    • Eg.: { "Fn::GetAttr" : [ "MyEc2Instance", "PublicIp"]}

Other features

 

  • Nested Stacks
    • Can include other template
    • Can reference from other template output 
  • Cross-stack reference
    • Can reference resource attributes from other stacks with strong limitations
  • Custom resources
    • An AWS Lambda function, which can react to different resource lifecycle events
  • Pseudo-variables
    • Predefined AWS-related variables (eg.: region, accountid)

Stack lifecycle

  • Create/Update/Delete
  • Direct update vs. Change Sets
    • Change sets allow previewing changes
  • Resource updates
    • No interruption
    • Partial interruption
    • Replacement (eg.: Changing RDS engine type)
  • Failure
    • Rollback or disable rollback

Stack policies

  • Controls resource lifecycle behaviour
  • Can prevent accidential deletion of resources
  •   "Statement" : [ "Effect" : "Allow",
          "Action" : "Update:*",
          "Principal": "*",
          "Resource" : "*"},
    { "Effect" : "Deny",
          "Action" : "Update:*",
          "Principal": "*",
          "Resource"
    "LogicalResourceId/ProductionDatabase"
    }]}

Tips & Tricks

  • Use template validation
  • Use tags
  • Use S3 buckets to store CF templates
    • CLI has a limit when specifying template body
  • Several smaller templates
    • Separate data from services
    • Resources with same lifecycle should go into the same template
    • Limited blast radius 

Disadvantages

  • No state
    • No way to import resources
  • No loop-like construct
  • No planning step like terraform
    • Although change sets can help

Praise the Demo God!

Thank you!

AWS Cloudformation

By Tusa Viktor

AWS Cloudformation

  • 1,430