# Task definition with multiple containers
resource "aws_ecs_task_definition" "app" {
family = "app"
network_mode = "awsvpc"
requires_compatibilities = ["FARGATE"]
cpu = 1024
memory = 2048
execution_role_arn = aws_iam_role.execution.arn
task_role_arn = aws_iam_role.task.arn
container_definitions = jsonencode([
{
name = "app"
image = "nginx:latest"
essential = true
portMappings = [
{
containerPort = 80
protocol = "tcp"
}
]
logConfiguration = {
logDriver = "awslogs"
options = {
awslogs-group = aws_cloudwatch_log_group.app.name
awslogs-region = var.region
awslogs-stream-prefix = "app"
}
}
dependsOn = [
{
containerName = "envoy"
condition = "START"
}
]
},
{
name = "envoy"
image = "envoyproxy/envoy:v1.28-latest"
essential = true
portMappings = [
{
containerPort = 9901
protocol = "tcp"
}
]
logConfiguration = {
logDriver = "awslogs"
options = {
awslogs-group = aws_cloudwatch_log_group.app.name
awslogs-region = var.region
awslogs-stream-prefix = "envoy"
}
}
},
{
name = "datadog-agent"
image = "datadog/agent:latest"
essential = false
environment = [
{
name = "DD_API_KEY"
value = var.datadog_api_key
},
{
name = "ECS_FARGATE"
value = "true"
}
]
logConfiguration = {
logDriver = "awslogs"
options = {
awslogs-group = aws_cloudwatch_log_group.app.name
awslogs-region = var.region
awslogs-stream-prefix = "datadog"
}
}
}
])
}
# Deploy multi-container service
module "multi_container_service" {
source = "registry.patterneddesigns.ca/patterneddesigns/ecs-service/aws"
version = "2.0.0"
service_name = "multi-container-app"
cluster_arn = aws_ecs_cluster.main.arn
task_definition_arn = aws_ecs_task_definition.app.arn
desired_count = 2
load_balancer = {
target_group_arn = aws_lb_target_group.app.arn
container_name = "app" # Route traffic to the main app container
container_port = 80
}
network_configuration = {
subnets = var.private_subnet_ids
security_groups = [aws_security_group.ecs_tasks.id]
assign_public_ip = false
}
}