Abstract
- 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
requiresCompatibilities
The ECS service is registered to ECS deployment controller with the type
CODE_DEPLOY
for 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-project
directory and others for CDK infrastructurecdk-infra
directoryโ 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
Go to
cdk-infra
and runcdk ls
cdk ls simflexcloud-ecs-blue-green-deployments-pipeline simflexcloud-ecs-blue-green-deployments-pipeline/master-sin/EcsBlueGreenDeploymentsStack
Deploy
simflexcloud-ecs-blue-green-deployments-pipeline
it will create the repository ofcdk-infra
. Note: replaceCDK_DEFAULT_ACCOUNT
andCDK_DEFAULT_REGION
incdk-infra/src/shared/constants.ts
with expected ones.cdk deploy simflexcloud-ecs-blue-green-deployments-pipeline
Add the remote Git repository to
cdk-infra
(Note: Replace thepriv-acc
with yours)git remote add origin ssh://priv-acc/v1/repos/ecs-blue-green-deployments-infra
Create branch
master
and push source code to the repo, it will trigger CDK pipeline to create all stacks which also include the repository and pipeline forapp-proj
After the pipeline is completed successfully, go to
app-proj
directory and add Git remote repository, then create the branchestestgreen
andtestblue
and push them to codecommitgit 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.html
and push the commit to CodeCommit. It triggers the pipeline to build and then deploy a new changeThe 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
LINEAR_10PERCENT_EVERY_1MINUTES
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
๐ Cleanup
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.
๐ Conclusion
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.
References: