terraform

Terraform을 활용한 AWS VPC 환경 구축하기(초기설정, vpc생성, 인터넷 게이트웨이 생성, 서브넷 구성, 라우트 테이블 구성, NAT 게이트웨이)

kkuniyo 2025. 3. 13. 16:18
반응형

Terraform을 활용한 AWS 인프라 구축하기

Terraform은 IaC(Infrastructure as Code) 도구로, 인프라 관리를 코드로 자동화하여 효율적이고 일관된 리소스 관리를 가능하게 한다. 이번 글에서는 Terraform을 이용하여 AWS 환경에서 VPC, 서브넷, 인터넷 게이트웨이, NAT 게이트웨이 등을 구성하는 실습 예제를 살펴보자

1. Terraform 초기 설정

Terraform의 AWS 프로바이더를 설정하는 부분

terraform {
  required_providers {
    aws = {
      source  = "hashicorp/aws"
      version = "~> 5.0"
    }
  }
}

# AWS Provider 설정: AWS 리전을 비롯하여 액세스 키와 비밀 키를 변수로 받아 설정
provider "aws" {
  region     = var.region
  access_key = var.access_key
  secret_key = var.secret_key
}

2. VPC 생성

VPC는 AWS에서 가상 네트워크 환경을 제공

# VPC 생성: 지정된 CIDR 블록으로 VPC를 생성하며, DNS 호스트 이름 사용을 활성화
resource "aws_vpc" "main-vpc" {
  cidr_block           = var.cidr              # VPC에 할당할 IP 주소 범위
  instance_tenancy     = "default"             # 인스턴스 테넌시 설정 (기본)
  enable_dns_hostnames = true                  # VPC 내 인스턴스에 DNS 호스트 이름 할당 활성화

  tags = {
    Name = "main-vpc"                        # VPC에 적용할 태그 (이름)
  }
}

# VPC 출력: 생성된 VPC의 소유자 ID를 출력합니다.
output "vpc_id" {
  value = aws_vpc.main-vpc.owner_id         
}

3. 인터넷 게이트웨이 생성

VPC를 인터넷과 연결하기 위해 인터넷 게이트웨이를 설정

# 인터넷 게이트웨이 생성: VPC에 인터넷 접속을 제공하기 위해 IGW를 생성
resource "aws_internet_gateway" "main-igw" {
  vpc_id = aws_vpc.main-vpc.id               # IGW가 연결될 VPC의 ID

  tags = {
    Name = "main-igw"                        # 인터넷 게이트웨이에 적용할 태그 (이름)
  }
}

4. 서브넷 구성

퍼블릭, 프라이빗, DB용 서브넷을 각각 생성

# 퍼블릭 서브넷 생성: VPC 내에서 퍼블릭 리소스를 위한 서브넷을 생성
resource "aws_subnet" "main-puba" {
  vpc_id            = aws_vpc.main-vpc.id       # 이 서브넷이 속할 VPC의 ID
  cidr_block        = "10.0.0.0/24"             # 서브넷에 할당할 IP 주소 범위
  availability_zone = "${var.region}a"          # 지정된 리전의 'a' 가용 영역에 서브넷 생성

  tags = {
    Name = "main-puba"                       # 서브넷에 적용할 태그 (이름)
  }
}

# (나머지 서브넷들도 유사한 방식으로 구성할 수 있습니다.)

5. 라우트 테이블 구성

퍼블릭 및 NAT 게이트웨이용 라우팅 테이블을 생성

# 기본 라우트 테이블 생성: VPC 내 모든 트래픽(0.0.0.0/0)을 인터넷 게이트웨이를 통해 라우팅한다
resource "aws_route_table" "main-rt" {
  vpc_id = aws_vpc.main-vpc.id               # 이 라우트 테이블이 적용될 VPC의 ID

  route {
    cidr_block = "0.0.0.0/0"                 # 모든 IPv4 주소 대상으로
    gateway_id = aws_internet_gateway.main-igw.id  # 인터넷 게이트웨이를 통해 라우팅
  }

  tags = {
    Name = "main-rt"                         # 라우트 테이블에 적용할 태그 (이름)
  }
}

