lhywk 님의 블로그

AWS 3-Tier 및 Data Pipeline 구축 With Terraform (4) 본문

AWS

AWS 3-Tier 및 Data Pipeline 구축 With Terraform (4)

lhywk 2026. 3. 14. 00:52

참고 자료: https://kujung.tistory.com/entry/AWS-3-Tier-Architecture-%EA%B5%AC%EC%B6%95%ED%95%B4%EB%B3%B4%EA%B8%B0-2-3

 

AWS 3 Tier Architecture 구축해보기 2-3

https://github.com/estrellaSia/AWS_3Tier_Infra_Data_Pipeline/tree/main참고 깃허브 Main.tf 작성하기(3) 1. Target Group# TG-Webresource "aws_lb_target_group" "tg-web" {name = "ddong-tg-web"port = 80protocol = "HTTP"vpc_id = aws_vpc.vpc.idhealth_chec

kujung.tistory.com

 

 

1. DB SG, DB Subnet Group

# DB-SG
resource "aws_security_group" "db-sg" {
    name = "ho-db-sg"
    description = "DB Security Group"
    vpc_id = aws_vpc.vpc.id
    ingress {
        from_port = 3306
        to_port = 3306
        protocol = "tcp"
        security_groups = [aws_security_group.asg-sg-was.id]
    }
    egress { 
        from_port = 0
        to_port = 0
        protocol = "-1"
        cidr_blocks = ["0.0.0.0/0"]
    }
    tags = {
        Name = "ho-db-sg"
    }
}

# DB-Subnet-Group
resource "aws_db_subnet_group" "db-sub-grp" {
    name = "ho-db-sub-grp"
    subnet_ids = [aws_subnet.db-sub1.id, aws_subnet.db-sub2.id]
    tags = {
        Name = "ho-db-sub-grp"
    }
}

 

resource "aws_security_group" "db-sg"

  • ingress (3306): security_groups = [aws_security_group.asg-sg-was.id] 설정을 통해 오직 WAS 서버들만 DB에 접근 가능하도록 제한
  • egress: 모든 포트에 대해 외부로 나가는 통신 허용

resource "aws_db_subnet_group" "db-sub-grp"

  • RDS 인스턴스가 생성될 보안그룹 정의
  • subnet_ids: DB 전용 프라이빗 서브넷 2개를 지정
# RDS 파라미터 그룹
resource "aws_db_parameter_group" "mk-par-grp" {
    name = "ho-par-grp"
    family = "mysql8.0"
    description = "Example parameter group for mysql8.0"
    parameter {
        name = "character_set_server"
        value = "utf8mb4"
    }
    # MySQL 서버의 기본 문자셋을 utf8mb4로 설정
    # (4바이트 UTF-8: 이모지 등도 저장 가능)
    parameter {
        name = "collation_server"
        value = "utf8mb4_unicode_ci"
        # 기본 collation (문자 정렬 방식)을 utf8mb4_unicode_ci로 설정
        # (문자 비교시 대소문자 구분 없이 유니코드 기준으로 정렬)
    }
}

# RDS
data "aws_db_instance" "my_rds" {
    db_instance_identifier = aws_db_instance.rds-db.identifier
}

resource "aws_db_instance" "rds-db" {
    allocated_storage = 20
    db_name = "hodb"
    engine = "mysql"
    engine_version = "8.0"
    storage_type = "gp3" // General Purpose SSD (gp3)
    instance_class = "db.t3.micro"
    username = "db 유저이름"
    password = "db 패스워드"
    parameter_group_name = aws_db_parameter_group.mk-par-grp.name
    multi_az = false
    db_subnet_group_name = aws_db_subnet_group.db-sub-grp.name
    vpc_security_group_ids = [aws_security_group.db-sg.id]
    skip_final_snapshot = true
    identifier = "ho-rds-instance" // RDS 인스턴스의 이름 지정
}

resource "aws_db_parameter_group" "mk-par-grp"

  • DB 엔진의 세부 설정을 정의하는 템플릿
  • character_set_server (utf8mb4): 한글은 물론 이모지까지 완벽하게 저장할 수 있도록 문자셋 확장
  • collation_server (utf8mb4_unicode_ci): 문자를 비교하거나 정렬할 때 유니코드 기준으로 대소문자 구분 없이 처리하도록 설정

resource "aws_db_instance" "rds-db"

  • 실제로 데이터가 저장되고 쿼리가 수행되는 핵심 서버 인스턴스
  • allocated_storage = 20: 프리티어 최대치인 20GB 할당
  • storage_type = "gp3": 최신 범용 SSD 타입. gp2보다 비용 대비 성능(IOPS)이 좋아 요즘 추세에 맞는 선택
  • instance_class = "db.t3.micro": 프리티어에서 사용 가능한 가장 가성비 좋은 인스턴스 타입
  • multi_az = false: 프리티어라 false로 설정
  • vpc_security_group_ids: 앞서 만든 db-sg를 연결해 오직 WAS 서버만 접근 가능하도록 함
  • skip_final_snapshot = true: DB 삭제 시 최종 백업본을 만들지 않음