Terraform Rolling Deployment Demo

This is a demo project that accompanies a blog post I wrote. It shows how to use various tools from the Hashicorp stack to achieve rolling deployments on AWS with zero downtime.

The post is here: https://robmorgan.id.au/posts/rolling-deploys-on-aws-using-terraform/

It is based on a concept from Paul Hinze: https://groups.google.com/forum/#!msg/terraform-tool/7Gdhv1OAc80/iNQ93riiLwAJ

Architecture

terraform aws architecture - current architecture

Requirements

You should have the following tools installed:

  • Git
  • Packer (v1.2.3)
  • Terraform (v0.11.7)

Additionally you will need the following environment variables set:

  • AWS_ACCESS_KEY_ID
  • AWS_SECRET_ACCESS_KEY

Usage

  1. Copy your public SSH key to the ssh_keys directory and update the path in key-pairs.tf.
  2. Before we create the AWS infrastructure we must first bake a new AMI using Packer. Using the supplied Makefile, simply run:
$ make bake

When Packer finishes running it will output an AMI ID we need for the next step.

  1. Now we can use Terraform to create the AWS resources:
$ make plan AMI="ami-XXXYYYZZ"
$ make apply AMI="ami-XXXYYYZZ"
  1. Deployment is a case of baking a fresh AMI then re-running Terraform:
$ make bake
$ make plan AMI="ami-XXXYYYZZ"
$ make apply AMI="ami-XXXYYYZZ"

Tests

You can run the included tests using Terratest:

$ make test