🎉
AWSでプライベートサブネットからインターネットへ:NAT Gateway構築入門(Terraform付き)
はじめに
AWSでセキュアにシステムを構築する際、プライベートサブネット内のEC2インスタンスからインターネットに出る必要があるケースがあります。
そのとき活躍するのが NAT Gateway や NATインスタンス と呼ばれる構成です。
この記事では、以下を解説します:
- 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