😽

Cloud Run からのアクセスに Direct VPC egress による固定 IP を用いる

2024/03/16に公開

はじめに

Cloud Run からのアクセスに固定 IP を用いる構成を試してみます。

以前は Cloud Run からのアクセスに固定 IP を利用したい場合は VPC connector を利用する必要がありました。
https://cloud.google.com/run/docs/configuring/vpc-connectors

VPC connector は VM インスタンスを利用するため料金が高かったり、スケールインができない制約などがありました。

しかし、 2024 年 3 月 14 日の更新で Direct VPC egress を利用して Cloud NAT を利用することで固定 IP 化する機能がプレビューで出てきました。

Direct VPC egress now supports Cloud NAT with Public NAT IP addresses (in Preview).

https://cloud.google.com/release-notes#March_14_2024

今回はこの機能を用いて実際に IP が固定化されるのを確認します。

検証手順

今回の検証で利用するプログラムは GitHub に公開しています。
http://checkip.dyndns.com/ にアクセスし、 IP アドレスを取得するだけの処理となっています。
https://github.com/tetsuya28/samples/blob/4ccdb77730701ed38cb7c92450257811d376f546/gcp/cloud-run-static-ip/main.go

利用するリソースを Terraform で用意していきます。

VPC

resource "google_compute_network" "this" {
  project                 = var.project_id
  name                    = "sample"
  auto_create_subnetworks = false
}

resource "google_compute_subnetwork" "this" {
  project       = var.project_id
  name          = "sample"
  ip_cidr_range = "10.0.0.0/16"
  region        = local.region
  network       = google_compute_network.this.id
}

Cloud Router

resource "google_compute_router" "this" {
  name    = "sample"
  region  = google_compute_subnetwork.this.region
  network = google_compute_network.this.id
}

Cloud NAT

IP を固定したいので明示的に IP を取得し Cloud NAT に設定します。
今回は全てのアクセスを Cloud NAT 経由で外に向けるため ALL_SUBNETWORKS_ALL_IP_RANGES を利用しています。

resource "google_compute_address" "this" {
  count = var.nat_ip_count
  name  = "sample-${count.index}"
}

resource "google_compute_router_nat" "this" {
  name                               = sample
  router                             = google_compute_router.this.name
  region                             = google_compute_router.this.region
  nat_ip_allocate_option             = "MANUAL_ONLY"
  nat_ips                            = google_compute_address.this[*].name
  source_subnetwork_ip_ranges_to_nat = "ALL_SUBNETWORKS_ALL_IP_RANGES"
}

Cloud Run

Direct VPC egress は BETA でしか利用できないので launch_stage = "BETA を利用します。
template.vpc_access を設定することで Direct VPC egress を有効化します。
Cloud Run の外向きアクセスも全て Direct VPC egress を利用するため egress = "ALL_TRAFFIC を設定しています。

resource "google_cloud_run_v2_service" "sample" {
  project      = var.project_id
  name         = "sample"
  location     = local.region
  ingress      = "INGRESS_TRAFFIC_ALL"
  launch_stage = "BETA"
  template {
    vpc_access {
      network_interfaces {
        network    = google_compute_network.this.name
        subnetwork = google_compute_subnetwork.this.name
      }
      egress = "ALL_TRAFFIC"
    }
    containers {
      ports {
        container_port = 8080
      }
      image = "xxx"
    }
  }
}

resource "google_cloud_run_service_iam_member" "sample" {
  location = google_cloud_run_v2_service.sample.location
  project  = google_cloud_run_v2_service.sample.project
  service  = google_cloud_run_v2_service.sample.name
  role     = "roles/run.invoker"
  member   = "allUsers"
}

動作確認

Direct VPC egress を有効化した場合

Cloud NAT に割り当てた IP を利用してアクセスできていることを確認できました。

Current IP Address: 35.243.93.135

Direct VPC egress を無効化した場合

template.vpc_access を消した状態でアクセスすると Cloud NAT の IP ではないものを利用してアクセスされていることを確認できました。

resource "google_cloud_run_v2_service" "sample" {
  project      = var.project_id
  name         = "sample"
  location     = local.region
  ingress      = "INGRESS_TRAFFIC_ALL"
  launch_stage = "BETA"
  template {
-    vpc_access {
-      network_interfaces {
-        network    = google_compute_network.this.name
-        subnetwork = google_compute_subnetwork.this.name
-      }
-      egress = "ALL_TRAFFIC"
-    }
    containers {
      ports {
        container_port = 8080
      }
      image = "xxx"
    }
  }
}

Current IP Address: 107.178.226.124

Discussion