반응형
** Terraform 실행 시 현 디렉토리 내 모든 tf 파일 참조됨
=> 리소스 별 분리 관리 시 편함
*** Terraform 디렉토리 구성 ***
최종 목표 아키텍처
STEP 3: DB 인스턴스 생성
- 자습서 사양대로 RDS 인스턴스를 생성
https://docs.aws.amazon.com/ko_kr/AmazonRDS/latest/UserGuide/CHAP_Tutorials.WebServerDB.CreateDBInstance.html
** RDS 인스턴스 사양
- EC2 인스턴스 리전과 동일한 리전에서 생성 (ap-northeast-2 = 서울)
- 데이터 베이스 생성 -> 표준 생성 -> MySQL
- 프리티어 선택
- 가용성 및 내구성 기본값 설정
- 암호 자동생성 OFF
- 인스턴스 구성 - 버스트 가능 클래스 (t 클래스 포함) // db.t3.micro
- 스토리지 섹션 기본값 설정
- 연결 섹션 선택 - 컴퓨팅 리소스에서 EC2 컴퓨팅 리소스에 연결
1. RDS Instance 생성 (RDS.tf)
resource "aws_db_instance" "terraform_testDB" {
allocated_storage = 20 # (상황별 필수)스토리지 (기가바이트)
max_allocated_storage = 50 # RDS가 DB 인스턴스의 스토리지를 자동으로 확장할 수 있는 상한값
availability_zone = "ap-northeast-2a" # RDS 인스턴스의 가용영역
deletion_protection = true # RDS 삭제방지 - deploy 시 무시 - 시간절약 가능
skip_final_snapshot = true # DB 인스턴스 삭제 전 최종 DB 스냅샷 생성 여부 - true = 생성X
engine = "mysql" # (상황별 필수) 사용할 데이터베이스 엔진
engine_version = "8.0.28" # 사용할 엔진 버전
instance_class = "db.t3.micro" # 필수 - instance 유형
username = "chan"
password = "qwer1234" # 상황별 필수
vpc_security_group_ids = [aws_security_group.prvSg.id] # 연결할 VPC 보안 그룹 목록
db_subnet_group_name = aws_db_subnet_group.DB-prvSg.name # DB 서브넷 그룹 이름
port = 3306 # DB가 연결을 수락하는 포트
tags = {
"name" = "terraform_testDB"
}
}
https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/db_instance
STEP 4: 어플리케이션 로드 밸런서 및 Auto Scaling Group 적용
- Auto Scaling Group 최소 2개, 최대 10개로 설정
1. Auto Scaling 생성 (AutoScaling.tf)
resource "aws_launch_configuration" "launch" {
name_prefix = "launch-" # 지정된 접두사로 시작된 고유 이름 생성 - name 과 충돌 가능
image_id = "ami-0cb1d752d27600adb" # ami 값
instance_type = "t2.micro" # 인스턴스 타입
#associate_public_ip_address = true # 퍼블릭 IP 주소를 VPC의 인스턴스와 연결
security_groups = [aws_security_group.pubSg.id] # 보안 그룹 연결
user_data = <<-EOF
#!/bin/bash
echo "Hello, World" > index.html
nohup busybox httpd -f -p 8080 & # 연결 포트 8080 설정
EOF
lifecycle { # create, update, destroy 에 관한 동작 수행
create_before_destroy = true
}
}
2. Auto Scaling Group 생성 (AutoScaling.tf)
resource "aws_autoscaling_group" "asg" {
name = "Terraform-asg" # Auto Scaling 그룹 이름ㄹ
min_size = 2 # 최소 크기
max_size = 10 # 최대 크기
health_check_type = "ELB" # EC2, ELB 상태 확인이 수행되는 방식 제어
launch_configuration = aws_launch_configuration.launch.name
# Auto Scaling Group의 실행 구성
vpc_zone_identifier = [aws_subnet.pub_subnet1.id, aws_subnet.pub_subnet2.id]
# VPC 영역 식별자
force_delete = true # 모든 인스턴스가 종료될 때까지 기다리지 않고
# Auto Scaling 그룹을 삭제할 수 있음
# 리소스 조정 중이더라도 강제 삭제할 수 있음
# Terraform 은 그룹 삭제 전 모든 인스턴스를 비움
tag {
key = "Name" # (필수) 키
value = "Terraform-asg" # (필수) 값
propagate_at_launch = true # (필수) ASG을 통해 시작된
# Amazon EC2 인스턴스 태그 전파 활성화
}
}
3. Application Load Balancer 생성 (ALB.tf)
#Application Load Balancer 생성
resource "aws_lb" "alb"{
name = "Terraform-alb-test" # ALB이름, AWS 계정 내에서 고유해야함 (자동생성 가능)
internal = false # True 일 경우 LB는 내부용
load_balancer_type = "application" # 생성할 로드밸런서 유형
security_groups = [aws_security_group.pubSg.id] # LB 할당할 보안 그룹 ID목록
subnets = [aws_subnet.pub_subnet1.id, aws_subnet.pub_subnet2.id]
# ALB 서브넷 연결 목록
enable_deletion_protection = true # true 인 경우 AWS API를 통해 로드밸런서 삭제 비활성화
# false
}
4. Application Load Balancer Target Group 생성 (ALB.tf)
resource "aws_lb_target_group" "Terraform_alb_tg"{
name = "tf-example-lb-tg" # 대상그룹 이름
port = 8080 # 트래픽 수신 포트
protocol = "HTTP" # 트래픽을 대상으로 라우팅에 사용할 프로토콜
vpc_id = aws_vpc.vpc.id # 대상 그룹을 생성할 VPC 의 식별자
health_check{
interval = 30 # 개별 대상의 사아태 확인 시 대략적 시간 (default : 30 초)
healthy_threshold = 3 # 대상이 정상이라고 판단되기 전에 필요한 연속 상태 확인 성공 회수
# 기본값 : 3 (범위 2~10)
path = "/" # 상태 확인 요청 대상
unhealthy_threshold = 3 # 대상이 unhealthy 로 판단 되기 까지의 연속 상태 확인 실패 회수
# 기본값 : 3 (범위 2~10)
}
}
5. 로드밸런스 -> 인스턴스 연결 (ALB.tf)
resource "aws_lb_target_group_attachment" "alb_inst"{
target_group_arn = aws_lb_target_group.alb_tg.arn # 대상 그룹의 ARN
target_id = aws_instance.app_server.id # 대상 ID (인스턴스 ID or ECS 컨테이너 ID)
port = 8080 # 트래픽 수신 포트
}
6. 리스너 생성 (ALB.tf)
resource "aws_lb_listener" "Terraform_alb_listener" {
load_balancer_arn = aws_lb.alb.arn # 로드밸런서 ARN
port = 80 # 로드밸런서 수신 포트
protocol = "HTTP" # 클라이언트에서 로드밸러서로의 연결을 위한 프로토콜
default_action {
type = "forward" # 라우팅 작업 유형
target_group_arn = aws_lb_target_group.alb_tg.arn
}
}
7. Internet Gateway 생성 (RouteTable.tf)
resource "aws_internet_gateway" "igw"{
vpc_id = aws_vpc.vpc.id # vpc id
tags = {
Name = "Terraform-igw"
}
}
8. Route Table 생성 및 연결 (RouteTable.tf)
#route table 생성 pub
resource "aws_route_table" "route-table"{
vpc_id = aws_vpc.vpc.id
route {
cidr_block = "0.0.0.0/0"
gateway_id = aws_internet_gateway.igw.id # internet gateway id
}
tags = {
Name = "route-table"
}
}
#route table 연결 pub - subnet 연결
resource "aws_route_table_association" "Terraform-table-association-1" {
subnet_id = aws_subnet.pub_subnet1.id
route_table_id = aws_route_table.route-table.id
}
resource "aws_route_table_association" "Terraform-table-association-2" {
subnet_id = aws_subnet.pub_subnet2.id
route_table_id = aws_route_table.route-table.id
}
#route table 생성 prv
resource "aws_route_table" "route-table-prv"{
vpc_id = aws_vpc.terraform_vpc.id
tags = {
Name = "route-table"
}
}
#route table 연결 prv
resource "aws_route_table_association" "Terraform-table-association-3" {
subnet_id = aws_subnet.prv_subnet1.id
route_table_id = aws_route_table.route-table-prv.id
}
resource "aws_route_table_association" "Terraform-table-association-4" {
subnet_id = aws_subnet.prv_subnet2.id
route_table_id = aws_route_table.route-table-prv.id
}
9. Elastic IP (RouteTable.tf)
resource "aws_eip" "eip" {
vpc = true
lifecycle {
create_before_destroy = true
}
}
10. Nat Gateway 생성 및 연결(RouteTable.tf)
resource "aws_nat_gateway" "ngw" {
allocation_id = aws_eip.eip.id # 탄력적 IP 주소 할당
subnet_id = aws_subnet.public_subnet1.id # 게이트웨이 배치할 서브넷 ID
tags = {
Name = "Terraform-ngw"
}
}
resource "aws_route" "prvroute" {
route_table_id = aws_route_table.route-table-prv.id
destination_cidr_block = "0.0.0.0/0"
nat_gateway_id = aws_nat_gateway.ngw.id
}
반응형
'IaC > Terraform' 카테고리의 다른 글
[Mac OS] Terraform 을 이용한 어플리케이션 구성 - Step 2 (0) | 2023.02.11 |
---|---|
[Mac OS] Terraform 을 이용한 어플리케이션 구성 - Step 1 (0) | 2023.02.11 |
IaC, Terraform 기초 (Infrastructure as Code, 코드형 인프라, Terraform) (0) | 2023.02.07 |
YAML 이란 (0) | 2023.01.04 |