共有 VPC ホスト プロジェクトでコネクタを構成する

組織で共有 VPC を使用している場合は、サーバーレス VPC アクセス コネクタをサービス プロジェクトかホスト プロジェクトのいずれかで設定できます。このガイドでは、ホスト プロジェクトでコネクタを設定する方法について説明します。

サービス プロジェクトでコネクタを設定する必要がある場合は、サービス プロジェクトでコネクタを構成するをご覧ください。各方法の利点については、共有 VPC ネットワークへの接続をご覧ください。

始める前に

  1. 現在使用しているアカウントの Identity and Access Management(IAM)ロールを確認します。アクティブ アカウントには、ホスト プロジェクトで次のロールが必要です。

  2. 目的の環境でホスト プロジェクトを選択します。

コンソール

  1. Google Cloud コンソール ダッシュボードを開きます。

    Google Cloud コンソール ダッシュボードに移動

  2. ダッシュボードの上部にあるメニューバーで、プロジェクトのプルダウン メニューをクリックし、ホスト プロジェクトを選択します。

gcloud

ターミナルで次のコマンドを実行して、gcloud CLI のデフォルト プロジェクトをホスト プロジェクトに設定します。

gcloud config set project HOST_PROJECT_ID

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

  • HOST_PROJECT_ID: 共有 VPC ホスト プロジェクトの ID。

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

VPC ネットワークにリクエストを送信して対応するレスポンスを受信するには、サーバーレス VPC アクセス コネクタを作成する必要があります。コネクタは、Google Cloud コンソール、Google Cloud CLI、または Terraform を使用して作成できます。

Console

  1. プロジェクトでサーバーレス VPC アクセスの API を有効にします。

    API を有効にする

  2. サーバーレス VPC アクセスの概要ページに移動します。

    サーバーレス VPC アクセスに移動

  3. [コネクタを作成] をクリックします。

  4. [名前] フィールドに、コネクタの名前を入力します。名前は Compute Engine の命名規則に従い、21 文字未満にする必要があります。ハイフン(-)は 2 文字としてカウントされます。

  5. [リージョン] フィールドで、コネクタのリージョンを選択します。これは、サーバーレス サービスのリージョンと一致する必要があります。

    サービスが us-central または europe-west リージョンにある場合は、us-central1 または europe-west1 を使用します。

  6. [ネットワーク] フィールドで、コネクタを接続する VPC ネットワークを選択します。

  7. [サブネットワーク] プルダウン メニューをクリックします。

    /28 の未使用のサブネットを選択します。

    • サブネットはコネクタ専用にする必要があります。VM、Private Service Connect、ロードバランサなどの他のリソースでは使用できません。
    • サブネットが Private Service Connect や Cloud Load Balancing で使用されていないことを確認するには、gcloud CLI で次のコマンドを実行して、サブネットの purposePRIVATE であることを確認します。
      gcloud compute networks subnets describe SUBNET_NAME
      
      SUBNET_NAME は、使用するサブネットの名前に置き換えます。
  8. (省略可)コネクタを詳細に制御するためのスケーリング オプションを設定するには、[スケーリング設定を表示] をクリックしてスケーリング フォームを表示します。

    1. コネクタのインスタンスの最小数と最大数を設定するか、デフォルト値(最小 2、最大 10)を使用します。コネクタは、トラフィックが増加すると、指定された最大値までスケールアウトしますが、トラフィックが減少してもスケールインしません。210 の値を使用し、MINMAX よりも小さい値にする必要があります。
    2. [インスタンスのタイプ] プルダウン メニューで、コネクタに使用するマシンタイプを選択するか、デフォルトの e2-micro を使用します。インスタンス タイプを選択すると、右側にコスト サイドバーが表示され、帯域幅とコストの見積もりが表示されます。
  9. [作成] をクリックします。

  10. コネクタの使用準備が整うと、コネクタ名の横に緑色のチェックマークが表示されます。

