Cloud Run からのアクセスに Direct VPC egress による固定 IP を用いる
はじめに
Cloud Run からのアクセスに固定 IP を用いる構成を試してみます。
以前は Cloud Run からのアクセスに固定 IP を利用したい場合は VPC connector を利用する必要がありました。
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).
今回はこの機能を用いて実際に IP が固定化されるのを確認します。
検証手順
今回の検証で利用するプログラムは GitHub に公開しています。
http://checkip.dyndns.com/ にアクセスし、 IP アドレスを取得するだけの処理となっています。
利用するリソースを 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