Ecosyste.ms: Awesome
An open API service indexing awesome lists of open source software.
https://github.com/gposton/sagan
Blue/Green deployments in AWS using Terraform
https://github.com/gposton/sagan
Last synced: 11 days ago
JSON representation
Blue/Green deployments in AWS using Terraform
- Host: GitHub
- URL: https://github.com/gposton/sagan
- Owner: gposton
- License: mit
- Created: 2015-04-27T14:18:31.000Z (over 9 years ago)
- Default Branch: master
- Last Pushed: 2015-05-12T02:03:16.000Z (over 9 years ago)
- Last Synced: 2024-08-02T14:12:29.384Z (4 months ago)
- Language: Ruby
- Size: 134 KB
- Stars: 35
- Watchers: 19
- Forks: 1
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
- License: LICENSE
Awesome Lists containing this project
README
# sagan
Blue/Green deployments in AWS using TerraformCarl Sagan originally proposed terraforming Venus to make it habitable
for human life.This repo contains a set of scripts that can be used to trigger a
blue/green deployment in AWS using auto scaling groups and immutable
AMIs.The process is as follows:
1. Remove the reference to the ASG and Launch config from terraform
state file (terraform.tfstate)
1. Run terraform apply which will create a new ASG and launch
configuration with the new AMI.
1. Verify functionality of the application.
1. Put the instances in the original ASG in 'Standby' mode so that it
doesn't recieve new traffic.
1. Verify functionality of the application.
1. Delete the ASG (and associated instances) from AWS.# How to
Given the terraform apply has been ran with the example template...
Set your AWS keys and install gem dependencies:
```
➜ sagan git:(master) ✗ export AWS_ACCESS_KEY_ID=
➜ sagan git:(master) ✗ export AWS_SECRET_ACCESS_KEY=
➜ sagan git:(master) ✗ sudo gem install bundler
➜ sagan git:(master) ✗ bundle
```Remove the reference to the ASG and Launch config from terraform state
file:```
➜ sagan git:(master) ✗ ./remove_asg_from_tfstate.rb example_template/terraform.tfstate
Creating tfstate backup at example_template/terraform.tfstate.1430149712
Removed the following asg from example_template/terraform.tfstate:
web_ami-2593a715
```Note the asg id above... you'll need this later (to take it out of service)
Run terraform apply to create the new ASG and launch config:
```
➜ sagan git:(master) ✗ cd example_template➜ example_template git:(master) ✗ terraform apply
var.ami
the AMI to useEnter a value: ami-c1a194f1
var.availability_zones
A comma separated list of availability zones (no spaces)Enter a value:
var.count
the number of instances to runDefault: 3
Enter a value:var.instance_size
EC2 instance sizeDefault: t2.micro
Enter a value:var.key_name
The name of the aws key used to launch instancesEnter a value:
var.private_subnets
A comma separated list of subnet ids (no spaces)Enter a value:
var.region
the region we are gong to run inEnter a value:
var.vpc_id
A vpc idEnter a value:
aws_security_group.web_server: Refreshing state... (ID: sg-fcccc799)
aws_elb.web_lb: Refreshing state... (ID: web-elb)
aws_launch_configuration.launch_config: Creating...
...
aws_launch_configuration.launch_config: Creation complete
aws_autoscaling_group.asg: Creating...
...
aws_autoscaling_group.asg: Creation completeApply complete! Resources: 2 added, 0 changed, 0 destroyed.
The state of your infrastructure has been saved to the path
below. This state is required to modify and destroy your
infrastructure, so keep it safe. To inspect the complete state
use the `terraform show` command.State path: terraform.tfstate
```Verify functionality of the application and then put the original ASG
in standby:```
➜ example_template git:(master) ✗ cd ..➜ sagan git:(master) ✗ ./put_asg_in_standby.rb -h
Usage: put_asg_in_standby.rb -a ASG [-r REGION] [-x]
-a, --asg ASG Name of the ASG to remove (required)
-r, --region REGION Name of the AWS region to use (default: us-west-2)
-x, --exit-standby If set, remove the ASG from standby
-h, --help Prints this help➜ sagan git:(master) ✗ ./put_asg_in_standby.rb -a web_ami-2593a715
Putting the following instances on standby:
i-56e078a0
i-d8fcd211
i-17be76e0
```Verify the functionality of the application then terminate the original
ASG (You will not be able to roll back after this step):```
➜ sagan git:(master) ✗ ./terminate_asg.rb -h
Usage: remove_asg_from_elb.rb -a ASG [-r REGION] [-x]
-a, --asg ASG Name of the ASG to remove (required)
-r, --region REGION Name of the AWS region to use (default: us-west-2)
-h, --help Prints this help➜ sagan git:(master) ✗ ./terminate_asg.rb -a web_ami-2593a715
```# Rollback
To remove an ASG from standby and put it back in service run:
```
➜ sagan git:(master) ✗ ./put_asg_in_standby.rb -a web_ami-c1a194f1 -x
Removing the following instances from standby:
i-ade27a5b
i-e1fad428
i-09bf77fe
```You can now put the new ASG in standby to debug it (or delete it for
a full rollback).