gcloud

  1. gcloud コンポーネントを最新バージョンに更新します。

    gcloud components update
    
  2. プロジェクトでサーバーレス VPC アクセス API を有効にします。

    gcloud services enable vpcaccess.googleapis.com
    
  3. サーバーレス VPC アクセス コネクタを作成します。

    gcloud compute networks vpc-access connectors create CONNECTOR_NAME \
    --region=REGION \
    --subnet=SUBNET \
    --subnet-project=HOST_PROJECT_ID \
    # Optional: specify minimum and maximum instance values between 2 and 10, default is 2 min, 10 max.
    --min-instances=MIN \
    --max-instances=MAX \
    # Optional: specify machine type, default is e2-micro
    --machine-type=MACHINE_TYPE
    

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

    • CONNECTOR_NAME: コネクタの名前。名前は Compute Engine の命名規則に従い、21 文字未満にする必要があります。ハイフン(-)は 2 文字としてカウントされます。
    • REGION: コネクタのリージョン。これは、サーバーレス サービスのリージョンと一致する必要があります。サービスが us-central または europe-west リージョンにある場合は、us-central1 または europe-west1 を使用します。
    • SUBNET: 未使用の /28 サブネットの名前。
      • サブネットはコネクタ専用にする必要があります。VM、Private Service Connect、ロードバランサなどの他のリソースでは使用できません。
      • サブネットが Private Service Connect や Cloud Load Balancing で使用されていないことを確認するには、gcloud CLI で次のコマンドを実行して、サブネットの purposePRIVATE であることを確認します。
        gcloud compute networks subnets describe SUBNET_NAME
        
        次のように置き換えます。
        • SUBNET_NAME: サブネットの名前
    • HOST_PROJECT_ID: ホスト プロジェクトの ID
    • MIN: コネクタに使用するインスタンスの最小数。29 の整数を使用してください。デフォルトは 2 です。コネクタのスケーリングの詳細については、スループットとスケーリングをご覧ください。
    • MAX: コネクタに使用するインスタンスの最大数。310 の整数を使用してください。デフォルトは 10 です。トラフィックで必要な場合、コネクタは [MAX] インスタンスにスケールアウトしますが、再スケーリングは行われません。コネクタのスケーリングの詳細については、スループットとスケーリングをご覧ください。
    • MACHINE_TYPE: f1-microe2-micro、または e2-standard-4。マシンタイプやスケーリングなど、コネクタのスループットの詳細については、スループットとスケーリングをご覧ください。

    より詳しい情報とオプションの引数については、gcloud のリファレンスをご覧ください。

  4. 使用する前に、コネクタが READY 状態になっていることを確認します。

    gcloud compute networks vpc-access connectors describe CONNECTOR_NAME \
    --region=REGION
    

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

    • CONNECTOR_NAME: コネクタの名前。これは、前のステップで指定した名前です。
    • REGION: コネクタのリージョン。これは、前の手順で指定したリージョンです。

    出力には、state: READY という行が含まれます。

Terraform

Terraform リソースを使用して、vpcaccess.googleapis.com API を有効にできます。

resource "google_project_service" "vpcaccess-api" {
  project = var.project_id # Replace this with your project ID in quotes
  service = "vpcaccess.googleapis.com"
}

Terraform モジュールを使用して VPC ネットワークとサブネットを作成し、コネクタを作成できます。

module "test-vpc-module" {
  source       = "terraform-google-modules/network/google"
  version      = "~> 9.0"
  project_id   = var.project_id # Replace this with your project ID in quotes
  network_name = "my-serverless-network"
  mtu          = 1460

  subnets = [
    {
      subnet_name   = "serverless-subnet"
      subnet_ip     = "10.10.10.0/28"
      subnet_region = "us-central1"
    }
  ]
}

module "serverless-connector" {
  source     = "terraform-google-modules/network/google//modules/vpc-serverless-connector-beta"
  version    = "~> 9.0"
  project_id = var.project_id
  vpc_connectors = [{
    name        = "central-serverless"
    region      = "us-central1"
    subnet_name = module.test-vpc-module.subnets["us-central1/serverless-subnet"].name
    # host_project_id = var.host_project_id # Specify a host_project_id for shared VPC
    machine_type  = "e2-standard-4"
    min_instances = 2
    max_instances = 7
    }
    # Uncomment to specify an ip_cidr_range
    #   , {
    #     name          = "central-serverless2"
    #     region        = "us-central1"
    #     network       = module.test-vpc-module.network_name
    #     ip_cidr_range = "10.10.11.0/28"
    #     subnet_name   = null
    #     machine_type  = "e2-standard-4"
    #     min_instances = 2
    #   max_instances = 7 }
  ]
  depends_on = [
    google_project_service.vpcaccess-api
  ]
}

サービス プロジェクトで Cloud Run を有効にする

サービス プロジェクトで Cloud Run API を有効にします。これは、後続の手順で IAM ロールを追加し、サービス プロジェクトで Cloud Run を使用するために必要です。

Console

  1. Cloud Run API のページを開きます。

    Cloud Run API

  2. ダッシュボードの上部にあるメニューバーで、プロジェクトのプルダウン メニューをクリックし、サービス プロジェクトを選択します。

  3. [有効にする] をクリックします。

gcloud

ターミナルで次のコマンドを実行します。

gcloud services enable run.googleapis.com --project=SERVICE_PROJECT_ID

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

  • SERVICE_PROJECT_ID: サービス プロジェクトの ID。

