반응형
network 모듈 기능
aws 에 로드밸런서를 구현하고 호스트에 라우팅 하기 위한 기능입니다
nlb alb 를 사용하기 위해 구성 하였습니다
각각의 기능을 분리 한 이유는 gitlab 인스턴스의 네트워크 구조 때문입니다
ssh clone 기능을 사용 하기 위해 새로운 ssh용 호스트를 구성하는 대신
하나의 호스트로 로드 밸런서를 통해 ssh 와 alb 를 나눠 사용 하기 위함 입니다
alb의 단일 구성이나 각각의 기능을 구성하고 연결 할 수 있도록 만들었습니다
network 모듈 alb
- 이 모듈은 간편하게 alb를 구성하기 위한 모듈 입니다
- alb 모듈 안에서 로드밸런서 타겟그룹 리스너 를 전부 생성하여 간편하게 사용 가능합니다
alb 모듈
resource "aws_alb" "alb" {
name = "${var.default_name.owner}-${var.default_name.type}-${terraform.workspace}-${var.name}"
internal = false
load_balancer_type = "application"
security_groups = ["${var.security_group_id}"]
subnets = var.public_subnets[*].id
tags = merge(var.default_tags,{
Name = "${var.default_name.owner}-${var.default_name.type}-${terraform.workspace}-${var.name}"
})
enable_cross_zone_load_balancing = true
lifecycle {
create_before_destroy = true
}
}
resource "aws_alb_target_group" "alb_group" {
name = "${var.default_name.owner}-${var.default_name.type}-${terraform.workspace}-${var.name}"
port = 80
protocol = "HTTP"
vpc_id = var.vpc_id
health_check {
//enabled = true
healthy_threshold = 3
interval = 30
unhealthy_threshold = 3
//matcher = "200"
path = "/"
//port = "traffic-port"
//protocol = "HTTP"
}
tags = merge(var.default_tags,{
Name = "${var.default_name.owner}-${var.default_name.type}-${terraform.workspace}-${var.name}"
})
}
data "aws_acm_certificate" "tebedev_com" {
domain = var.certificate_domain
statuses = ["ISSUED"]
}
resource "aws_alb_listener" "HTTPS" {
load_balancer_arn = "${aws_alb.alb.arn}"
port = "443"
protocol = "HTTPS"
ssl_policy = "ELBSecurityPolicy-TLS13-1-2-2021-06"
certificate_arn = "${data.aws_acm_certificate.tebedev_com.arn}"
default_action {
target_group_arn = "${aws_alb_target_group.alb_group.arn}"
type = "forward"
}
}
resource "aws_alb_listener" "http" {
load_balancer_arn = "${aws_alb.alb.arn}"
port = "80"
protocol = "HTTP"
default_action {
target_group_arn = "${aws_alb_target_group.alb_group.arn}"
type = "forward"
}
}
resource "aws_alb_target_group_attachment" "alb_attach" {
target_group_arn = aws_alb_target_group.alb_group.arn
target_id = "${var.instance_id}"
port = 80
}
- 이 모듈은 alb 기본 생성시 80번 포트와 443 포트의 리스너가 기본 생성 됩니다
- 일반적인 alb 구성으로 사용 가능 합니다
- 생성 예 >
-
module "nexus_alb" { source = "../../../../modules/network/alb" name = "nexus_alb" vpc_id = data.terraform_remote_state.resources.outputs.vpc_id public_subnets = data.terraform_remote_state.resources.outputs.pub_subnets security_group_id = data.terraform_remote_state.resources.outputs.security_group1_all_id instance_id = module.ec2-nexus.instance_id instance_name = local.instance_name }
-
network 모듈 loadbalancer
- 로드밸런서, 타겟그룹, 리스너, 리스너룰 등 각각의 기능을 분할 하여 좀더 유연한 네트워크 구조를 설계 가능 하도록 하였습니다
lb 모듈
resource "aws_lb" "lb" {
name = "${var.default_name.owner}-${var.default_name.type}-${terraform.workspace}-${var.name}"
internal = false
load_balancer_type = var.load_balancer_type
security_groups = ["${var.security_group_id}"]
subnets = var.public_subnets[*].id
tags = merge(var.default_tags,{
Name = "${var.default_name.owner}-${var.default_name.type}-${terraform.workspace}-${var.name}"
})
enable_cross_zone_load_balancing = true
lifecycle {
create_before_destroy = true
}
}
- 이 모듈은 로드밸런서 생성 모듈로 로드밸런서 타입을 지정 할 수 있습니다
- application
- network
- 생성 예 >
-
locals { ssh_port = 22 HTTP_port = 80 HTTPS_port = 443 target_type_inst = "instance" target_type_alb = "alb" load_balancer_type_net = "network" load_balancer_type_app = "application" protocol_tcp = "TCP" protocol_http = "HTTP" protocol_https = "HTTPS" } module "alb-gitlab" { source = "../../../../modules/network/loadbalancer/elb" name = "alb-gitlab" load_balancer_type = local.load_balancer_type_app security_group_id = data.terraform_remote_state.resources.outputs.security_group_id_all public_subnets = data.terraform_remote_state.resources.outputs.pub_subnets }
-
listener 모듈 (443port)
- 리스너는 로드 밸런서에 대한 클라이언트 연결 요청을 청취하고, 정의된 라우팅 규칙에 따라 해당 요청을 특정 타깃으로 전달하는 역할을 합니다
resource "aws_alb_listener" "ssl_listener" {
count = var.ssl_attach ? 1 : 0
load_balancer_arn = var.load_balancer_arn
port = var.port
protocol = var.protocol
ssl_policy = var.ssl_policy
certificate_arn = data.aws_acm_certificate.tebedev_com.arn
default_action {
target_group_arn = var.target_group_arn
type = var.target_type
}
}
- 이 모듈은 리스너를 생성 하는 모듈 입니다
- count = var.ssl_attach ? 1 : 0 ssl_attach 가 true 면 동작 합니다 (443 포트)
- 예 >
-
module "listener-alb-https"{ source = "../../../../modules/network/loadbalancer/listener" port = local.HTTPS_port protocol = local.protocol_https ssl_attach = true target_group_arn = module.tg-gitlab.arn load_balancer_arn = module.alb-gitlab.arn certificate_domain = var.certificate_domain }
-
listener 모듈 (80 , 22, 8080 port )
resource "aws_alb_listener" "listener" {
count = var.ssl_attach ? 0 : 1
load_balancer_arn = var.load_balancer_arn
port = var.port
protocol = var.protocol
default_action {
target_group_arn = var.target_group_arn
type = var.target_type
}
}
- count = var.ssl_attach ? 1 : 0 ssl_attach 가 false 면 동작 합니다 (443 외 포트들)
- 예 >
-
module "listener-alb-http"{ source = "../../../../modules/network/loadbalancer/listener" port = local.HTTP_port protocol = local.protocol_http ssl_attach = false target_group_arn = module.tg-gitlab.arn load_balancer_arn = module.alb-gitlab.arn certificate_domain = var.certificate_domain }
-
listener rule 모듈
- 리스너 룰은 특정 패턴에 매치되는 들어오는 요청을 특정 타깃 그룹으로 라우팅하는 역할을 합니다
resource "aws_lb_listener_rule" "redirect_http_to_https" {
listener_arn = var.listener_arn
priority = var.priority
action {
type = var.rule_type
redirect {
port = var.redirect_port
protocol = var.redirect_protocol
status_code = var.redirect_state_code
}
}
condition {
path_pattern {
values = ["${var.redirect_pattern_path}"]
}
}
}
- 이 모듈은 특정 경로를 통해 들어오는 요청을 처리하기 위해 만들었습니다
- 80번 포트로 들어 오는 요청을 443 포트로 redirect 합니다
- 예 >
-
module "listener_rule" { source = "../../../../modules/network/loadbalancer/listener_rule" listener_arn = module.listener-alb-https.listener_arn redirect_port = local.HTTP_port redirect_pattern_path = var.certificate_domain priority = "1" }
-
target_group 모듈
- 타겟 그룹은 ALB 또는 NLB에 의해 라우팅되는 요청을 처리할 수 있는 리소스(일반적으로 EC2 인스턴스, IP 주소, AWS Lambda 함수 등)의 집합을 가리킵니다
resource "aws_lb_target_group" "lb_group" {
name = "${var.default_name.owner}-${var.default_name.type}-${terraform.workspace}-${var.name}"
target_type = var.target_type
port = var.port
protocol = var.protocol
vpc_id = var.vpc_id
health_check {
//enabled = true
healthy_threshold = 3
interval = 30
unhealthy_threshold = 3
//matcher = "200"
path = "/"
//port = "traffic-port"
//protocol = "HTTP"
}
tags = merge(var.default_tags,{
Name = "${var.default_name.owner}-${var.default_name.type}-${terraform.workspace}-${var.name}"
})
}
- 예 >
-
module "tg-gitlab" { source = "../../../../modules/network/loadbalancer/targetgroup" name = "tg-gitlab" target_type = local.target_type_inst port = local.HTTP_port vpc_id = data.terraform_remote_state.resources.outputs.vpc_id protocol = local.protocol_http }
-
attach 모듈
- 타겟그룹과 인스턴스를 연결하는 역할을 합니다
resource "aws_alb_target_group_attachment" "alb_attach" {
target_group_arn = var.target_group_arn
target_id = var.instance_id
port = var.port
}
- 예 >
-
module "gitlab-http-attach" { source = "../../../../modules/network/loadbalancer/attach" target_group_arn = module.tg-gitlab.arn instance_id = module.ec2-gitlab.instance_id port = local.HTTP_port }
-
반응형
'클라우드 > AWS-Terraform' 카테고리의 다른 글
ETC 모듈 구현 (0) | 2023.10.23 |
---|---|
iam 모듈 구현 (0) | 2023.10.23 |
compute 모듈 구현 (0) | 2023.10.23 |
terraform 설치 (0) | 2023.10.23 |
terraform 배포 전략 (0) | 2023.10.23 |