IaC/Terraform

[Mac OS] Terraform 을 이용한 어플리케이션 구성 - Step 3~4

chanstory 2023. 2. 12. 22:39
반응형

** 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

 

Terraform Registry

 

registry.terraform.io

 

 

 

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
}

 

 

 

 

 

 

 

 

 

반응형