コネクタへのアクセス権を設定する

サービス プロジェクト Cloud Run サービス エージェントに、ホスト プロジェクトのサーバーレス VPC アクセス ユーザー IAM ロールを付与して、コネクタへのアクセスを提供します。

Console

  1. [IAM] ページを開きます。

    IAM に移動

  2. プロジェクトのプルダウン メニューをクリックし、ホスト プロジェクトを選択します。

  3. [追加] をクリックします。

  4. [新しいプリンシパル] フィールドに、Cloud Run サービス用の Cloud Run サービス エージェントのメールアドレスを入力します。

    service-SERVICE_PROJECT_NUMBER@serverless-robot-prod.iam.gserviceaccount.com

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

    • SERVICE_PROJECT_NUMBER: サービス プロジェクトに関連付けられたプロジェクト番号。これはプロジェクト ID とは異なります。プロジェクト番号は、Google Cloud コンソールでサービス プロジェクトの [プロジェクトの設定] ページを表示すると確認できます。
  5. [ロール] フィールドで、[サーバーレス VPC アクセス ユーザー] を選択します。

  6. [保存] をクリックします。

gcloud

ターミナルで次のコマンドを実行します。

gcloud projects add-iam-policy-binding HOST_PROJECT_ID \
--member=serviceAccount:service-SERVICE_PROJECT_NUMBER@serverless-robot-prod.iam.gserviceaccount.com \
--role=roles/vpcaccess.user

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

  • HOST_PROJECT_ID: 共有 VPC ホスト プロジェクトの ID。
  • SERVICE_PROJECT_NUMBER: サービス アカウントに関連付けられたプロジェクト番号。これはプロジェクト ID とは異なります。プロジェクト番号は、次のコマンドで確認できます。

    gcloud projects describe SERVICE_PROJECT_ID
    

コネクタを検出可能にする

ホスト プロジェクトの IAM ポリシーで、Cloud Run サービスをデプロイするプリンシパルに次の 2 つの事前定義ロールを付与する必要があります。

サーバーレス VPC アクセス閲覧者(vpcaccess.viewer)のロールのすべての権限を含むカスタムロールや他の事前定義ロールを使用することもできます。

コンソール

  1. [IAM] ページを開きます。

    IAM に移動

  2. プロジェクトのプルダウン メニューをクリックし、ホスト プロジェクトを選択します。

  3. [追加] をクリックします。

  4. [新しいプリンシパル] フィールドに、サービス プロジェクトでコネクタを表示する必要があるプリンシパルのメールアドレスを入力します。このフィールドには複数のメールアドレスを入力できます。

  5. [ロール] フィールドで、次の両方のロールを選択します。

    • サーバーレス VPC アクセス閲覧者
    • Compute ネットワーク閲覧者
  6. [保存] をクリックします。

gcloud

ターミナルで次のコマンドを実行します。

gcloud projects add-iam-policy-binding HOST_PROJECT_ID \
--member=PRINCIPAL \
--role=roles/vpcaccess.viewer

gcloud projects add-iam-policy-binding HOST_PROJECT_ID \
--member=PRINCIPAL \
--role=roles/compute.networkViewer

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

  • HOST_PROJECT_ID: 共有 VPC ホスト プロジェクトの ID。
  • PRINCIPAL: Cloud Run サービスをデプロイするプリンシパル。詳細は、--member フラグをご覧ください。

コネクタを使用するサービスを構成する

共有 VPC にアクセスする必要がある Cloud Run サービスごとに、サービス用のコネクタを指定する必要があります。新しいサービスをデプロイするか、既存のサービスを更新するときに、Google Cloud コンソール、Google Cloud CLI、YAML ファイル、または Terraform を使用してコネクタを指定できます。

コンソール

  1. Google Cloud コンソールで、[Cloud Run] に移動します。

    Cloud Run に移動

  2. デプロイ先の新しいサービスを構成する場合は、[サービスを作成] をクリックします。既存のサービスを構成する場合は、サービスをクリックし、[新しいリビジョンの編集とデプロイ] をクリックします。

  3. 新しいサービスを構成する場合は、最初のサービス設定のページに入力してから、[コンテナ、ボリューム、ネットワーキング、セキュリティ] をクリックしてサービス構成ページを開きます。

  4. [接続] タブをクリックします。

    画像

    • [VPC コネクタ] フィールドで、使用するコネクタを選択するか、[なし] を選択してサービスを VPC ネットワークから切断します。
  5. [作成] または [デプロイ] をクリックします。

