外向きの静的 IP アドレス

デフォルトでは、Cloud Run サービスは、動的 IP アドレスプールを使用してインターネットの外部エンドポイントに接続します。Cloud Run サービスが、IP アドレスベースのファイアウォールを使用してデータベースや API などの静的 IP アドレスからの接続を必要とする外部エンドポイントに接続する場合、このデフォルトの設定は適していません。このような接続では、静的 IP アドレスを介してリクエストをルーティングするように Cloud Run サービスを構成する必要があります。

このガイドでは、静的 IP アドレスを使用して Cloud Run サービスからリクエストを送信できるようにする方法について説明します。

タスクの概要

Cloud Run サービスが静的 IP アドレス経由でリクエストをルーティングできるようにするには、Cloud NAT ゲートウェイに静的 IP アドレスが構成されている VPC ネットワーク経由ですべての送信トラフィックをルーティングするように、Cloud Run サービスの VPC 下り(外向き)を構成する必要があります。

Cloud NAT ゲートウェイと Cloud Router はコントロール プレーンのみを提供し、パケットが NAT ゲートウェイまたは Cloud Router を通過しないため、Cloud NAT 経由でルーティングしても、ネットワーク スタックで追加のホップは行われません。

同じ VPC ネットワークに接続しているすべての Cloud Run サービスは同じ下り(外向き)IP アドレスを共有します。個別の Cloud Run サービスに対して異なる下り(外向き)IP アドレスを使用するには、このガイドに沿って個別のサブネットワークとサーバーレス VPC アクセス コネクタを作成してください。

サブネットワークの作成

サーバーレス VPC アクセス コネクタのサブネットワークを作成して、Compute Engine VM や Google Kubernetes Engine クラスタなど、VPC 内に存在する他のコンピューティング リソースが、インターネットにアクセスするために構成した静的 IP を誤って使用しないようにします。

コマンドライン

  1. VPC ネットワークの名前を確認します。

    gcloud compute networks list

    次のような出力が表示されます。

    NAME     SUBNET_MODE  BGP_ROUTING_MODE
    default  AUTO         REGIONAL

    サーバーレス VPC アクセス コネクタに接続するネットワークを特定します。

  2. サーバーレス VPC アクセス コネクタ用の VPC にサブネットワークを作成します。

    gcloud compute networks subnets create SUBNET_NAME \
    --range=RANGE --network=NETWORK_NAME --region=REGION

    このコマンドで次の値を置き換えます。

    • SUBNET_NAME は、サブネットワークに付ける名前に置き換えます。
    • RANGE は、このサブネットワークに割り当てる CIDR 形式の IP 範囲10.124.0.0/28 など)に置き換えます。
    • NETWORK_NAME は VPC ネットワークの名前に置き換えます。
    • REGION は、サーバーレス VPC アクセス コネクタを作成するリージョンに置き換えます。

Terraform

  1. 使用する VPC ネットワークを作成します。

    resource "google_compute_network" "default" {
      provider = google-beta
      name     = "cr-static-ip-network"
    }

    cr-static-ip-network は、サブネット名に置き換えます。

  2. サーバーレス VPC アクセス コネクタ用の VPC にサブネットワークを作成します。

    resource "google_compute_subnetwork" "default" {
      provider      = google-beta
      name          = "cr-static-ip"
      ip_cidr_range = "10.124.0.0/28"
      network       = google_compute_network.default.id
      region        = "us-central1"
    }

    次のように置き換えます。

    • cr-static-ip は、サブネット名に置き換えます。
    • 10.124.0.0/28 は、CIDR 範囲に置き換えます。
    • us-central1 は、Google Cloud リージョンに置き換えます。

サーバーレス VPC アクセス コネクタの作成

Cloud Run サービスの送信トラフィックを VPC ネットワークにルーティングするには、サーバーレス VPC アクセス コネクタが必要です。

サーバーレス VPC アクセス コネクタを作成するには:

