🎉

AWSでプライベートサブネットからインターネットへ:NAT Gateway構築入門(Terraform付き)

2025/03/21に公開

はじめに

AWSでセキュアにシステムを構築する際、プライベートサブネット内のEC2インスタンスからインターネットに出る必要があるケースがあります。
そのとき活躍するのが NAT GatewayNATインスタンス と呼ばれる構成です。

この記事では、以下を解説します:

  • NAT Gatewayの基本
  • NAT Gatewayが必要なユースケース
  • NATインスタンスとの違いと使い分け
  • Terraformでの構築方法
  • ルートテーブルとセキュリティグループの役割分担

NAT Gatewayとは?

NAT Gateway は、プライベートサブネット内のリソースがインターネットにアクセスできるようにするAWSマネージドサービスです。
ただし、外部から直接アクセスされることはありません。


NAT Gatewayが必要なユースケース

例えば、以下のようなケースではNAT GatewayまたはNATインスタンスが必要になります:

  • Dockerコンテナのビルド時に外部リポジトリにアクセスする
  • OSアップデートで外部へアクセスしたい
  • 外部APIとの連携を行うが、外部からの通信は遮断したい

NAT Gateway vs NATインスタンス

NATインスタンスとは?

NAT Gatewayと同様の役割を果たすものとして、NATインスタンス という方法もあります。
これは、NAT機能を持つEC2インスタンスを自分で構築して使う手法で、NAT Gateway登場前に主流だった方式です。

項目 NAT Gateway NATインスタンス
提供形式 フルマネージド 自前のEC2
スケーラビリティ 自動 手動
可用性 冗長化必要
カスタマイズ性 なし 高い(ログ、監視等)
コスト 高め 安め(t3.micro等)
運用負荷 高(アップデート等)
使用例 本番環境におすすめ 開発・検証・カスタマイズ用途に有効

NATインスタンスは、専用のAmazon Linuxを使い、IP転送やiptablesの設定を行うことで自前構築します。


TerraformによるNAT Gateway構築

以下は、VPC・サブネット・NAT Gateway・ルートテーブルの構築例です。

主要構成

resource "aws_vpc" "main" {
  cidr_block = "10.0.0.0/16"
}

resource "aws_subnet" "public" {
  vpc_id = aws_vpc.main.id
  cidr_block = "10.0.1.0/24"
  map_public_ip_on_launch = true
  availability_zone = "ap-northeast-1a"
}

resource "aws_subnet" "private" {
  vpc_id = aws_vpc.main.id
  cidr_block = "10.0.2.0/24"
  availability_zone = "ap-northeast-1a"
}

resource "aws_internet_gateway" "igw" {
  vpc_id = aws_vpc.main.id
}

resource "aws_eip" "nat_eip" {
  vpc = true
}

resource "aws_nat_gateway" "nat" {
  allocation_id = aws_eip.nat_eip.id
  subnet_id = aws_subnet.public.id
  depends_on = [aws_internet_gateway.igw]
}

resource "aws_route_table" "private_rt" {
  vpc_id = aws_vpc.main.id
  route {
    cidr_block = "0.0.0.0/0"
    nat_gateway_id = aws_nat_gateway.nat.id
  }
}

resource "aws_route_table_association" "private_assoc" {
  subnet_id = aws_subnet.private.id
  route_table_id = aws_route_table.private_rt.id
}

Discussion