A recent AWS Fargate feature update has added support for S3 hosted environment files. In this article I will show how you could use this to manage your application’s configuration. I will also demonstrate how changes to the configuration can be released in a blue-green deployment.
The solution we will build will follow the design shown in the below diagram.
Our source code (including our configuration files) will be stored in AWS CodeCommit. We will then use AWS CodeBuild and AWS CodeDeploy to package and deploy our application to Amazon Elastic Container Service (ECS). AWS CodePipeline will be used to knit these services together into a release pipeline.
S3 will of course be used to store the application configuration so that it is available for our applications running in ECS to consume.
The Terraform code at https://gitlab.com/aw5academy/terraform/ecs-env-file-demo will deploy our demo stack. The task definition we create uses the environmentFiles directive noted in the AWS documentation.
We can create the stack with:
mkdir -p terraform cd terraform git clone https://gitlab.com/aw5academy/terraform/ecs-env-file-demo.git cd
ecs-env-file-demoterraform init terraform apply
We now need to build our Docker image which will serve as our application. In https://gitlab.com/aw5academy/docker/ecs-env-file-demo we have a simple Apache server which reads the value of the CSS_BACKGROUND environment variable and sets it as the background colour of our index.html document.
You can build this Docker image and push it to the ECR repository created by Terraform with:
mkdir -p docker cdhttps://gitlab.com/aw5academy/docker/ecs-env-file-demo.git
cd ecs-env-file-demobash -x build.sh
Now we need to deploy our application configuration to our CodeCommit repository. https://gitlab.com/aw5academy/ecs/ecs-env-file-demo contains everything we need and we can deploy it to our CodeCommit repo with the following:
mkdir -p ecs cd ecs git clone https://gitlab.com/aw5academy/ecs/ecs-env-file-demo.git
cd ecs-env-file-demo rm -rf .git git clone codecommit::us-east-1://ecs-env-file-demo mv *.*
ecs-env-file-demogit add . git commit -m "Initial commit" git push origin master
If you have any issues with this step, navigate to the CodeCommit service and open the ecs-env-file-demo repository for clone instructions and prerequisites.
As soon as we push our code to CodeCommit, our release pipeline will trigger. Navigate to the CodePipeline service and open the ecs-env-file-demo pipeline.
Wait until this release completes.
Application Configuration Changes
We can now test our process for making configuration changes. Navigate to the CodeCommit service and open our ecs-env-file-demo repository. Then open the cfg.env file. You can see that our configuration file has a value of “blue” for our CSS_BACKGROUND variable. This is the variable that our Apache server uses for the webpage’s background colour.
Let’s change this value to “green”, enter the appropriate Author details and click “Commit changes”.
We can now use the CodeDeploy service to follow our deployment. If you first navigate to the CodePipeline service and open our ecs-env-file-demo pipeline, when the CodeDeploy stage begins, click on the Details link to bring us to the CodeDeploy service.
Our deployment has started. Note, our deployments will use a Canary release with 20% of the traffic receiving the new changes for 5 minutes. After that, 100% of the traffic will receive the new changes. In your checkout of the Terraform code, there is a deployment-tester.html file. This is a page of 9 HTML iframes with the source being the DNS name of the load balancer in our application stack. The page auto refreshes every 5 seconds.
If you open this deployment-tester.html file (you may need to open developer tools and disable cache for it to be effective) you will be able to verify our release is working as expected. It should initially show just the original blue.
Now you can wait for CodeDeploy to enter the next stage.
We now have 20% of our traffic routed to the new application configuration — the green. Let’s check this in our deployment-tester.html file:
And to complete the process, we can wait for CodeDeploy to finish and verify the application is fully green.
Cleanup the created resources with:
cd ecs-env-file-demoterraform destroy
I hope this very simple example has effectively demonstrated the new capability in AWS Fargate.