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 )
66 aws_ecs_lb_container_path = var. aws_ecs_lb_container_path != " " ? [for n in split (" ," , var. aws_ecs_lb_container_path ) : n ] : []
7- aws_ecs_lb_container_path_redirect = length (aws_alb_listener . https_redirect ) > 0 || length (aws_alb_listener . http_redirect ) > 0 ? local. aws_ecs_lb_container_path : []
7+ aws_ecs_lb_container_path_redirect = length (aws_lb_listener . https_redirect ) > 0 || length (aws_lb_listener . http_redirect ) > 0 ? local. aws_ecs_lb_container_path : []
88}
99
1010# Network part
@@ -35,7 +35,7 @@ resource "aws_security_group_rule" "incoming_alb" {
3535
3636# ## ALB --- Make this optional -- Using ALB name intentionally. (To make clear is an A LB)
3737
38- resource "aws_alb " "ecs_lb" {
38+ resource "aws_lb " "ecs_lb" {
3939 count = length (local. aws_ecs_sg_container_port ) > 0 ? 1 : 0
4040 name = var. aws_resource_identifier_supershort
4141 subnets = var. aws_selected_subnets
@@ -46,13 +46,13 @@ resource "aws_alb" "ecs_lb" {
4646 }
4747}
4848
49- data "aws_alb " "selected_lb" {
49+ data "aws_lb " "selected_lb" {
5050 count = length (local. aws_ecs_sg_container_port )
5151 name = var. aws_resource_identifier_supershort
52- depends_on = [aws_alb . ecs_lb ]
52+ depends_on = [aws_lb . ecs_lb ]
5353}
5454
55- resource "aws_alb_target_group " "lb_targets" {
55+ resource "aws_lb_target_group " "lb_targets" {
5656 count = length (local. aws_ecs_container_port )
5757 name = " ${ var . aws_resource_identifier_supershort } ${ count . index } "
5858 port = local. aws_ecs_container_port [count . index ]
@@ -61,59 +61,59 @@ resource "aws_alb_target_group" "lb_targets" {
6161 target_type = " ip"
6262
6363 lifecycle {
64- replace_triggered_by = [aws_security_group . ecs_sg ]
64+ replace_triggered_by = [aws_security_group . ecs_sg . id ]
6565 }
6666}
6767
6868# Always exists, acts as a safe dependency wrapper
6969resource "null_resource" "http_redirect_dep" {
7070 triggers = {
7171 id = (
72- length (aws_alb_listener . http_redirect ) > 0
73- ) ? aws_alb_listener .http_redirect[0 ].id : " none"
72+ length (aws_lb_listener . http_redirect ) > 0
73+ ) ? aws_lb_listener .http_redirect[0 ].id : " none"
7474 }
7575}
7676
77- resource "aws_alb_listener " "lb_listener_ssl" {
77+ resource "aws_lb_listener " "lb_listener_ssl" {
7878 count = var. aws_certificate_enabled ? length (local. aws_ecs_lb_port ) : 0
79- load_balancer_arn = aws_alb . ecs_lb [0 ]. id
79+ load_balancer_arn = aws_lb . ecs_lb [0 ]. id
8080 port = local. aws_ecs_lb_port [count . index ]
8181 # https://docs.aws.amazon.com/elasticloadbalancing/latest/application/create-https-listener.html
8282 ssl_policy = var. aws_ecs_lb_ssl_policy
8383 protocol = " HTTPS"
8484 certificate_arn = var. aws_certificates_selected_arn
8585 default_action {
86- target_group_arn = aws_alb_target_group . lb_targets [count . index ]. id
86+ target_group_arn = aws_lb_target_group . lb_targets [count . index ]. id
8787 type = " forward"
8888 }
8989 lifecycle {
9090 replace_triggered_by = [null_resource. http_redirect_dep . id ]
9191 }
92- depends_on = [ aws_alb_listener . http_redirect ]
92+ depends_on = [ aws_lb_listener . http_redirect ]
9393}
9494
95- resource "aws_alb_listener " "lb_listener" {
95+ resource "aws_lb_listener " "lb_listener" {
9696 count = var. aws_certificate_enabled ? 0 : length (local. aws_ecs_lb_port )
97- load_balancer_arn = aws_alb . ecs_lb [0 ]. id
97+ load_balancer_arn = aws_lb . ecs_lb [0 ]. id
9898 port = local. aws_ecs_lb_port [count . index ]
9999 protocol = " HTTP"
100100 default_action {
101- target_group_arn = aws_alb_target_group . lb_targets [count . index ]. id
101+ target_group_arn = aws_lb_target_group . lb_targets [count . index ]. id
102102 type = " forward"
103103 }
104104 lifecycle {
105105 replace_triggered_by = [null_resource. http_redirect_dep . id ]
106106 }
107- depends_on = [ aws_alb_listener . http_redirect ]
107+ depends_on = [ aws_lb_listener . http_redirect ]
108108}
109109
110- resource "aws_alb_listener_rule " "redirect_based_on_path" {
110+ resource "aws_lb_listener_rule " "redirect_based_on_path" {
111111 for_each = { for idx , path in local . aws_ecs_lb_container_path : idx => path if length (path) > 0 }
112- listener_arn = var. aws_certificate_enabled ? aws_alb_listener . lb_listener_ssl [0 ]. arn : aws_alb_listener . lb_listener [0 ]. arn
112+ listener_arn = var. aws_certificate_enabled ? aws_lb_listener . lb_listener_ssl [0 ]. arn : aws_lb_listener . lb_listener [0 ]. arn
113113
114114 action {
115115 type = " forward"
116- target_group_arn = aws_alb_target_group . lb_targets [each . key + 1 ]. arn
116+ target_group_arn = aws_lb_target_group . lb_targets [each . key + 1 ]. arn
117117 }
118118
119119 condition {
@@ -123,9 +123,9 @@ resource "aws_alb_listener_rule" "redirect_based_on_path" {
123123 }
124124}
125125
126- resource "aws_alb_listener " "http_redirect" {
126+ resource "aws_lb_listener " "http_redirect" {
127127 count = var. aws_ecs_lb_redirect_enable && ! contains (local. aws_ecs_lb_port ,80 ) && var. aws_certificate_enabled ? 1 : 0
128- load_balancer_arn = aws_alb . ecs_lb [0 ]. id
128+ load_balancer_arn = aws_lb . ecs_lb [0 ]. id
129129 port = " 80"
130130 protocol = " HTTP"
131131
@@ -139,29 +139,29 @@ resource "aws_alb_listener" "http_redirect" {
139139 }
140140 }
141141 depends_on = [
142- aws_alb . ecs_lb ,
143- aws_alb_target_group . lb_targets
142+ aws_lb . ecs_lb ,
143+ aws_lb_target_group . lb_targets
144144 ]
145145}
146146
147- resource "aws_alb_listener " "http_forward" {
148- count = var. aws_ecs_lb_redirect_enable && ! contains (local. aws_ecs_lb_port ,80 ) && ! var. aws_certificate_enabled ? 1 : 0
149- load_balancer_arn = aws_alb . ecs_lb [0 ]. id
147+ resource "aws_lb_listener " "http_forward" {
148+ count = var. aws_ecs_lb_redirect_enable && ! contains (local. aws_ecs_lb_port ,80 ) && ! var. aws_certificate_enabled && ! var . aws_ecs_lb_www_to_apex_redirect ? 1 : 0
149+ load_balancer_arn = aws_lb . ecs_lb [0 ]. id
150150 port = " 80"
151151 protocol = " HTTP"
152152
153153 default_action {
154154 type = " forward"
155- target_group_arn = aws_alb_target_group . lb_targets [0 ]. id
155+ target_group_arn = aws_lb_target_group . lb_targets [0 ]. id
156156 }
157157 depends_on = [
158- aws_alb . ecs_lb ,
159- aws_alb_target_group . lb_targets
158+ aws_lb . ecs_lb ,
159+ aws_lb_target_group . lb_targets
160160 ]
161161}
162162
163163resource "aws_security_group_rule" "incoming_alb_http" {
164- count = length (aws_alb_listener . http_redirect )
164+ count = length (aws_lb_listener . http_redirect ) + length (aws_lb_listener . http_forward ) + length (aws_lb_listener . http_www_redirect )
165165 type = " ingress"
166166 from_port = 80
167167 to_port = 80
@@ -170,29 +170,33 @@ resource "aws_security_group_rule" "incoming_alb_http" {
170170 security_group_id = aws_security_group. ecs_lb_sg . id
171171}
172172
173- resource "aws_alb_listener " "https_redirect" {
173+ resource "aws_lb_listener " "https_redirect" {
174174 count = var. aws_ecs_lb_redirect_enable && ! contains (local. aws_ecs_lb_port ,443 ) && var. aws_certificate_enabled ? 1 : 0
175175 # count = var.aws_ecs_lb_redirect_enable && !contains(local.aws_ecs_lb_port,443) ? var.aws_certificates_selected_arn != "" ? 1 : 0 : 0
176176 # count = var.aws_ecs_lb_redirect_enable && var.aws_certificates_selected_arn != "" && !contains(local.aws_ecs_lb_port,443) ? 1 : 0
177- load_balancer_arn = " ${ aws_alb . ecs_lb [0 ]. id } "
177+ load_balancer_arn = aws_lb . ecs_lb [0 ]. id
178178 port = " 443"
179179 protocol = " HTTPS"
180180 certificate_arn = var. aws_certificates_selected_arn
181- ssl_policy = var. aws_certificates_selected_arn != " " ? " ELBSecurityPolicy-TLS13-1-2-2021-06 " : " " # https://docs.aws.amazon.com/elasticloadbalancing/latest/application/create-https-listener.html
181+ ssl_policy = var. aws_certificates_selected_arn != " " ? var . aws_ecs_lb_ssl_policy : " " # https://docs.aws.amazon.com/elasticloadbalancing/latest/application/create-https-listener.html
182182
183183 default_action {
184- target_group_arn = aws_alb_target_group . lb_targets [0 ]. id
184+ target_group_arn = aws_lb_target_group . lb_targets [0 ]. id
185185 type = " forward"
186186 }
187187}
188188
189- resource "aws_alb_listener_rule " "redirect_based_on_path_for_http" {
189+ resource "aws_lb_listener_rule " "redirect_based_on_path_for_http" {
190190 for_each = { for idx , path in local . aws_ecs_lb_container_path_redirect : idx => path if length (path) > 0 }
191- listener_arn = var. aws_certificates_selected_arn != " " ? aws_alb_listener. https_redirect [0 ]. arn : aws_alb_listener. http_redirect [0 ]. arn
192-
191+ # listener_arn = var.aws_certificates_selected_arn != "" ? aws_lb_listener.https_redirect[0].arn : aws_lb_listener.http_redirect[0].arn
192+ listener_arn = var. aws_certificate_enabled ? aws_lb_listener. https_redirect [0 ]. arn : (
193+ length (aws_lb_listener. http_redirect ) > 0 ? aws_lb_listener. http_redirect [0 ]. arn : (
194+ length (aws_lb_listener. http_forward ) > 0 ? aws_lb_listener. http_forward [0 ]. arn : aws_lb_listener. http_www_redirect [0 ]. arn
195+ )
196+ )
193197 action {
194198 type = " forward"
195- target_group_arn = aws_alb_target_group . lb_targets [each . key + 1 ]. arn
199+ target_group_arn = aws_lb_target_group . lb_targets [each . key + 1 ]. arn
196200 }
197201
198202 condition {
@@ -202,9 +206,47 @@ resource "aws_alb_listener_rule" "redirect_based_on_path_for_http" {
202206 }
203207}
204208
209+ resource "aws_lb_listener" "http_www_redirect" {
210+ count = var. aws_ecs_lb_redirect_enable && ! contains (local. aws_ecs_lb_port ,80 ) && ! var. aws_certificate_enabled && var. aws_ecs_lb_www_to_apex_redirect ? 1 : 0
211+ load_balancer_arn = aws_lb. ecs_lb [0 ]. id
212+ port = " 80"
213+ protocol = " HTTP"
214+
215+ default_action {
216+ type = " fixed-response"
217+
218+ fixed_response {
219+ content_type = " text/plain"
220+ message_body = " Not Found"
221+ status_code = " 404"
222+ }
223+ }
224+ depends_on = [
225+ aws_lb . ecs_lb ,
226+ aws_lb_target_group . lb_targets
227+ ]
228+ }
229+
230+ resource "aws_lb_listener_rule" "http_forward_apex" {
231+ count = var. aws_ecs_lb_www_to_apex_redirect && var. aws_r53_domain_name != " " && ! var. aws_certificate_enabled ? 1 : 0
232+ listener_arn = aws_lb_listener. http_www_redirect [0 ]. arn
233+ priority = 20
234+
235+ condition {
236+ host_header {
237+ values = [var . aws_r53_domain_name ]
238+ }
239+ }
240+
241+ action {
242+ type = " forward"
243+ target_group_arn = aws_lb_target_group. lb_targets [0 ]. id
244+ }
245+ }
246+
205247resource "aws_lb_listener_rule" "redirect_www_to_apex" {
206248 count = var. aws_ecs_lb_www_to_apex_redirect && var. aws_r53_domain_name != " " ? 1 : 0
207- listener_arn = var. aws_certificate_enabled ? aws_alb_listener . lb_listener_ssl [0 ]. arn : aws_alb_listener . lb_listener [0 ]. arn
249+ listener_arn = var. aws_certificate_enabled ? aws_lb_listener . https_redirect [0 ]. arn : aws_lb_listener . http_www_redirect [0 ]. arn
208250 priority = 10
209251
210252 condition {
@@ -220,15 +262,15 @@ resource "aws_lb_listener_rule" "redirect_www_to_apex" {
220262 port = var. aws_certificate_enabled ? " 443" : " 80"
221263 protocol = var. aws_certificate_enabled ? " HTTPS" : " HTTP"
222264 status_code = " HTTP_301"
223- host = " ${ var . aws_r53_domain_name } "
265+ host = var. aws_r53_domain_name
224266 path = " /#{path}"
225267 query = " #{query}"
226268 }
227269 }
228270}
229271
230272resource "aws_security_group_rule" "incoming_alb_https" {
231- count = length (aws_alb_listener . https_redirect )
273+ count = length (aws_lb_listener . https_redirect )
232274 type = " ingress"
233275 from_port = 443
234276 to_port = 443
@@ -264,24 +306,24 @@ resource "aws_security_group_rule" "incoming_ecs_lb_ports" {
264306}
265307
266308output "load_balancer_dns" {
267- value = length (local. aws_ecs_sg_container_port ) > 0 ? aws_alb . ecs_lb [0 ]. dns_name : " "
309+ value = length (local. aws_ecs_sg_container_port ) > 0 ? aws_lb . ecs_lb [0 ]. dns_name : " "
268310}
269311
270312output "load_balancer_port" {
271- value = length (local. aws_ecs_sg_container_port ) > 0 ? (var. aws_certificate_enabled ? aws_alb_listener . lb_listener_ssl [0 ]. port : aws_alb_listener . lb_listener [0 ]. port ) : " "
313+ value = length (local. aws_ecs_sg_container_port ) > 0 ? (var. aws_certificate_enabled ? aws_lb_listener . lb_listener_ssl [0 ]. port : aws_lb_listener . lb_listener [0 ]. port ) : " "
272314}
273315
274316output "load_balancer_protocol" {
275- value = length (local. aws_ecs_sg_container_port ) > 0 ? (var. aws_certificate_enabled ? aws_alb_listener . lb_listener_ssl [0 ]. protocol : aws_alb_listener . lb_listener [0 ]. protocol ) : " "
317+ value = length (local. aws_ecs_sg_container_port ) > 0 ? (var. aws_certificate_enabled ? aws_lb_listener . lb_listener_ssl [0 ]. protocol : aws_lb_listener . lb_listener [0 ]. protocol ) : " "
276318}
277319
278320output "load_balancer_zone_id" {
279- # value = aws_alb .ecs_lb[0].zone_id
280- value = length (local. aws_ecs_sg_container_port ) > 0 ? data. aws_alb . selected_lb [0 ]. zone_id : " "
321+ # value = aws_lb .ecs_lb[0].zone_id
322+ value = length (local. aws_ecs_sg_container_port ) > 0 ? data. aws_lb . selected_lb [0 ]. zone_id : " "
281323}
282324
283325output "load_balancer_arn" {
284- value = length (local. aws_ecs_sg_container_port ) > 0 ? aws_alb . ecs_lb [0 ]. arn : " "
326+ value = length (local. aws_ecs_sg_container_port ) > 0 ? aws_lb . ecs_lb [0 ]. arn : " "
285327}
286328
287329output "ecs_sg_id" {
0 commit comments