Deploy Containers to AWS Fargate

By Pulumi Team
Published
Updated

The Challenge

You need to run a containerized application in production without managing servers. Fargate provides serverless container execution where you define the container image and resource requirements, and AWS handles provisioning, scaling, and patching the underlying compute. Adding a load balancer gives you a stable endpoint with automatic health checking.

What You'll Build

  • ECS cluster for container orchestration
  • Docker image built and pushed to ECR
  • Fargate service with multiple replicas
  • Application Load Balancer with health checks
  • Serverless compute with no EC2 management

Neo Try This Prompt in Pulumi Neo

Run this prompt in Neo to deploy your infrastructure, or edit it to customize.

Best For

Use this prompt when you need to deploy a containerized application without managing EC2 instances or Kubernetes clusters. This pattern works for web applications, APIs, background workers, or any workload packaged as a Docker container that needs load balancing and automatic recovery from failures.

Architecture Overview

This architecture runs your containerized application on AWS Fargate, the serverless compute engine for ECS. You provide a Dockerfile, and the deployment handles building the image, pushing it to ECR, and running it as a Fargate task behind an Application Load Balancer. There are no EC2 instances to provision, patch, or scale.

The Application Load Balancer serves as the entry point for all traffic. It distributes requests across running Fargate tasks, performs health checks against each task, and automatically deregisters unhealthy containers so ECS can replace them. This gives you a self-healing deployment where container failures are detected and corrected without manual intervention.

Fargate abstracts away the underlying compute. You specify CPU and memory requirements for your container, and AWS provisions the right amount of capacity for each task. When combined with ECS service autoscaling, the number of running tasks adjusts based on CPU utilization, memory usage, or request count. This means you pay only for the compute your application actually uses, and the service scales to handle traffic without over-provisioning.

ECS Cluster and Service

The ECS cluster is the logical grouping for your tasks. The Fargate service within the cluster defines how many copies of your container should run, which subnets to place them in, and how to connect to the load balancer. ECS maintains the desired task count by launching new tasks when existing ones fail health checks or are terminated.

ECR Repository and Image Build

The ECR repository stores your Docker image. The deployment builds the image from your local Dockerfile, tags it with a content-based hash, and pushes it to ECR. Fargate pulls the image from ECR when launching tasks. Using ECR keeps the entire build-push-deploy cycle within AWS and avoids external registry dependencies.

Application Load Balancer

The ALB provides a stable DNS name and distributes incoming HTTP traffic across healthy Fargate tasks. Target group health checks verify that tasks are responding correctly before sending them traffic. You can configure the health check path, interval, and threshold to match your application’s readiness behavior.

Common Customizations

  • Add HTTPS: Request an ACM certificate and an HTTPS listener on the ALB to terminate TLS, with automatic HTTP-to-HTTPS redirection.
  • Configure autoscaling: Ask for ECS service autoscaling based on CPU utilization or ALB request count to handle traffic spikes automatically.
  • Use a custom domain: Add a Route53 alias record pointing your domain to the ALB so users access your application through a clean URL.
  • Add environment variables: Request that the task definition includes environment variables or secrets from Secrets Manager for configuration like database connection strings or API keys.