TerraformでVPCのデフォルトルート削除のオプションを設定するときの注意点

記事タイトルとURLをコピーする

G-gen の藤岡です。Terraform で VPC を作成し、デフォルトルートを削除するオプションを有効にし再度実行した際、Terraform 上ではエラーとならないものの、実際のデフォルトルートのリソースは削除されませんでした。今回はその事象の原因と解決方法を紹介します。

前提知識

VPC のルートには以下の 4 種類があります。

  • システム生成ルート
  • カスタムルート
  • ピアリングルート
  • ポリシーベースのルート

このうち、システム生成ルートは VPC 作成時に自動で作成されるリソースです。この中には当記事で扱うシステム生成のデフォルトルートが含まれています。これは 0.0.0.0/0 へのパケットを VPC のデフォルトインターネットゲートウェイに向けるルートです。

0.0.0.0/0 へのルートがあることにより、セキュリティリスクやトラフィックの誤送信、ネットワーク効率の低下などの問題もあります。そのため、ユースケースによっては削除することが好ましい場合があります。

実施内容

やりたかったこと

Terraform で Virtual Private Cloud (以下 VPC) を作成した後に、Terraform の delete_default_routes_on_create オプションを true にすることで自動生成されるデフォルトルート (0.0.0.0) を削除しようとしました。

想定としては、true にすることで、既存のデフォルトルートが削除されると考えていました。

初回の VPC 作成

以下のコードを実行し、VPC とサブネットを作成しました。delete_default_routes_on_create = true をコメントアウトし、他のオプションは最小にしています。

provider "google" {
  project = "${PROJECT_ID}"  // プロジェクト ID
  region  = "asia-northeast1"
}
  
terraform {
  required_version = "~> 1.3"
  required_providers {
    google = ">= 4.63.1"
  }
}
  
# Create vpc
resource "google_compute_network" "vpc_network" {
  name                    = "vpc"
  auto_create_subnetworks = "false"
  #   delete_default_routes_on_create = true  // デフォルトルート作成オプション
}
  
# Create subnet
resource "google_compute_subnetwork" "subnet" {
  name          = "subnet"
  ip_cidr_range = "10.0.0.0/24"
  network       = google_compute_network.vpc_network.name
}

上記の Terraform を実行後、gcloud コマンドで VPC のルートを確認すると、サブネットルートとデフォルトルートが作られています。

fujioka@cloudshell:~ (xxx)$ gcloud compute routes list --project=${PROJECT_ID} --filter="network=vpc"
NAME: default-route-71e4a7af65c1a91b
NETWORK: vpc
DEST_RANGE: 10.0.0.0/24
NEXT_HOP: vpc
PRIORITY: 0
  
NAME: default-route-8f27e96e5eb606ae
NETWORK: vpc
DEST_RANGE: 0.0.0.0/0
NEXT_HOP: default-internet-gateway
PRIORITY: 1000
fujioka@cloudshell:~ (xxx)$ 

tfstate ファイルは "delete_default_routes_on_create": false となっています。

