terraform { required_providers { aws = { source = "hashicorp/aws" version = "~> 4.0" } } } provider "aws" { region = "us-east-1" } ## Data data "aws_vpc" "vpc_id" { filter { name = "tag:Name" values = ["VPC"] } lifecycle { postcondition { condition = self.enable_dns_support == true error_message = "The selected VPC must have DNS support enabled." } } } data "aws_subnets" "private_subnets" { filter { name = "tag:Tier" values = ["Private"] } } data "aws_subnets" "public_subnets" { filter { name = "tag:Tier" values = ["Public"] } } ## ECS Windows Cluster resource "aws_ecs_cluster" "ecs_windows_cluster" { name = var.ecs_windows_cluster_name setting { name = "containerInsights" value = "enabled" } } ## ECS IAM Roles and Instance Roles resource "aws_iam_role" "ecsTaskExecutionRole" { name = var.ecsTaskExecutionRole_name path = "/" managed_policy_arns = local.managedpolicies_AmazonECSTaskExecutionRolePolicy assume_role_policy = jsonencode({ Version = "2012-10-17" Statement = [ { Action = "sts:AssumeRole" Sid = "" Effect = "Allow" Principal = { Service = "ecs-tasks.amazonaws.com" } }, ] }) } resource "aws_iam_role" "ecsInstanceRole" { name = var.ecsInstanceRole_name path = "/" managed_policy_arns = local.managedpolicies_AmazonEC2ContainerServiceforEC2Role assume_role_policy = jsonencode({ Version = "2012-10-17" Statement = [ { Action = "sts:AssumeRole" Sid = "" Effect = "Allow" Principal = { Service = "ec2.amazonaws.com" } }, ] }) } resource "aws_iam_instance_profile" "ecs_windows_ecsInstanceRole_profile" { name = var.ecs_windows_ecsInstanceRole_profile_name role = aws_iam_role.ecsInstanceRole.name } ## Security Groups resource "aws_security_group" "alb_ingress" { name = var.alb_ingress_name description = "Ingress traffic from Internet" vpc_id = data.aws_vpc.vpc_id.id dynamic "ingress" { for_each = var.alb_ingress_ports content { from_port = ingress.value to_port = ingress.value protocol = local.tcp_protocol cidr_blocks = local.all_ips_ipv4 } } egress { from_port = local.any_port to_port = local.any_port protocol = local.any_protocol cidr_blocks = local.all_ips_ipv4 ipv6_cidr_blocks = local.all_ips_ipv6 } } resource "aws_security_group" "ecs_container_instances_ingress" { name = var.ecs_container_instances_ingress_name description = "Ingress traffic from ALB to Container Instance - Dynamic Ports" vpc_id = data.aws_vpc.vpc_id.id ingress { description = "Dynamic ports allows from ALB Security Group" from_port = 32768 to_port = 65535 protocol = "tcp" security_groups = [aws_security_group.alb_ingress.id] } egress { from_port = local.any_port to_port = local.any_port protocol = local.any_protocol cidr_blocks = local.all_ips_ipv4 ipv6_cidr_blocks = local.all_ips_ipv6 } } ## Launch Template data "aws_ami" "ecs_optimized_ami" { most_recent = true owners = ["amazon"] filter { name = "name" values = ["Windows_Server-2019-English-Core-ECS_Optimized-*"] } } resource "aws_launch_template" "ecs_container_instances" { name = var.launch_template_name image_id = data.aws_ami.ecs_optimized_ami.id instance_type = var.ec2_instance_types vpc_security_group_ids = [aws_security_group.ecs_container_instances_ingress.id] update_default_version = true lifecycle { create_before_destroy = true } iam_instance_profile { name = aws_iam_instance_profile.ecs_windows_ecsInstanceRole_profile.name } monitoring { enabled = true } block_device_mappings { device_name = "/dev/sda1" ebs { volume_size = 50 } } user_data = "${base64encode(< Initialize-ECSAgent -Cluster ${aws_ecs_cluster.ecs_windows_cluster.name} -EnableTaskIAMRole -AwsvpcBlockIMDS -EnableTaskENI -LoggingDrivers '["json-file","awslogs"]' [Environment]::SetEnvironmentVariable("ECS_ENABLE_AWSLOGS_EXECUTIONROLE_OVERRIDE",$TRUE, "Machine") EOF )}" tag_specifications { resource_type = "instance" tags = { Name = "ECS Windows - Container Instance" } } } ## Auto_Scaling_Group resource "aws_autoscaling_group" "asg_ecs_cluster" { name = var.asg_name desired_capacity = var.asg_desired_capacity max_size = var.asg_max_size min_size = var.asg_min_size vpc_zone_identifier = data.aws_subnets.private_subnets.ids force_delete = true enabled_metrics = local.asg_metrics launch_template { id = aws_launch_template.ecs_container_instances.id version = aws_launch_template.ecs_container_instances.latest_version } instance_refresh { strategy = "Rolling" preferences { min_healthy_percentage = 50 } } } ## ECS Task_Definitions (Optional) ### Fargate Task_Definition resource "aws_ecs_task_definition" "fargate_task_definition_iis" { family = var.fargate_task_definition_name requires_compatibilities = ["FARGATE"] network_mode = "awsvpc" cpu = var.fargate_task_definition_cpu memory = var.fargate_task_definition_memory container_definitions = <