Amazon ECS Farget with Blue-Green Deployments by CDK Typescript

Amazon ECS Farget with Blue-Green Deployments by CDK Typescript

Abstract

Table Of Contents


๐Ÿš€ Solution overview

  • The whole AWS resources are created using CDK pipleine except the pipeline itself.

  • The ECS cluster is placed in private subnet as well as the fargate service. We create ECS service with task defination has desired count 3 and use FARGATE as requiresCompatibilities

  • The ECS service is registered to ECS deployment controller with type CODE_DEPLOY for handling blue-green deployment. It sticks the application load balancer to replacement target group when deploying successfully.

  • 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 other for CDK infrastructure cdk-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 run cdk 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 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 the priv-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 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

  • Create an Amazon ECS cluster using fargate.

3. Application load balancer

  • We have two rules:

    • Port 80: main rule

    • Port 8080: testing rule

  • The ALB is currently sticked to the target group 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 color to red in app-proj/index.html and push the commit to CodeCommit. It triggers the pipeline to build and then deploy new change

  • The deploy stage creates codedeploy deployment ID to perform deployment process and handle 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 follow 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 resoures 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 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:


๐ŸŒ  Blog ยท Github ยท stackoverflow ยท Linkedin ยท Group ยท Page ยท Twitter ๐ŸŒ