{
  "version": 4,
  "terraform_version": "1.4.6",
  "serial": 17,
  "lineage": "xxx",
  "outputs": {},
  "resources": [
    {
      "mode": "managed",
      "type": "google_compute_network",
      "name": "vpc_network",
      "provider": "provider[\"registry.terraform.io/hashicorp/google\"]",
      "instances": [
        {
          "schema_version": 0,
          "attributes": {
            "auto_create_subnetworks": false,
            "delete_default_routes_on_create": false,
~

デフォルトルート削除の試行

デフォルトルートを削除するために17行目の delete_default_routes_on_create = true を有効にします。

provider "google" {
  project = "${PROJECT_ID}"  // プロジェクト ID
  region  = "asia-northeast1"
}
  
terraform {
  required_version = "~> 1.3"
  required_providers {
    google = ">= 4.63.1"
  }
}
  
# Create vpc
resource "google_compute_network" "vpc_network" {
  name                            = "vpc"
  auto_create_subnetworks         = "false"
  delete_default_routes_on_create = true // デフォルトルート作成オプション
}
  
# Create subnet
resource "google_compute_subnetwork" "subnet" {
  name          = "subnet"
  ip_cidr_range = "10.0.0.0/24"
  network       = google_compute_network.vpc_network.name
}

terraform apply を実行すると以下のように 1 changed と表示されました。

fujioka@cloudshell:~ (xxx)$ terraform apply
google_compute_network.vpc_network: Refreshing state... [id=projects/xxx/global/networks/vpc]
google_compute_subnetwork.subnet: Refreshing state... [id=projects/xxx/regions/asia-northeast1/subnetworks/subnet]
  
Terraform used the selected providers to generate the following execution plan. Resource actions are indicated with the following symbols:
  ~ update in-place

Terraform will perform the following actions:
  
  # google_compute_network.vpc_network will be updated in-place
  ~ resource "google_compute_network" "vpc_network" {
      ~ delete_default_routes_on_create           = false -> true
        id                                        = "projects/xxx/global/networks/vpc"
        name                                      = "vpc"
        # (7 unchanged attributes hidden)
    }
  
Plan: 0 to add, 1 to change, 0 to destroy.
  
Do you want to perform these actions?
  Terraform will perform the actions described above.
  Only 'yes' will be accepted to approve.
  
  Enter a value: yes
  
google_compute_network.vpc_network: Modifying... [id=projects/xxx/global/networks/vpc]
google_compute_network.vpc_network: Modifications complete after 0s [id=projects/xxx/global/networks/vpc]
  
Apply complete! Resources: 0 added, 1 changed, 0 destroyed.
fujioka@cloudshell:~ (xxx)$ 

tfstate ファイルは "delete_default_routes_on_create": true となっています。

{
  "version": 4,
  "terraform_version": "1.4.6",
  "serial": 19,
  "lineage": "xxx",
  "outputs": {},
  "resources": [
    {
      "mode": "managed",
      "type": "google_compute_network",
      "name": "vpc_network",
      "provider": "provider[\"registry.terraform.io/hashicorp/google\"]",
      "instances": [
        {
          "schema_version": 0,
          "attributes": {
            "auto_create_subnetworks": false,
            "delete_default_routes_on_create": true,
~

事象

Terraform の実行後に VPC ルートを改めて確認すると、想定とは異なり、実際にはデフォルトルートは削除されていませんでした。

fujioka@cloudshell:~ (xxx)$ gcloud compute routes list --project=${PROJECT_ID} --filter="network=vpc"
NAME: default-route-71e4a7af65c1a91b
NETWORK: vpc
DEST_RANGE: 10.0.0.0/24
NEXT_HOP: vpc
PRIORITY: 0
  
NAME: default-route-8f27e96e5eb606ae
NETWORK: vpc
DEST_RANGE: 0.0.0.0/0
NEXT_HOP: default-internet-gateway
PRIORITY: 1000
fujioka@cloudshell:~ (xxx)$ 

原因

Terraform のドキュメントで今回のオプションを見ると以下のように記載されています。

delete_default_routes_on_create - (Optional) If set to true, default routes (0.0.0.0/0) will be deleted immediately after network creation. Defaults to false.

このオプションは「VPC 作成直後にデフォルトルートを削除する」オプションであり、既に作成済みの VPC には効力を発揮しない仕様であることが分かりました。

解決策

今回の場合は、手動でデフォルトルートを消すことで対応しました。

当記事のケースではルート自体を Terraform で管理していないため、手動の操作がその後の Terraform 実行には影響しませんでした。

デフォルトルートを削除した状態で後述するようなインターネットアクセス、内部リソースへのアクセス等が必要な場合は、個別で静的ルートを追加してください。

デフォルトルート削除による影響

インターネットアクセス

デフォルトルートを削除するとインターネットへの経路を失い、Web サイトや外部サービスへアクセスできなくなる場合があります。これは Google Cloud や Amazon Web Services (AWS) 等のクラウドに限ったことではなくルーティングの問題です。

例として、インスタンスの運用面から考えると以下のような影響が挙げられます。

  • インスタンスが Windows Server の場合、Windows Update ができなくなる
  • インスタンスが Linux の場合、apt や yum 等のパッケージを公式リポジトリから入手できなくなる

他にも Python や Javascript のパッケージインストールでパブリックリポジトリを参照している場合も、インターネットへの経路がないため失敗します。

内部リソースへのアクセス

デフォルトルートはクラウド内のリソース間通信で使われる場合もあります。そのため、リソース間の接続や上位レイヤのアプリケーション動作に影響が生じる場合があります。 例として、以下のものが挙げられます。

  • インスタンスが Windows Server の場合、ライセンス認証ができなくなる
  • Cloud Load Balancing でヘルスチェックができなくなる(プローブ IP 範囲 へのルートが無くなるため)

参考:Compute EngineのWindows Serverでライセンス認証エラー(0xC004F074)

限定公開の Google アクセス

デフォルトルート削除による影響として ドキュメント には以下のように記載があります。

重要: 限定公開の Google アクセスのルーティング要件を満たすカスタム静的ルートがない場合、デフォルト ルートを削除すると、限定公開の Google アクセスが無効になることがあります。

但し、限定公開の Google アクセスで利用するドメイン名によって必要になるルートは異なりますので、詳細は以下の記事を参考に、適切な静的ルートを追加してください。 blog.g-gen.co.jp

藤岡 里美 (記事一覧)

クラウドソリューション部

数年前までチキン売ったりドレスショップで働いてました!2022年9月 G-gen にジョイン。ハイキューの映画を4回は見に行きたい。

Google Cloud All Certifications Engineer / Google Cloud Partner Top Engineer 2024