# Create target groups for blue/green deployment
resource "aws_lb_target_group" "blue" {
name = "api-blue"
port = 8080
protocol = "HTTP"
vpc_id = var.vpc_id
target_type = "ip"
health_check {
path = "/health"
healthy_threshold = 2
unhealthy_threshold = 3
}
}
resource "aws_lb_target_group" "green" {
name = "api-green"
port = 8080
protocol = "HTTP"
vpc_id = var.vpc_id
target_type = "ip"
health_check {
path = "/health"
healthy_threshold = 2
unhealthy_threshold = 3
}
}
# Create ALB listeners for production and test traffic
resource "aws_lb_listener" "production" {
load_balancer_arn = aws_lb.main.arn
port = 443
protocol = "HTTPS"
ssl_policy = "ELBSecurityPolicy-TLS13-1-2-2021-06"
certificate_arn = var.certificate_arn
default_action {
type = "forward"
target_group_arn = aws_lb_target_group.blue.arn
}
lifecycle {
ignore_changes = [default_action]
}
}
resource "aws_lb_listener" "test" {
load_balancer_arn = aws_lb.main.arn
port = 8443
protocol = "HTTPS"
ssl_policy = "ELBSecurityPolicy-TLS13-1-2-2021-06"
certificate_arn = var.certificate_arn
default_action {
type = "forward"
target_group_arn = aws_lb_target_group.green.arn
}
lifecycle {
ignore_changes = [default_action]
}
}
# Deploy ECS service with blue/green deployment
module "api_service" {
source = "registry.patterneddesigns.ca/patterneddesigns/ecs-service/aws"
version = "2.0.0"
service_name = "api-service"
cluster_arn = aws_ecs_cluster.main.arn
task_definition_arn = aws_ecs_task_definition.api.arn
desired_count = 3
load_balancer = {
target_group_arn = aws_lb_target_group.blue.arn
container_name = "api"
container_port = 8080
}
network_configuration = {
subnets = var.private_subnet_ids
security_groups = [aws_security_group.ecs_tasks.id]
assign_public_ip = false
}
deployment_controller = {
type = "CODE_DEPLOY"
}
blue_green_deployment = {
deployment_config_name = "CodeDeployDefault.ECSLinear10PercentEvery1Minutes"
termination_wait_time_minutes = 5
production_listener_arn = aws_lb_listener.production.arn
test_listener_arn = aws_lb_listener.test.arn
blue_target_group_name = aws_lb_target_group.blue.name
green_target_group_name = aws_lb_target_group.green.name
}
}