コマンドライン

  1. 事前に作成されたサブネットワークでサーバーレス VPC アクセス コネクタを作成します。

    gcloud compute networks vpc-access connectors create CONNECTOR_NAME \
      --region=REGION \
      --subnet-project=PROJECT_ID \
      --subnet=SUBNET_NAME
    

    このコマンドで次の値を置き換えます。

    • CONNECTOR は、このリソースに付ける名前に置き換えます。
    • PROJECT_ID は、サブネットワークをホストする名前に置き換えます。
    • SUBNET_NAME は、作成したサブネットワークの名前に置き換えます。
    • REGION には、NAT ゲートウェイを作成するリージョンを指定します。

Terraform

  1. サーバーレス VPC アクセス コネクタを作成します。

    resource "google_project_service" "vpc" {
      provider           = google-beta
      service            = "vpcaccess.googleapis.com"
      disable_on_destroy = false
    }
    
    resource "google_vpc_access_connector" "default" {
      provider = google-beta
      name     = "cr-conn"
      region   = "us-central1"
    
      subnet {
        name = google_compute_subnetwork.default.name
      }
    
      # Wait for VPC API enablement
      # before creating this resource
      depends_on = [
        google_project_service.vpc
      ]
    }

    cr-conn は、サーバーレス VPC アクセス コネクタの名前に置き換えます。

ネットワーク アドレス変換(NAT)の構成

サーバーレス VPC アクセス コネクタを使用すると、Cloud Run サービスからのリクエストは VPC ネットワークに到達します。静的 IP を介して外部エンドポイントに送信リクエストをルーティングするには、Cloud NAT ゲートウェイを構成する必要があります。

コマンドライン

  1. NAT ゲートウェイをプログラムする新しい Cloud Router を作成します。

    gcloud compute routers create ROUTER_NAME \
      --network=NETWORK_NAME \
      --region=REGION

    このコマンドで次の値を置き換えます。

    • ROUTER_NAME は、作成する Cloud Router リソースの名前に置き換えます。
    • NETWORK_NAME は、先ほど確認した VPC ネットワークの名前に置き換えます。
    • REGION には、NAT ゲートウェイを作成するリージョンを指定します。
  2. 静的 IP アドレスを予約します。予約済み IP アドレス リソースは、関連付けられているリソースが削除されて再作成されるときに、元の IP アドレスを保持します。

    gcloud compute addresses create ORIGIN_IP_NAME --region=REGION

    このコマンドで次の値を置き換えます。

    • ORIGIN_IP_NAME は、IP アドレス リソースに割り当てる名前で置き換えます。
    • REGION は、Cloud NAT ルーターを実行するリージョンに置き換えます。レイテンシとネットワーク コストを最小限に抑えるには、Cloud Run サービスと同じリージョンを使用することをおすすめします。
  3. 作成した静的 IP アドレスを使用して VPC ネットワークからのトラフィックをルーティングするように、このルーターに Cloud NAT ゲートウェイの構成を作成します。

    gcloud compute routers nats create NAT_NAME \
      --router=ROUTER_NAME \
      --region=REGION \
      --nat-custom-subnet-ip-ranges=SUBNET_NAME \
      --nat-external-ip-pool=ORIGIN_IP_NAME
    

    このコマンドで次の値を置き換えます。

    • NAT_NAME は、作成する Cloud NAT ゲートウェイ リソースの名前に置き換えます。
    • ROUTER_NAME は、Cloud Router の名前に置き換えます。
    • REGION には、NAT ゲートウェイを作成するリージョンを指定します。
    • ORIGIN_IP_NAME は、前の手順で作成した予約済み IP アドレス リソースの名前で置き換えます。

