resource "aws_security_group" "lb_sg" { count = var.service_instance.inputs.loadbalancer_type == "application" ? 1 : 0 description = "Automatically created Security Group for Application LB." vpc_id = var.environment.outputs.VpcId ingress { description = "Allow from anyone on port 80" from_port = 80 to_port = 80 protocol = "tcp" cidr_blocks = ["0.0.0.0/0"] } } resource "aws_security_group_rule" "lb_sg_egress" { count = var.service_instance.inputs.loadbalancer_type == "application" ? 1 : 0 description = "Load balancer to target" type = "egress" from_port = 80 to_port = 80 protocol = "tcp" cidr_blocks = ["0.0.0.0/0"] security_group_id = aws_security_group.lb_sg[0].id } resource "aws_lb" "service_lb" { load_balancer_type = var.service_instance.inputs.loadbalancer_type security_groups = var.service_instance.inputs.loadbalancer_type == "application" ? [ aws_security_group.lb_sg[0].id ] : null subnets = [var.environment.outputs.PublicSubnetOneId, var.environment.outputs.PublicSubnetTwoId] enable_deletion_protection = false } resource "aws_lb_listener" "service_lb_public_listener" { load_balancer_arn = aws_lb.service_lb.arn port = 80 protocol = var.service_instance.inputs.loadbalancer_type == "application" ? "HTTP" : "TCP" default_action { type = "forward" target_group_arn = aws_lb_target_group.service_lb_public_listener_target_group.arn } } resource "aws_lb_target_group" "service_lb_public_listener_target_group" { port = var.service_instance.inputs.port protocol = var.service_instance.inputs.loadbalancer_type == "application" ? "HTTP" : "TCP" stickiness { enabled = false type = var.service_instance.inputs.loadbalancer_type == "application" ? "lb_cookie" : "source_ip" } target_type = "ip" vpc_id = var.environment.outputs.VpcId } resource "aws_iam_role" "ecs_task_execution_role" { assume_role_policy = jsonencode({ "Version" : "2012-10-17", "Statement" : [ { "Effect" : "Allow", "Principal" : { "Service" : "ecs-tasks.amazonaws.com" }, "Action" : "sts:AssumeRole" } ] }) permissions_boundary = aws_iam_policy.task_role_permission_boundary.arn managed_policy_arns = concat([aws_iam_policy.base_task_role_policy.arn], local.component_policy_arns) } resource "aws_iam_policy" "task_role_permission_boundary" { policy = data.aws_iam_policy_document.task_role_permission_boundary_document.json } resource "aws_iam_policy" "base_task_role_policy" { policy = data.aws_iam_policy_document.base_task_role_managed_policy_document.json } resource "aws_iam_role_policy_attachment" "publish_role_policy_attachment" { policy_arn = aws_iam_policy.ecs_task_execution_role_policy.arn role = aws_iam_role.ecs_task_execution_role.name } resource "aws_iam_policy" "ecs_task_execution_role_policy" { policy = data.aws_iam_policy_document.ecs_task_execution_role_policy_document.json } variable "task_sizes" { default = { x-small = { cpu = 256, memory = 512 } small = { cpu = 512, memory = 1024 } medium = { cpu = 1024, memory = 2048 } large = { cpu = 2048, memory = 4096 } x-large = { cpu = 4096, memory = 8192 } } } resource "aws_ecs_task_definition" "service_task_definition" { family = "${var.service.name}_${var.service_instance.name}" task_role_arn = aws_iam_role.ecs_task_execution_role.arn execution_role_arn = var.environment.outputs.ServiceTaskDefExecutionRoleArn network_mode = "awsvpc" cpu = var.task_size_cpu[var.service_instance.inputs.task_size] memory = var.task_size_memory[var.service_instance.inputs.task_size] requires_compatibilities = ["FARGATE"] container_definitions = <