- Continue the previous post Hands-on Amazon ECS for Blue-Green Deployments With CDK Typescript which uses EC2 to host the ECS container service and manually operate blue-green deployments. In this blog post, I use AWS Fargate as a container of ECS service and codedeploy to operate blue-green deployment automatically.
Table Of Contents
🚀 Solution overview
The whole AWS resources are created using CDK pipeline except the pipeline itself.
The ECS cluster is placed in a private subnet as well as the fargate service. We create ECS service with task definition that has desired count of 3 and use FARGATE as
The ECS service is registered to ECS deployment controller with the type
CODE_DEPLOYfor handling blue-green deployment. It sticks the application load balancer to the replacement target group when deploying successfully.
A container image is built with codepipeline and codebuild which store images to ECR.
Here is the stacks relationship
🚀 Source code structure
We have two Git repositories (codecommit) one for application project
app-projectdirectory and others for CDK infrastructure
➜ ecs-blue-green-deployments tree -L 1 . ├── README.md ├── app-project ├── cdk-infra └── images 3 directories, 1 file
We create the codecommit repositories through CDK
cdk ls simflexcloud-ecs-blue-green-deployments-pipeline simflexcloud-ecs-blue-green-deployments-pipeline/master-sin/EcsBlueGreenDeploymentsStack
simflexcloud-ecs-blue-green-deployments-pipelineit will create the repository of
cdk-infra. Note: replace
cdk-infra/src/shared/constants.tswith expected ones.
cdk deploy simflexcloud-ecs-blue-green-deployments-pipeline
Add the remote Git repository to
cdk-infra(Note: Replace the
git remote add origin ssh://priv-acc/v1/repos/ecs-blue-green-deployments-infra
masterand push source code to the repo, it will trigger CDK pipeline to create all stacks which also include the repository and pipeline for
After the pipeline is completed successfully, go to
app-projdirectory and add Git remote repository, then create the branches
testblueand push them to codecommit
git remote add origin ssh://priv-acc/v1/repos/simflexcloud-ecs-blue-green-deployments
🚀 Process flow
1. Build project
- Use AWS CodeBuild to create Docker images and store them in Amazon ECR. This process is powered by codepipeline to handle CICD.
2. Create ECS cluster
Create an Amazon ECS cluster using fargate.
3. Application load balancer
We have two rules:
Port 80: the main rule
Port 8080: testing rule
The ALB is currently stuck to the target group of green
4. CodeDeploy application and deployment group
A CodeDeploy deployment group that orchestrates ECS blue-green deployments.
🚀 Test the blue-green deployments
Test the blue service by loading ALB DNS
Now we change the colour to red in
app-proj/index.htmland push the commit to CodeCommit. It triggers the pipeline to build and then deploy a new change
The deploy stage creates codedeploy deployment ID to perform the deployment process and handle the Traffic shifting progress strategy with rule
LINEAR_10PERCENT_EVERY_1MINUTES(CodeDeploy predefined deployment configuration that shifts 10 percent of traffic every minute until all traffic is shifted)
ECS run new tasks with new image version on the ECS service
After the new tasks are in healthy state, the deployment starts rerouting production traffic to replacement task set gradually following the rule
Use port 8080 for testing and compare with current version
Complete the replacement and start terminating the original task set
ECS remove the tasks with old revision
The final result
To cleanup all resources in this project, we first need to delete the ECR image as they were not created by CDK and prevent CDK to destroy the ECR repository.
Go to cloudformation and delete stacks.
Now that you know how to launch tasks into your Amazon ECS cluster using CDK pipeline with the required type EC2 or Fargate.
The approach of a blue-green deployment involves utilizing two identical production environments as a means of reducing downtime. Various cutover strategies may be employed, but typically only one of the environments should be actively serving production traffic.