이번 글에서는 직접 간단한 인프라 아키텍쳐를 구성하고 코드를 작성해 Apply까지 진행해본다.
인스턴스 2개를 생성해 하나의 ALB로 묶은 아키텍쳐를 생성하보고자 한다.
ALB 1개와 2쌍의 서브넷, 2개의 인스턴스로 구성된 아주 전형적인 ALB 아키텍쳐이다.
시작하기에 앞서, Terraform 실행을 위한 Credential을 생성해야한다.
Terraform을 통해 다양한 리소스들을 관리하므로 AdministratorAccess 권한을 가진 사용자를 생성한다.
사용자 생성 후 액세스 키도 생성한다.
이렇게 생성한 Credential은 terraform 코드 내에 직접 넣을 수 있고, CLI config/credential 파일에 넣고 불러올 수도 있으며, 시스템 환경변수 식으로 설정해 불러올 수 있기도 하다.
Credential을 불러오는 우선순위와 설정방법은 아래 공식 Docs를 참조한다.
이제 본격적으로 코드를 작성한다.
이번 아키텍쳐를 통해 생성할 리소스 목록은 아래와 같다.
- 컴퓨팅 관련
- ec2 2개 (2개의 가용영역)
- 보안그룹 2개 (ec2용, alb용)
- ALB 1개
- 대상 그룹
- 리스너
- 네트워킹 관련
- VPC 1개
- subnet
- private 2개
- public 2개
- 라우팅 테이블 : public, private 1개씩
- 인터넷 게이트 웨이
- subnet
- VPC 1개
우선 네트워크 관련 리소스부터 생성한다.
Terraform을 통해 생성되는 모든 리소스는 resource 문으로 선언한다.
# VPC
resource "aws_vpc" "tf_study_vpc" {
cidr_block = "192.168.0.0/16"
tags = {
"Name" = "tf_study_vpc"
}
}
# Subnet
resource "aws_subnet" "tf_study_subnet-public1" {
vpc_id = aws_vpc.tf_study_vpc.id
cidr_block = "192.168.1.0/24"
availability_zone = "ap-northeast-2a"
tags = {
"Name" = "tf_study_subnet-public1"
}
}
...
# route table associate
resource "aws_route_table_association" "public1_rt_asso" {
subnet_id = aws_subnet.tf_study_subnet-public1.id
route_table_id = aws_route_table.public_rt.id
}
라우팅 테이블과 서브넷을 연결해주는 부분도 따로 리소스로 지정해주어야 한다. (aws_route_table_association)
다음으로 인스턴스와 ALB를 생성한다.
# ALB
resource "aws_alb" "tf_study_alb" {
name = "tf-study-alb"
internal = false
load_balancer_type = "application"
security_groups = [ aws_security_group.tf_study-alb-sg.id ]
subnets = [ aws_subnet.tf_study_subnet-public1.id, aws_subnet.tf_study_subnet-public2.id ]
}
# Target group
resource "aws_alb_target_group" "tf_study-target-group" {
name = "tf-study-target-group"
vpc_id = aws_vpc.tf_study_vpc.id
port = 80
protocol = "HTTP"
}
# Target group associate
resource "aws_alb_target_group_attachment" "private1_ec2_attach" {
target_group_arn = aws_alb_target_group.tf_study-target-group.id
target_id = aws_instance.tf_study_instance1.id
port = 80
}
resource "aws_alb_target_group_attachment" "private2_ec2_attach" {
target_group_arn = aws_alb_target_group.tf_study-target-group.id
target_id = aws_instance.tf_study_instance2.id
port = 80
}
# ALB Listener
resource "aws_alb_listener" "name" {
load_balancer_arn = aws_alb.tf_study_alb.arn
port = 80
protocol = "HTTP"
default_action {
type = "forward"
target_group_arn = aws_alb_target_group.tf_study-target-group.arn
}
}
단순하게 구성하기 위해 HTTP 80포트만 포워딩하도록 했으나 인증서를 연결해 HTTPS 구성도 할 수 있고, 리스너 구성을 심화시켜 로드밸런싱을 구성할 수도 있다.
생성해야할 리소스는 타깃그룹과 리스너, 그리고 ALB와 타깃 그룹을 연결하는 부분도 있다. (aws_alb_target_group_attachment)
이렇게 간단한 ALB 아키텍쳐를 Terraform 코드로 구성하고 Apply 시켜 실제 인프라에 적용까지 해보았다.
실제 사용된 코드는 Github에 남아있다.