This template helps set up Fargate and EC2-based ECS clusters using AWS CloudMap for communication.
- Fargate: Uses AWS Service Connect, creating HTTP-only CloudMap services. Includes an automatic proxy container.
- EC2-based ECS: Uses DNS-based discovery.
- Creates HTTP-only CloudMap services (no DNS resolution)
- Requires an additional proxy container (managed by AWS)
- If containers use
bridge
mode, createsSRV
records instead ofA
records (Nginx free version can't resolveSRV
records) - To get
A
records, useawsvpc
mode
To avoid duplicating code, the same my-application
folder is used for different environments.
However, it is necessary to re-initialize the local Terraform state from S3 every time the environment is switched.
To switch environments, follow these steps:
- Clear the local state, including the
.terraform
folder and.terraform.lock.hcl
file. - Run
terraform init
with the appropriate environment variables.
It is crucial not to merge states if the local state is not cleared.
Just delete the local state, and terraform init
will restore it from S3, which is always safe.
terraform/my-application/
- AWS resources for the ECS clustersterraform/environment/
- Environment-specific variablesterraform/modules/
- Common Terraform codetests/features/
- BDD tests for the Terraform configurationMakefile
- Commands for Terraform and tests
To use AWS CLI:
- Create an IAM user and include it in the admin group.
- Attach
AutoScalingFullAccess
policy. - Create Access Key credentials.
- Set credentials in environment variables or
~/.aws/credentials
:
export AWS_ACCESS_KEY_ID=...
export AWS_SECRET_ACCESS_KEY=...
In the configuration, the debug mode for ECS containers is enabled (marked with # ecs execute-command
).
See details in AWS ECS EXEC.
You should locally install Session Manager.
A useful utility to check your system's readiness for ECS EXEC is Exec-checker.
You can connect to the container in ECS using:
aws ecs execute-command --cluster ec2 \
--task $(aws ecs list-tasks --cluster ec2 --query "taskArns" --output text) \
--container ec2 --interactive --command "/bin/sh"
To look into an active task
aws ecs describe-tasks --cluster ec2 \
--tasks $(aws ecs list-tasks --cluster ec2 --query "taskArns" --output text)
Install Terraform from the official website or via Homebrew (macOS).
brew install hashicorp/tap/terraform
Use pre-commit hooks to validate the terraform code quality:
pre-commit install
brew tap liamg/tfsec
brew install terraform-docs tflint tfsec checkov
brew install pre-commit gawk coreutils
Install and / or activate Python virtual environment (you need uv installed):
. ./activate.sh
Note spaces after the first dot.
For work it need uv installed.
Initialize Terraform (you need AWS credentials active) with:
make init
make test
Visit terraform-compliance for more on writing tests.