Terraform으로 NAT Gateway 구성하고 Private Subnet에서 인터넷 연결하기

y001·2025년 3월 30일
0
post-thumbnail

1. 시작하며

현대 클라우드 인프라에서는 퍼블릭 서브넷과 프라이빗 서브넷을 함께 구성하는 것이 일반적이다. 예를 들어 웹 서버는 퍼블릭 서브넷에 두고, 데이터베이스나 백엔드 서비스는 프라이빗 서브넷에 배치하는 식이다. 이런 구조는 외부 노출을 줄여 보안을 높이고, 계층적인 시스템 아키텍처를 설계하는 데 도움을 준다.

하지만 프라이빗 서브넷의 EC2 인스턴스도 외부 인터넷에 접근해야 하는 경우가 많다. 대표적으로 패키지 설치, OS 업데이트, 외부 API 호출, S3에서 파일 다운로드 등이 있다. 이럴 때 사용하는 것이 NAT Gateway이다. NAT Gateway는 퍼블릭 서브넷에 위치하면서, 프라이빗 서브넷의 리소스가 인터넷으로 나가는 트래픽만 허용하도록 중계해주는 역할을 한다.

이번 글에서는 Terraform으로 다음 구성을 실습한다:


2. 목표 아키텍처

  • 기존 VPC 및 Public Subnet 활용
  • Private Subnet 생성 (CIDR: 10.0.100.0/24)
  • NAT Gateway 생성 (EIP 할당)
  • Private Route Table 구성 및 Subnet 연결
  • Private Subnet에 EC2 인스턴스 배포

구조적으로는 다음과 같다:

[Internet] ↔ [IGW] ↔ [Public Subnet] ↔ [NAT Gateway] ↔ [Private Subnet] ↔ [EC2]

architecture


3. Terraform 코드 구성

1) NAT용 EIP 생성

resource "aws_eip" "MyNatEIP" {
  domain = "vpc"

  tags = {
    Name = "MyNatEIP"
  }
}

2) NAT Gateway 생성

resource "aws_nat_gateway" "MyNatGW" {
  allocation_id = aws_eip.MyNatEIP.id
  subnet_id     = aws_subnet.MyPublicSubnet.id

  depends_on = [aws_internet_gateway.MyIGW]

  tags = {
    Name = "MyNatGW"
  }
}

3) Private Subnet 생성

resource "aws_subnet" "MyPrivateSubnet" {
  vpc_id                  = aws_vpc.MyVPC06.id
  cidr_block              = "10.0.100.0/24"
  availability_zone       = "ap-northeast-2a"
  map_public_ip_on_launch = false

  tags = {
    Name = "MyPrivateSubnet"
  }
}

4) Private Route Table 설정 및 Subnet 연결

resource "aws_route_table" "MyPrivateRouting" {
  vpc_id = aws_vpc.MyVPC06.id

  route {
    cidr_block     = "0.0.0.0/0"
    nat_gateway_id = aws_nat_gateway.MyNatGW.id
  }

  tags = {
    Name = "MyPrivateRouting"
  }
}

resource "aws_route_table_association" "MyPrivateRouteTableAssociation" {
  subnet_id      = aws_subnet.MyPrivateSubnet.id
  route_table_id = aws_route_table.MyPrivateRouting.id
}

5) 보안 그룹 및 EC2 배포

보안 그룹은 SSH, HTTP/HTTPS 등을 허용하도록 구성한다. 그리고 앞서 만든 프라이빗 서브넷과 연결된 네트워크 인터페이스를 EC2에 붙이면 된다.

프라이빗 서브넷 EC2에는 퍼블릭 IP가 없기 때문에, Bastion Host(퍼블릭 서브넷에 위치한 EC2)를 경유해서 접속하거나 SSM을 사용하는 방식으로 접근해야 한다.


4. 주의할 점

  • NAT Gateway는 반드시 Public Subnet에 위치해야 한다.
    NAT Gateway는 IGW를 통해 인터넷에 나가기 때문에 퍼블릭 서브넷에 있어야 동작한다.

  • Private Subnet에는 map_public_ip_on_launch = false가 필수다.
    퍼블릭 IP가 붙으면 프라이빗 서브넷의 의미가 없어진다.

  • NAT Gateway는 유료 서비스이다.
    EIP 사용료와 트래픽 전송량에 따른 비용이 발생한다. 실습 후에는 반드시 삭제하자.

  • EC2 접근은 직접 안된다.
    프라이빗 서브넷이라 퍼블릭 IP가 없기 때문에, 퍼블릭 EC2에서 프라이빗 EC2로 SSH 접속하는 구조를 미리 고려해야 한다.

  • 라우팅 테이블 설정 확인 필수.
    프라이빗 서브넷에서 NAT Gateway를 경유하는 0.0.0.0/0 라우팅이 누락되면 인터넷 연결이 안 된다.

  • 보안 그룹은 최소 권한 원칙을 따르자.
    실습이 아니라면, 0.0.0.0/0으로 모두 허용하는 것은 피하는 것이 좋다.

0개의 댓글