ECS Fargate — Terraform Example
Progress checklist
What this example does
Section titled “What this example does”This example provisions:
- An S3 bucket (versioning + SSE-S3 enabled)
- An S3 Files file system and mount targets in each provided subnet
- IAM roles (file system role + ECS task execution role)
- Security groups (compute → mount target on NFS port 2049)
- A CloudWatch log group for the ECS task
- An ECS task definition with
s3filesVolumeConfiguration(registered vialocal-exec) - An ECS service running one Fargate task on the existing cluster
-
Confirm prerequisites.
Requirement Minimum version Terraform 1.5 AWS provider 6.40 AWS CLI 2.34.26 (called via local-execduringterraform apply)Confirm the CLI version:
Terminal window aws --versionYou also need an existing ECS cluster to deploy into. Confirm it exists:
Terminal window aws ecs describe-clusters \--clusters <your-cluster-name> \--region ap-southeast-6 \--query 'clusters[0].status' \--output textExpected output:
ACTIVE -
Clone the example.
Terminal window git clone https://github.com/jajera/terraform-aws-s3-files.gitcd terraform-aws-s3-files/examples/ecsDirectoryexamples/ecs/
- main.tf
- terraform.tfvars.example
- terraform.tfvars (you create this)
-
Create
terraform.tfvars.Terminal window cp terraform.tfvars.example terraform.tfvarsEdit
terraform.tfvars:vpc_id = "vpc-0123456789abcdef0"subnet_ids = ["subnet-aaaaaaaaaaaaaaaaa", "subnet-bbbbbbbbbbbbbbbbb"]ecs_cluster_name = "my-cluster"# Optional overrides (defaults shown):# aws_region = "ap-southeast-6"# container_image = "public.ecr.aws/amazonlinux/amazonlinux:2023"# log_retention_days = 7# bucket_name = null # auto-generated: s3files-demo-<random># bucket_force_destroy = trueVariable Default Required Description vpc_id— yes VPC for mount targets and ECS tasks subnet_ids— yes Subnets for mount targets and Fargate task ENIs ecs_cluster_name— yes Name of an existing ECS cluster aws_regionap-southeast-6no AWS region container_imagepublic.ecr.aws/amazonlinux/amazonlinux:2023no Container image for the demo task log_retention_days7no CloudWatch log retention period in days bucket_nameauto-generated no Leave nullto uses3files-demo-<random>bucket_force_destroytrueno Allow destroy even when bucket contains objects -
Initialise and apply.
Terminal window terraform initterraform planterraform applyWhen apply finishes, note the outputs:
Terminal window terraform outputKey outputs:
Output Description ecs_service_nameECS service name task_definition_familyECS task definition family name log_groupCloudWatch log group ( /ecs/<prefix>-s3files)file_system_idS3 Files file system ID bucket_nameBacking S3 bucket name -
Confirm the ECS service is running.
Terminal window aws ecs describe-services \--cluster "$(terraform output -raw ecs_service_name | cut -d- -f1-3)" \--services "$(terraform output -raw ecs_service_name)" \--region ap-southeast-6 \--query 'services[0].{status:status,running:runningCount,desired:desiredCount}'Wait until
runningCountequalsdesiredCount(1). This can take 2–3 minutes while the mount target becomes available and the container starts. -
Verify via CloudWatch Logs.
Terminal window aws logs tail \"$(terraform output -raw log_group)" \--follow \--region ap-southeast-6Expected output includes:
====S3Files-df====Filesystem Size Used Avail Use% Mounted on... ... ... ... ... /mnt/s3files====listing====total 0====done====Press
Ctrl+Cto stop tailing. -
Tear down.
Terminal window terraform destroy