Cloud NAT is 何
Cloud NATはGCPのサービスのひとつであるクラウドNAT(Network Address Translation)である。
プライベートなネットワークを作成した時に、ネットワーク内からインターネットに接続するために作成する。
これによって外部IPを持たないGCEインスタンスやGKEクラスタがインターネットと安全に接続し、パケットを損失せずに受け取ることが出来る。
他社の類似サービスとしてAWS NAT ゲートウェイが挙げられるが、ちょっと概念と使い方が異なるので注意。
いざ、Terraform化
Terraformで記述する場合、3つのリソースを組み合わせてCloud NATを作成する。
- NATルーター(google_compute_router)
- NATアドレス(google_compute_address)
- NAT(google_compute_router_nat)
またそもそもCloud NATを設置する前に、Cloud NATを設置するネットワークも必要。
それぞれTerraformで作成する。
まずはネットワークから。
resource "google_compute_network" "test_network" {
name = test-network
project = var.project_id
auto_create_subnetworks = false
delete_default_routes_on_create = false
}
auto_create_subnetworks=true にすると各リージョンに 10.128.0.0/9
の範囲から自動的にサブネットワークが生成される。
またdelete_default_routes_on_create=trueにすると、ネットワーク生成後にデフォルトのルート(0.0.0.0/0)が削除される。
ここで注意点があるが、ネットワーク周りの命名(上記でいうとtest-network)はRFCに則る必要があるのでリソース名にアンスコ( _ )を入れることが出来ない。ここぞというばかりにエラーで怒られる。Terraform上のリソース名(上記でいうと test_network )はアンスコが入っていても問題ない。
次にNATルーターを作成する。
resource "google_compute_router" "nat_router" {
name = "nat-router"
project = var.project_id
region = var.region
network = google_compute_network.network.self_link
}
networkに先程作ったネットワークのself_linkを貼る。
次にNATアドレス。
resource "google_compute_address" "nat_address" {
name = "nat-address"
project = var.project_id
region = var.region
}
最後にNATを作成する。
resource "google_compute_router_nat" "nat" {
name = "nat"
project = var.project_id
region = var.region
router = google_compute_router.nat_router.name
nat_ip_allocate_option = "AUTO_ONLY"
source_subnetwork_ip_ranges_to_nat = "ALL_SUBNETWORKS_ALL_IP_RANGES"
}
nat_ip_allocate_optionは AUTO_ONLY
か MANUAL_ONLY
を渡す。
AUTO_ONLYの場合、NATに割り振る外部IPアドレスをGCPが自動で調整してくれる。MANUAL_ONLYの場合はそれをユーザがやることになる。
source_subnetwork_ip_ranges_to_natはサブネットワークごとにNATをどのような設定にする。
ALL_SUBNETWORKS_ALL_IP_RANGES
は各サブネットワーク内の全てのIP範囲をNATに許可する。
ALL_SUBNETWORKS_ALL_PRIMARY_IP_RANGES
は各サブネットワークの全てのプライマリIP範囲をNATに許可する。
nat_ip_allocate_option=MANUAL_ONLYにするともう少し設定を書く必要があるが、詳しくはこちら。