外向きの静的 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 アクセス コネクタを作成してください。

サブネットを作成する

コネクタをホストするには、専用の /28 サブネットを作成する必要があります。ダイレクト 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 アクセス コネクタを作成する

ダイレクト VPC 下り(外向き)インテグレーションを使用する場合は、コネクタを作成する必要はありません。ダイレクト 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 下り(外向き)またはサーバーレス 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 下り(外向き)またはサーバーレス VPC アクセス コネクタを使用して Cloud Run サービスをデプロイし、VPC ネットワーク経由ですべてのトラフィックを転送するように VPC 下り(外向き)を設定します。

コマンドライン

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

gcloud run deploy SERVICE_NAME \
   --image=IMAGE_URL \
   --vpc-connector=CONNECTOR_NAME \
   --network=NETWORK \
   --subnet=SUBNET \
   --region=REGION \
   --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 です。
  • 省略可。ダイレクト VPC 下り(外向き)を使用していない場合は、CONNECTOR_NAMEサーバーレス VPC アクセス コネクタの名前に置き換えます。
  • NETWORK: VPC ネットワークの名前。
  • SUBNET: サブネットの名前。
  • REGION: サービスのリージョン。

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 アドレスを解放するをご覧ください。