gcloud

  1. Cloud Run リソースを含むプロジェクトを使用するように gcloud CLI を設定します。

    gcloud config set project PROJECT_ID
    次のように置き換えます。

    • PROJECT_ID: 共有 VPC にアクセスする必要がある Cloud Run リソースを含むプロジェクトの ID。Cloud Run リソースがホスト プロジェクト内にある場合は、ホスト プロジェクト ID です。Cloud Run リソースがサービス プロジェクト内にある場合は、サービス プロジェクト ID です。
  2. --vpc-connector フラグを使用します。

  • 既存のサービスの場合:
    gcloud run services update SERVICE --vpc-connector=CONNECTOR_NAME
  • 新しいサービスの場合:
    gcloud run deploy SERVICE --image=IMAGE_URL --vpc-connector=CONNECTOR_NAME
    次のように置き換えます。
    • SERVICE: サービスの名前
    • IMAGE_URL: コンテナ イメージへの参照(us-docker.pkg.dev/cloudrun/container/hello:latest など)
    • CONNECTOR_NAME: コネクタの名前。ホスト プロジェクトではなく共有 VPC サービス プロジェクトからデプロイする場合は、次のように完全修飾名を使用します。例:
      projects/HOST_PROJECT_ID/locations/CONNECTOR_REGION/connectors/CONNECTOR_NAME
      ここで、HOST_PROJECT_ID はホスト プロジェクトの ID、CONNECTOR_REGION はコネクタのリージョン、CONNECTOR_NAME はコネクタに付けた名前です。

YAML

Cloud Run リソースを含むプロジェクトを使用するように gcloud CLI を設定します。

gcloud config set project PROJECT_ID

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

  • PROJECT_ID: 共有 VPC にアクセスする必要がある Cloud Run リソースを含むプロジェクトの ID。Cloud Run リソースがホスト プロジェクト内にある場合は、ホスト プロジェクト ID です。Cloud Run リソースがサービス プロジェクト内にある場合は、サービス プロジェクト ID です。

既存のサービス構成をダウンロードして表示するには、gcloud run services describe --format export コマンドを使用します。読みやすく整えられた結果が YAML 形式で出力されます。次に、下記の手順でフィールドを変更し、gcloud run services replace コマンドを使用して変更後の YAML ファイルをアップロードします。必ず説明されているとおりにフィールドを変更してください。

  1. 次のコマンドで、構成を表示してダウンロードします。

    gcloud run services describe SERVICE --format export > service.yaml
  2. 最上位の spec 属性の下の annotations 属性にある run.googleapis.com/vpc-access-connector 属性を追加または更新します。

    apiVersion: serving.knative.dev/v1
    kind: Service
    metadata:
      name: SERVICE
    spec:
      template:
        metadata:
          annotations:
            run.googleapis.com/vpc-access-connector: CONNECTOR_NAME
          name: REVISION

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

    • SERVICE: Cloud Run サービスの名前。
    • CONNECTOR_NAME: コネクタの名前。ホスト プロジェクトではなく共有 VPC サービス プロジェクトからデプロイする場合は、次のように完全修飾名を使用します。例:
      projects/HOST_PROJECT_ID/locations/CONNECTOR_REGION/connectors/CONNECTOR_NAME
      ここで、HOST_PROJECT_ID はホスト プロジェクトの ID、CONNECTOR_REGION はコネクタのリージョン、CONNECTOR_NAME はコネクタに付けた名前です。
    • REVISION は、新しいリビジョン名に置き換えるか、削除(存在する場合)します。新しいリビジョン名を指定する場合は、次の条件を満たす必要があります
      • SERVICE- で始まる
      • 小文字、数字、- のみが使用されている
      • 末尾が - ではない
      • 63 文字以内である
  3. 次のコマンドを使用して、サービスを新しい構成に置き換えます。

    gcloud run services replace service.yaml

Terraform

Terraform リソースを使用してサービスを作成し、コネクタを使用するように構成できます。

# Cloud Run service
resource "google_cloud_run_v2_service" "gcr_service" {
  name     = "mygcrservice"
  provider = google-beta
  location = "us-west1"

  template {
    containers {
      image = "us-docker.pkg.dev/cloudrun/container/hello"
      resources {
        limits = {
          cpu    = "1000m"
          memory = "512Mi"
        }
      }
      # the service uses this SA to call other Google Cloud APIs
      # service_account_name = myservice_runtime_sa
    }

    scaling {
      # Limit scale up to prevent any cost blow outs!
      max_instance_count = 5
    }

    vpc_access {
      # Use the VPC Connector
      connector = google_vpc_access_connector.connector.id
      # all egress from the service should go through the VPC Connector
      egress = "ALL_TRAFFIC"
    }
  }
}

次のステップ