-
Notifications
You must be signed in to change notification settings - Fork 1
/
load_balancer.tf
153 lines (132 loc) · 4.66 KB
/
load_balancer.tf
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
// Route53에서 aws.devnote.dev라는 이름의 도메인을 생성합니다.
resource "aws_route53_zone" "aws_devnote_dev_zone" {
name = "aws.devnote.dev"
}
// 로드 밸런서의 대상 그룹을 생성합니다. 이름은 TFC-PRD-TG이고, 포트 80에서 HTTP를 사용합니다.
resource "aws_lb_target_group" "TFC_PRD_TG" {
name = "TFC-PRD-TG"
port = 80
protocol = "HTTP"
vpc_id = aws_vpc.TFC_PRD_VPC.id
// 대상 그룹의 상태를 확인하는 헬스 체크를 설정합니다.
health_check {
enabled = true
interval = 30
path = "/Static.html"
port = 80
timeout = 5
healthy_threshold = 3
unhealthy_threshold = 3
}
// 대상 그룹에 이름 태그를 추가합니다.
tags = {
Name = "TFC-PRD-TG"
}
}
// 어플리케이션 로드 밸런서를 생성합니다. 이름은 TFC-PRD-ALB입니다.
resource "aws_lb" "TFC_PRD_ALB" {
internal = false
load_balancer_type = "application"
name = "TFC-PRD-ALB"
security_groups = [aws_security_group.TFC_PRD_ALB_SG.id]
subnets = [aws_subnet.TFC_PRD_sub[0].id, aws_subnet.TFC_PRD_sub[1].id]
enable_deletion_protection = false
// 로드 밸런서에 이름 태그를 추가합니다.
tags = {
Name = "TFC-PRD-ALB"
}
}
// 로드 밸런서의 HTTP 리스너를 생성합니다. 포트 80에서 동작합니다.
resource "aws_lb_listener" "TFC_PRD_Listener_HTTP" {
load_balancer_arn = aws_lb.TFC_PRD_ALB.arn
port = 80
protocol = "HTTP"
// 대상 그룹을 기본 동작으로 설정합니다.
default_action {
type = "forward"
target_group_arn = aws_lb_target_group.TFC_PRD_TG.arn
}
}
// HTTPS 리스너의 리디렉션 규칙을 생성합니다.
resource "aws_lb_listener_rule" "TFC_PRD_ListenerRule_Redirect_HTTPS" {
listener_arn = aws_lb_listener.TFC_PRD_Listener_HTTPS.arn
// 리디렉션 동작을 설정합니다.
action {
type = "redirect"
redirect {
host = "#{host}"
path = "/Static.html"
port = "443"
protocol = "HTTPS"
query = "#{query}"
status_code = "HTTP_301"
}
}
// 경로 패턴 조건을 설정합니다.
condition {
path_pattern {
values = ["/"]
}
}
}
# HTTP 리스너의 리디렉션 규칙을 생성합니다.
resource "aws_lb_listener_rule" "TFC_PRD_ListenerRule_Redirect_HTTP_to_HTTPS" {
listener_arn = aws_lb_listener.TFC_PRD_Listener_HTTP.arn
# 리디렉션 동작을 설정합니다.
action {
type = "redirect"
redirect {
protocol = "HTTPS"
port = "443"
status_code = "HTTP_301"
}
}
// 모든 요청을 리디렉션 대상으로 설정합니다.
condition {
path_pattern {
values = ["/"]
}
}
}
// cj.aws.devnote.dev 도메인의 ACM 인증서를 생성합니다.
resource "aws_acm_certificate" "cert" {
domain_name = "cj.aws.devnote.dev"
validation_method = "DNS"
}
// 인증서의 DNS 검증 레코드를 생성합니다.
resource "aws_route53_record" "cert_validation" {
zone_id = aws_route53_zone.aws_devnote_dev_zone.zone_id
name = tolist(aws_acm_certificate.cert.domain_validation_options)[0].resource_record_name
type = tolist(aws_acm_certificate.cert.domain_validation_options)[0].resource_record_type
records = [tolist(aws_acm_certificate.cert.domain_validation_options)[0].resource_record_value]
ttl = 60
}
// ACM 인증서의 검증을 수행합니다.
resource "aws_acm_certificate_validation" "cert" {
certificate_arn = aws_acm_certificate.cert.arn
validation_record_fqdns = [aws_route53_record.cert_validation.fqdn]
}
// 로드 밸런서의 HTTPS 리스너를 생성합니다. 포트 443에서 동작합니다.
resource "aws_lb_listener" "TFC_PRD_Listener_HTTPS" {
load_balancer_arn = aws_lb.TFC_PRD_ALB.arn
port = 443
protocol = "HTTPS"
ssl_policy = "ELBSecurityPolicy-2016-08"
certificate_arn = aws_acm_certificate_validation.cert.certificate_arn
// 대상 그룹을 기본 동작으로 설정합니다.
default_action {
type = "forward"
target_group_arn = aws_lb_target_group.TFC_PRD_TG.arn
}
}
// cj.aws.devnote.dev 도메인의 A 레코드를 생성하고 로드 밸런서의 앨리어스를 설정합니다.
resource "aws_route53_record" "load_balancer_alias_record" {
zone_id = aws_route53_zone.aws_devnote_dev_zone.zone_id
name = "cj.aws.devnote.dev"
type = "A"
alias {
name = aws_lb.TFC_PRD_ALB.dns_name
zone_id = aws_lb.TFC_PRD_ALB.zone_id
evaluate_target_health = false
}
}