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 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 - Go to
- Deploy `simflexcloud-ecs-blue-green-deployments-pipeline` it will create the repository of `cdk-infra`. Note: replace `CDK_DEFAULT_ACCOUNT` and `CDK_DEFAULT_REGION` in `cdk-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 for `app-proj`
- After the pipeline is completed successfully, go to `app-proj` directory and add Git remote repository, then create the branches `testgreen` and `testblue` and 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
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
🚀 Test the blue-green deployments
- Test the blue service by loading ALB DNS
- Now we change the color to red in
app-proj/index.html
and 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
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:
Top comments (0)