Skip to content

Commit d5cc8a5

Browse files
committed
fix-ecs-apex-redirect
1 parent 18c16be commit d5cc8a5

File tree

2 files changed

+93
-51
lines changed

2 files changed

+93
-51
lines changed

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

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -129,13 +129,13 @@ resource "aws_ecs_service" "ecs_service" {
129129
dynamic "load_balancer" {
130130
for_each = length(local.aws_ecs_container_port) > 0 ? [1] : []
131131
content {
132-
target_group_arn = aws_alb_target_group.lb_targets[count.index].id
132+
target_group_arn = aws_lb_target_group.lb_targets[count.index].id
133133
container_name = var.aws_ecs_task_name != "" ? local.aws_ecs_task_name[count.index] : "${local.aws_ecs_task_name[count.index]}${count.index}"
134134
container_port = local.aws_ecs_container_port[count.index]
135135
}
136136
}
137137

138-
depends_on = [aws_alb_listener.lb_listener, aws_alb_listener.lb_listener_ssl]
138+
depends_on = [aws_lb_listener.lb_listener, aws_lb_listener.lb_listener_ssl]
139139
}
140140

141141
resource "aws_ecs_service" "ecs_service_ignore_definition" {
@@ -156,7 +156,7 @@ resource "aws_ecs_service" "ecs_service_ignore_definition" {
156156
dynamic "load_balancer" {
157157
for_each = length(local.aws_ecs_container_port) > 0 ? [1] : []
158158
content {
159-
target_group_arn = aws_alb_target_group.lb_targets[count.index].id
159+
target_group_arn = aws_lb_target_group.lb_targets[count.index].id
160160
container_name = var.aws_ecs_task_name != "" ? local.aws_ecs_task_name[count.index] : "${local.aws_ecs_task_name[count.index]}${count.index}"
161161
container_port = local.aws_ecs_container_port[count.index]
162162
}
@@ -166,7 +166,7 @@ resource "aws_ecs_service" "ecs_service_ignore_definition" {
166166
ignore_changes = [task_definition]
167167
}
168168

169-
depends_on = [aws_alb_listener.lb_listener, aws_alb_listener.lb_listener_ssl]
169+
depends_on = [aws_lb_listener.lb_listener, aws_lb_listener.lb_listener_ssl]
170170
}
171171

172172
# Cloudwatch config

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

Lines changed: 89 additions & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ locals {
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
6969
resource "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

163163
resource "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+
205247
resource "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

230272
resource "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

266308
output "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

270312
output "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

274316
output "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

278320
output "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

283325
output "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

287329
output "ecs_sg_id" {

0 commit comments

Comments
 (0)