Terraform

  1. NAT ゲートウェイをプログラムする新しい Cloud Router を作成します。

    resource "google_compute_router" "default" {
      provider = google-beta
      name     = "cr-static-ip-router"
      network  = google_compute_network.default.name
      region   = google_compute_subnetwork.default.region
    }

    cr-static-ip-router は、使用するサブネット名に置き換えます。

  2. 静的 IP アドレスを予約します。予約済み IP アドレス リソースは、関連付けられているリソースが削除されて再作成されるときに、元の IP アドレスを保持します。

    resource "google_compute_address" "default" {
      provider = google-beta
      name     = "cr-static-ip-addr"
      region   = google_compute_subnetwork.default.region
    }

    cr-static-ip-addr は、使用するサブネット名に置き換えます。

  3. 作成した静的 IP アドレスを使用して VPC ネットワークからのトラフィックをルーティングするように、このルーターに Cloud NAT ゲートウェイの構成を作成します。

    resource "google_compute_router_nat" "default" {
      provider = google-beta
      name     = "cr-static-nat"
      router   = google_compute_router.default.name
      region   = google_compute_subnetwork.default.region
    
      nat_ip_allocate_option = "MANUAL_ONLY"
      nat_ips                = [google_compute_address.default.self_link]
    
      source_subnetwork_ip_ranges_to_nat = "LIST_OF_SUBNETWORKS"
      subnetwork {
        name                    = google_compute_subnetwork.default.id
        source_ip_ranges_to_nat = ["ALL_IP_RANGES"]
      }
    }

    cr-static-nat は、Cloud NAT ゲートウェイ名に置き換えます。

VPC ネットワーク経由での Cloud Run トラフィックのルーティング

NAT が構成されたら、サーバーレス VPC アクセス コネクタを使用して Cloud Run サービスをデプロイし、VPC ネットワーク経由ですべてのトラフィックをルーティングするように VPC 下り(外向き)を設定します。

コマンドライン

VPC コネクタを使用してすべての下り(外向き)トラフィックをルーティングする Cloud Run サービスをデプロイまたは更新します。

gcloud run deploy SERVICE_NAME \
   --image=IMAGE_URL \
   --vpc-connector=CONNECTOR_NAME \
   --vpc-egress=all-traffic

このコマンドで次の値を置き換えます。

  • SERVICE_NAME は、デプロイする Cloud Run サービスの名前に置き換えます。
  • IMAGE_URL: コンテナ イメージへの参照(us-docker.pkg.dev/cloudrun/container/hello:latest など)。Artifact Registry を使用する場合は、リポジトリ REPO_NAME がすでに作成されている必要があります。URL の形式は REGION-docker.pkg.dev/PROJECT_ID/REPO_NAME/PATH:TAG です。
  • CONNECTOR_NAME は、サーバーレス VPC アクセス コネクタの名前に置き換えます。

Terraform

この Cloud Run サービスは、VPC コネクタを使用してすべての下り(外向き)トラフィックをルーティングします。

resource "google_cloud_run_v2_service" "default" {
  provider = google-beta
  name     = "cr-static-ip-service"
  location = google_compute_subnetwork.default.region

  template {
    containers {
      # Replace with the URL of your container
      #   gcr.io/<YOUR_GCP_PROJECT_ID>/<YOUR_CONTAINER_NAME>
      image = "us-docker.pkg.dev/cloudrun/container/hello"
    }
    scaling {
      max_instance_count = 5
    }
    vpc_access {
      connector = google_vpc_access_connector.default.id
      egress    = "ALL_TRAFFIC"
    }
  }
  ingress = "INGRESS_TRAFFIC_ALL"

}

us-docker.pkg.dev/cloudrun/container/hello は、コンテナ イメージへの参照に置き換えます。

静的外部 IP の確認

上記の手順を完了すると、VPC ネットワーク上の Cloud NAT に事前定義の静的 IP アドレスが設定され、Cloud Run サービスのすべてのアウトバウンド トラフィックが VPC ネットワークにルーティングされます。Cloud Run サービスからのリクエストは VPC ネットワークを通過し、静的 IP アドレスを使用して外部エンドポイントに到達します。

この動作を確認して、サービスで使用されている送信元 IP アドレスを確認するには、元の IP アドレスを表示する API またはウェブサイト(curlmyip.org など)に対してリクエストを送信します。

静的外部 IP の削除

静的外部 IP アドレスが不要になった場合は、静的外部 IP アドレスを解放するをご覧ください。