Amazon ECS Farget with Blue-Green Deployments by CDK Typescript - Part 2

Amazon ECS Farget with Blue-Green Deployments by CDK Typescript - Part 2


4 min read


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 infrastructure cdk-infra directory

      โžœ  ecs-blue-green-deployments tree -L 1
      โ”œโ”€โ”€ 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
    • 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 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

  • 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 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.