# NAT 게이트웨이 라우트 테이블 생성: 프라이빗 서브넷에서 인터넷 접근을 위해 NAT 게이트웨이를 사용
resource "aws_route_table" "main-natrt" {
  vpc_id = aws_vpc.main-vpc.id               # 이 라우트 테이블이 적용될 VPC의 ID

  route {
    cidr_block     = "0.0.0.0/0"             # 모든 IPv4 주소 대상으로
    nat_gateway_id = aws_nat_gateway.main-natgw.id  # NAT 게이트웨이를 통해 라우팅
  }

  tags = {
    Name = "main-natrt"                      # NAT 라우트 테이블에 적용할 태그 (이름)
  }
}

6. 라우트 테이블과 서브넷 연결

# 라우트 테이블 연결: 퍼블릭 서브넷(main-puba)을 기본 라우트 테이블(main-rt)에 연결
resource "aws_route_table_association" "main-rtasso" {
  subnet_id      = aws_subnet.main-puba.id     # 연결할 서브넷의 ID
  route_table_id = aws_route_table.main-rt.id    # 연결할 라우트 테이블의 ID
}
resource "aws_route_table_association" "main-rtasso1" {
  subnet_id      = aws_subnet.main-pubc.id
  route_table_id = aws_route_table.main-rt.id  
}

# NAT 게이트웨이 라우트 테이블과 연결도 동일 방식
resource "aws_route_table_association" "main-natrtasso" {
  subnet_id      = aws_subnet.main-pria.id
  route_table_id = aws_route_table.main-natrt.id
}
resource "aws_route_table_association" "main-natrtasso1" {
  subnet_id      = aws_subnet.main-pric.id
  route_table_id = aws_route_table.main-natrt.id
}

resource "aws_route_table_association" "ysjang-natrtasso2" {
  subnet_id      = aws_subnet.main-dba.id
  route_table_id = aws_route_table.main-natrt.id
}

resource "aws_route_table_association" "ysjang-natrtasso3" {
  subnet_id      = aws_subnet.main-dbc.id
  route_table_id = aws_route_table.main-natrt.id
}

7. NAT 게이트웨이 생성

프라이빗 서브넷이 인터넷과 통신할 수 있도록 NAT 게이트웨이를 생성

# AWS Elastic IP 생성: NAT 게이트웨이에 할당할 고정 퍼블릭 IP 주소를 생성
resource "aws_eip" "main-eip" {
  domain = "vpc"                           # VPC 내에서 사용될 Elastic IP
  tags   = {
    Name = "main-eip"                      # EIP에 적용할 태그 (이름)
  }
}

# NAT 게이트웨이 생성: 퍼블릭 서브넷에 NAT 게이트웨이를 생성하여 프라이빗 서브넷의 인터넷 접속을 지원
resource "aws_nat_gateway" "main-natgw" {
  allocation_id = aws_eip.main-eip.id        # 생성된 Elastic IP의 할당 ID
  subnet_id     = aws_subnet.main-puba.id      # NAT 게이트웨이가 위치할 퍼블릭 서브넷의 ID
  depends_on    = [aws_internet_gateway.main-igw]  # 인터넷 게이트웨이가 먼저 생성되어야 함

  tags = {
    Name = "main-natgw"                     # NAT 게이트웨이에 적용할 태그 (이름)
  }
}

# NAT 게이트웨이의 퍼블릭 IP 출력: 할당된 EIP의 퍼블릭 IP 주소를 출력
output "natgw_public_ip" {
  value = aws_eip.main-eip.public_ip
}

8. 변수 정의 (Variables)

필요한 변수들을 별도 파일로 관리하여 코드의 재사용성을 높인다

# 변수 정의: AWS 리전, VPC CIDR, 액세스 키 및 비밀 키 값을 기본값으로 설정
variable "region" {
  default = "ap-northeast-2"
}
variable "cidr" {
  default = "10.0.0.0/16"
}
variable "access_key" {
  default = "YOUR_ACCESS_KEY"
}
variable "secret_key" {
  default = "YOUR_SECRET_KEY"
}

Terraform을 통해 AWS 환경을 자동화하여 효율적으로 관리할 수 있다

반응형