resource "aws_security_group" "alb" { name = "${var.name}-alb" description = "Public HTTPS ingress for ${var.name}" vpc_id = var.vpc_id } resource "aws_vpc_security_group_ingress_rule" "alb_https_v4" { security_group_id = aws_security_group.alb.id cidr_ipv4 = "0.0.0.0/0" from_port = 443 to_port = 443 ip_protocol = "tcp" description = "HTTPS" } resource "aws_vpc_security_group_ingress_rule" "alb_https_v6" { security_group_id = aws_security_group.alb.id cidr_ipv6 = "::/0" from_port = 443 to_port = 443 ip_protocol = "tcp" description = "HTTPS (IPv6)" } resource "aws_vpc_security_group_ingress_rule" "alb_http_v4" { security_group_id = aws_security_group.alb.id cidr_ipv4 = "0.0.0.0/0" from_port = 80 to_port = 80 ip_protocol = "tcp" description = "HTTP (redirects to HTTPS)" } resource "aws_vpc_security_group_ingress_rule" "alb_http_v6" { security_group_id = aws_security_group.alb.id cidr_ipv6 = "::/0" from_port = 80 to_port = 80 ip_protocol = "tcp" description = "HTTP (IPv6, redirects to HTTPS)" } resource "aws_vpc_security_group_egress_rule" "alb_all_v4" { security_group_id = aws_security_group.alb.id cidr_ipv4 = "0.0.0.0/0" ip_protocol = "-1" } resource "aws_vpc_security_group_egress_rule" "alb_all_v6" { security_group_id = aws_security_group.alb.id cidr_ipv6 = "::/0" ip_protocol = "-1" } resource "aws_lb" "this" { name = var.name load_balancer_type = "application" internal = false subnets = var.public_subnet_ids security_groups = [aws_security_group.alb.id] drop_invalid_header_fields = true } resource "aws_lb_target_group" "this" { name = var.name port = var.container_port protocol = "HTTP" target_type = "ip" vpc_id = var.vpc_id deregistration_delay = 30 health_check { path = "/health/live" protocol = "HTTP" matcher = "200" interval = 30 timeout = 5 healthy_threshold = 2 unhealthy_threshold = 3 } } resource "aws_lb_listener" "https" { load_balancer_arn = aws_lb.this.arn port = 443 protocol = "HTTPS" ssl_policy = "ELBSecurityPolicy-TLS13-1-2-2021-06" certificate_arn = aws_acm_certificate_validation.this.certificate_arn default_action { type = "forward" target_group_arn = aws_lb_target_group.this.arn } } resource "aws_lb_listener" "http_redirect" { load_balancer_arn = aws_lb.this.arn port = 80 protocol = "HTTP" default_action { type = "redirect" redirect { protocol = "HTTPS" port = "443" status_code = "HTTP_301" } } }