Skip to content

Commit 8536587

Browse files
authored
Make ECS ALB be optional - dynamic creation (#98)
* Adding conditional to create lb and fixing vars * Fixing lb output conditionals * Fixing case where ignore is true * Ignoring R53 creation if no ALB is created
1 parent a4636c6 commit 8536587

File tree

3 files changed

+42
-31
lines changed

3 files changed

+42
-31
lines changed

operations/deployment/terraform/aws/bitovi_main.tf

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -512,7 +512,7 @@ module "aws_ecs" {
512512

513513
module "aws_route53_ecs" {
514514
source = "../modules/aws/route53"
515-
count = var.aws_ecs_enable && var.aws_r53_enable && var.aws_r53_domain_name != "" ? 1 : 0
515+
count = var.aws_ecs_enable && var.aws_r53_enable && var.aws_r53_domain_name != "" && module.aws_ecs[0].load_balancer_arn != "" ? 1 : 0
516516
# R53 values
517517
aws_r53_domain_name = var.aws_r53_domain_name
518518
aws_r53_sub_domain_name = var.aws_r53_sub_domain_name
@@ -533,7 +533,7 @@ module "aws_route53_ecs" {
533533

534534
module "aws_waf_ecs" {
535535
source = "../modules/aws/waf"
536-
count = var.aws_waf_enable && var.aws_ecs_enable ? 1 : 0
536+
count = var.aws_waf_enable && var.aws_ecs_enable && module.aws_ecs[0].load_balancer_arn != "" ? 1 : 0
537537
aws_waf_enable = var.aws_waf_enable
538538
aws_waf_logging_enable = var.aws_waf_logging_enable
539539
aws_waf_log_retention_days = var.aws_waf_log_retention_days

operations/deployment/terraform/modules/aws/ecs/aws_ecs.tf

Lines changed: 24 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -49,15 +49,15 @@ resource "aws_ecs_task_definition" "ecs_task" {
4949
"memory": local.aws_ecs_container_mem[count.index],
5050
"essential": true,
5151
"networkMode": "awsvpc",
52-
"portMappings": [
52+
"portMappings": length(local.aws_ecs_container_port) > 0 ? [
5353
{
5454
"name": "port-${local.aws_ecs_container_port[count.index]}",
5555
"containerPort": tonumber(local.aws_ecs_container_port[count.index]),
5656
"hostPort": tonumber(local.aws_ecs_container_port[count.index]),
5757
"protocol": "tcp",
5858
"appProtocol": "http"
5959
}
60-
],
60+
] : []
6161
"environment": local.env_repo_vars,
6262
"logConfiguration": var.aws_ecs_cloudwatch_enable ? {
6363
"logDriver": "awslogs",
@@ -78,9 +78,9 @@ resource "aws_ecs_task_definition" "ecs_task_from_json" {
7878
count = var.aws_ecs_task_ignore_definition ? 0 : length(local.aws_ecs_task_json_definition_file)
7979
family = var.aws_ecs_task_name != "" ? local.aws_ecs_task_name[count.index + length(local.aws_ecs_app_image)] : "${local.aws_ecs_task_name[count.index + length(local.aws_ecs_app_image)]}${count.index+length(local.aws_ecs_app_image)}"
8080
network_mode = local.aws_ecs_task_network_mode[count.index + length(local.aws_ecs_app_image)]
81-
requires_compatibilities = ["${local.aws_ecs_task_type[count.index +length(local.aws_ecs_app_image)]}"]
82-
cpu = local.aws_ecs_task_cpu[count.index+length(local.aws_ecs_app_image)]
83-
memory = local.aws_ecs_task_mem[count.index+length(local.aws_ecs_app_image)]
81+
requires_compatibilities = [local.aws_ecs_task_type[count.index + length(local.aws_ecs_app_image)]]
82+
cpu = local.aws_ecs_task_cpu[count.index + length(local.aws_ecs_app_image)]
83+
memory = local.aws_ecs_task_mem[count.index + length(local.aws_ecs_app_image)]
8484
execution_role_arn = local.ecsTaskExecutionRole
8585
container_definitions = sensitive(file("../../ansible/clone_repo/app/${var.app_repo_name}/${local.aws_ecs_task_json_definition_file[count.index]}"))
8686
}
@@ -115,7 +115,7 @@ resource "aws_ecs_service" "ecs_service" {
115115
count = var.aws_ecs_task_ignore_definition ? 0 : local.tasks_count
116116
name = var.aws_ecs_service_name != "" ? "${var.aws_ecs_service_name}${count.index}" : "${var.aws_resource_identifier}-${count.index}-service"
117117
cluster = aws_ecs_cluster.cluster.id
118-
task_definition = local.tasks_arns[count.index]
118+
task_definition = local.tasks_arns[count.index]
119119

120120
desired_count = local.aws_ecs_node_count[count.index]
121121
launch_type = var.aws_ecs_service_launch_type
@@ -126,11 +126,16 @@ resource "aws_ecs_service" "ecs_service" {
126126
assign_public_ip = var.aws_ecs_assign_public_ip
127127
}
128128

129-
load_balancer {
130-
target_group_arn = aws_alb_target_group.lb_targets[count.index].id
131-
container_name = var.aws_ecs_task_name != "" ? local.aws_ecs_task_name[count.index] : "${local.aws_ecs_task_name[count.index]}${count.index}"
132-
container_port = local.aws_ecs_container_port[count.index]
129+
dynamic "load_balancer" {
130+
for_each = length(local.aws_ecs_container_port) > 0 ? [1] : []
131+
content {
132+
target_group_arn = aws_alb_target_group.lb_targets[count.index].id
133+
container_name = var.aws_ecs_task_name != "" ? local.aws_ecs_task_name[count.index] : "${local.aws_ecs_task_name[count.index]}${count.index}"
134+
container_port = local.aws_ecs_container_port[count.index]
135+
}
133136
}
137+
138+
depends_on = [aws_alb_listener.lb_listener, aws_alb_listener.lb_listener_ssl]
134139
}
135140

136141
resource "aws_ecs_service" "ecs_service_ignore_definition" {
@@ -148,19 +153,23 @@ resource "aws_ecs_service" "ecs_service_ignore_definition" {
148153
assign_public_ip = var.aws_ecs_assign_public_ip
149154
}
150155

151-
load_balancer {
152-
target_group_arn = aws_alb_target_group.lb_targets[count.index].id
153-
container_name = var.aws_ecs_task_name != "" ? local.aws_ecs_task_name[count.index] : "${local.aws_ecs_task_name[count.index]}${count.index}"
154-
container_port = local.aws_ecs_container_port[count.index]
156+
dynamic "load_balancer" {
157+
for_each = length(local.aws_ecs_container_port) > 0 ? [1] : []
158+
content {
159+
target_group_arn = aws_alb_target_group.lb_targets[count.index].id
160+
container_name = var.aws_ecs_task_name != "" ? local.aws_ecs_task_name[count.index] : "${local.aws_ecs_task_name[count.index]}${count.index}"
161+
container_port = local.aws_ecs_container_port[count.index]
162+
}
155163
}
156164

157165
lifecycle {
158166
ignore_changes = [task_definition]
159167
}
168+
169+
depends_on = [aws_alb_listener.lb_listener, aws_alb_listener.lb_listener_ssl]
160170
}
161171

162172
# Cloudwatch config
163-
164173
resource "aws_cloudwatch_log_group" "ecs_cw_log_group" {
165174
count = var.aws_ecs_cloudwatch_enable ? 1 : 0
166175
name = var.aws_ecs_cloudwatch_lg_name

operations/deployment/terraform/modules/aws/ecs/aws_ecs_networking.tf

Lines changed: 16 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
locals {
2-
aws_ecs_container_port = [for n in split(",", var.aws_ecs_container_port) : tonumber(n)]
2+
aws_ecs_container_port = var.aws_ecs_container_port != "" ? [for n in split(",", var.aws_ecs_container_port) : tonumber(n)] : var.aws_ecs_task_ignore_definition ? [80] : []
33
aws_ecs_sg_container_port = distinct(local.aws_ecs_container_port)
44
aws_ecs_lb_port = var.aws_ecs_lb_port != "" ? [for n in split(",", var.aws_ecs_lb_port) : tonumber(n)] : local.aws_ecs_container_port
55
aws_ecs_sg_lb_port = distinct(local.aws_ecs_lb_port)
@@ -36,6 +36,7 @@ resource "aws_security_group_rule" "incoming_alb" {
3636
### ALB --- Make this optional -- Using ALB name intentionally. (To make clear is an A LB)
3737

3838
resource "aws_alb" "ecs_lb" {
39+
count = length(local.aws_ecs_sg_container_port) > 1 ? 1 : 0
3940
name = var.aws_resource_identifier_supershort
4041
subnets = var.aws_selected_subnets
4142
security_groups = [aws_security_group.ecs_lb_sg.id]
@@ -46,8 +47,9 @@ resource "aws_alb" "ecs_lb" {
4647
}
4748

4849
data "aws_alb" "selected_lb" {
49-
name = var.aws_resource_identifier_supershort
50-
depends_on = [ aws_alb.ecs_lb ]
50+
count = length(local.aws_ecs_sg_container_port)
51+
name = var.aws_resource_identifier_supershort
52+
depends_on = [aws_alb.ecs_lb]
5153
}
5254

5355
resource "aws_alb_target_group" "lb_targets" {
@@ -74,7 +76,7 @@ resource "null_resource" "http_redirect_dep" {
7476

7577
resource "aws_alb_listener" "lb_listener_ssl" {
7678
count = var.aws_certificate_enabled ? length(local.aws_ecs_lb_port) : 0
77-
load_balancer_arn = aws_alb.ecs_lb.id
79+
load_balancer_arn = aws_alb.ecs_lb[0].id
7880
port = local.aws_ecs_lb_port[count.index]
7981
# https://docs.aws.amazon.com/elasticloadbalancing/latest/application/create-https-listener.html
8082
ssl_policy = var.aws_ecs_lb_ssl_policy
@@ -92,7 +94,7 @@ resource "aws_alb_listener" "lb_listener_ssl" {
9294

9395
resource "aws_alb_listener" "lb_listener" {
9496
count = var.aws_certificate_enabled ? 0 : length(local.aws_ecs_lb_port)
95-
load_balancer_arn = aws_alb.ecs_lb.id
97+
load_balancer_arn = aws_alb.ecs_lb[0].id
9698
port = local.aws_ecs_lb_port[count.index]
9799
protocol = "HTTP"
98100
default_action {
@@ -123,7 +125,7 @@ resource "aws_alb_listener_rule" "redirect_based_on_path" {
123125

124126
resource "aws_alb_listener" "http_redirect" {
125127
count = var.aws_ecs_lb_redirect_enable && !contains(local.aws_ecs_lb_port,80) ? 1 : 0
126-
load_balancer_arn = aws_alb.ecs_lb.id
128+
load_balancer_arn = aws_alb.ecs_lb[0].id
127129
port = "80"
128130
protocol = "HTTP"
129131

@@ -161,7 +163,7 @@ resource "aws_alb_listener" "https_redirect" {
161163
count = var.aws_ecs_lb_redirect_enable && !contains(local.aws_ecs_lb_port,443) && var.aws_certificate_enabled ? 1 : 0
162164
#count = var.aws_ecs_lb_redirect_enable && !contains(local.aws_ecs_lb_port,443) ? var.aws_certificates_selected_arn != "" ? 1 : 0 : 0
163165
#count = var.aws_ecs_lb_redirect_enable && var.aws_certificates_selected_arn != "" && !contains(local.aws_ecs_lb_port,443) ? 1 : 0
164-
load_balancer_arn = "${aws_alb.ecs_lb.id}"
166+
load_balancer_arn = "${aws_alb.ecs_lb[0].id}"
165167
port = "443"
166168
protocol = "HTTPS"
167169
certificate_arn = var.aws_certificates_selected_arn
@@ -226,30 +228,30 @@ resource "aws_security_group_rule" "incoming_ecs_lb_ports" {
226228
}
227229

228230
output "load_balancer_dns" {
229-
value = aws_alb.ecs_lb.dns_name
231+
value = length(local.aws_ecs_sg_container_port) > 1 ? aws_alb.ecs_lb[0].dns_name : ""
230232
}
231233

232234
output "load_balancer_port" {
233-
value = var.aws_certificate_enabled ? aws_alb_listener.lb_listener_ssl[0].port : aws_alb_listener.lb_listener[0].port
235+
value = length(local.aws_ecs_sg_container_port) > 1 ? (var.aws_certificate_enabled ? aws_alb_listener.lb_listener_ssl[0].port : aws_alb_listener.lb_listener[0].port) : ""
234236
}
235237

236238
output "load_balancer_protocol" {
237-
value = var.aws_certificate_enabled ? aws_alb_listener.lb_listener_ssl[0].protocol : aws_alb_listener.lb_listener[0].protocol
239+
value = length(local.aws_ecs_sg_container_port) > 1 ? (var.aws_certificate_enabled ? aws_alb_listener.lb_listener_ssl[0].protocol : aws_alb_listener.lb_listener[0].protocol) : ""
238240
}
239241

240242
output "load_balancer_zone_id" {
241-
#value = aws_alb.ecs_lb.zone_id
242-
value = data.aws_alb.selected_lb.zone_id
243+
#value = aws_alb.ecs_lb[0].zone_id
244+
value = length(local.aws_ecs_sg_container_port) > 1 ? data.aws_alb.selected_lb[0].zone_id : ""
243245
}
244246

245247
output "load_balancer_arn" {
246-
value = aws_alb.ecs_lb.arn
248+
value = length(local.aws_ecs_sg_container_port) > 1 ? aws_alb.ecs_lb[0].arn : ""
247249
}
248250

249251
output "ecs_sg_id" {
250252
value = aws_security_group.ecs_sg.id
251253
}
252254

253255
output "ecs_lb_sg_id" {
254-
value = aws_security_group.ecs_lb_sg.id
256+
value = length(local.aws_ecs_sg_container_port) > 1 ? aws_security_group.ecs_lb_sg.id : ""
255257
}

0 commit comments

Comments
 (0)