共有 VPC をプロビジョニングする

共有 VPC を使用すると、ホスト プロジェクトの Virtual Private Cloud(VPC)ネットワークから同じ組織内の別のサービス プロジェクトにサブネットをエクスポートできます。サービス プロジェクトのインスタンスは、ホスト プロジェクトの共有サブネットでネットワーク接続を得ることができます。このページでは、組織にとって必要ないくつかの管理上の準備など、共有 VPC を設定して使用する方法について説明します。

共有 VPC では、IPv4 のみ(シングル スタック)のサブネットと、IPv4 と IPv6(デュアル スタック)のサブネットの両方をエクスポートできます。

サービス プロジェクトの接続解除または共有 VPC 構成の完全な削除については、共有 VPC のプロビジョニングを解除するをご覧ください。

共有 VPC は、API とコマンドライン インターフェースでは「XPN」とも表示されます。

割り当て、上限、適格なリソース

始める前に、共有 VPCIAM を十分に理解するようにしてください。

組織を準備する

組織を準備する際は、次の点に注意してください。

管理者と IAM

組織の準備、共有 VPC ホスト プロジェクトの設定、共有 VPC ネットワークの使用には、少なくとも 3 つの管理 Identity and Access Management(IAM)ロールが必要です。各ロールの詳細と、オプションのロールについては、共有 VPC の概要の管理者と IAM のセクションをご覧ください。

組織ポリシーの制約

組織のポリシーの制約により、共有 VPC リソースをプロジェクト、フォルダ、組織レベルで保護できます。以下では、各ポリシーについて説明します。

ホスト プロジェクトの誤削除の防止

ホスト プロジェクトを誤って削除してしまうと、それに接続されているすべてのサービス プロジェクトが停止します。共有 VPC ホスト プロジェクトになるようプロジェクトが構成されている場合は、リーエンと呼ばれる特殊なロックがプロジェクトに適用されます。リーエンが設定されていれば、プロジェクトが誤って削除されることがなくなります。リーエンは、共有 VPC から解除されると、ホスト プロジェクトから自動的に削除されます。

orgpolicy.policyAdmin ロールを持つユーザーは、リーエンの削除を次のロールだけに制限する組織レベルのポリシー制約(constraints/compute.restrictXpnProjectLienRemoval)を定義できます。

  • 組織レベルで roles/owner または roles/resourcemanager.lienModifier を持つユーザー
  • 組織レベルで resourcemanager.projects.get resourcemanager.projects.updateLiens 権限を含むカスタムロールを持つユーザー

これにより、組織レベルの roles/owner ロールや組織レベルの resourcemanager.lienModifier ロールを持たないプロジェクト オーナーが、共有 VPC ホスト プロジェクトを誤って削除することを、効果的に防ぐことができます。resourcemanager.lienModifier ロールに関連付けられている権限の詳細については、Resource Manager ドキュメントのプロジェクトにリーエンを適用するをご覧ください。

組織ポリシーは組織内のすべてのプロジェクトに適用されるため、リーエンの削除を制限するには、これらの手順を一度行うだけで済みます。

  1. 組織管理者、または orgpolicy.policyAdmin ロールを持つ IAM プリンシパルとして gcloud への認証を行います。ORG_ADMIN は、組織管理者の名前に置き換えます。

    gcloud auth login ORG_ADMIN
    
  2. 次のコマンドの出力を調べて、自分の組織 ID 番号を確認します。

    gcloud organizations list
    
  3. 次のコマンドを実行して、組織に compute.restrictXpnProjectLienRemoval ポリシーを適用します。ORG_ID は、前の手順で確認した番号に置き換えます。

    gcloud resource-manager org-policies enable-enforce \
        --organization ORG_ID compute.restrictXpnProjectLienRemoval
    
  4. 組織管理者としてアカウントを保護する作業が完了したら、gcloud からログアウトします。

    gcloud auth revoke ORG_ADMIN
    

ホスト プロジェクトの接続を制限する

デフォルトでは、共有 VPC 管理者は、同じ組織内の任意のホスト プロジェクトに非ホスト プロジェクトを接続できます。組織のポリシー管理者は、非ホスト プロジェクトを接続できるホスト プロジェクトを制限できます。また、フォルダまたは組織内の非ホスト プロジェクトを接続できるホスト プロジェクトも制限できます。詳細については、constraints/compute.restrictSharedVpcHostProjects 制約をご覧ください。

サービス プロジェクトで使用できるホスト プロジェクトのサブネットを制限する

デフォルトでは、共有 VPC を構成した後、サービス プロジェクトの IAM プリンシパルは適切な IAM 権限を持つホスト プロジェクトのサブネットを使用できます。組織のポリシー管理者は、個々のユーザー権限を管理するだけでなく、ポリシーを設定して特定のプロジェクトからアクセス可能なサブネットのセットを定義できます。また、フォルダや組織内のプロジェクトからアクセス可能なサブネットのセットも定義できます。詳細については、constraints/compute.restrictSharedVpcSubnetworks 制約をご覧ください。

ホスト プロジェクトの偶発的なシャットダウンを防ぐ

共有 VPC ネットワークで課金の接続を解除すると、サービス プロジェクトを含むすべての依存リソースが完全にシャットダウンする可能性があります。アクティブでないか無効な課金状態が原因で、偶発的な共有 VPC のシャットダウンが発生するのを防ぐには、ホスト プロジェクトと請求先アカウント間のリンクを保護します

共有 VPC 管理者の指名

組織管理者は、1 人以上の IAM プリンシパルに共有 VPC 管理者プロジェクト IAM 管理者のロールを付与できます。

プロジェクト IAM 管理者ロールは、個々のサブネットだけでなく、すべてのサブネット(今後作成されるものも含む)を共有する権限を共有 VPC 管理者に付与します。この付与により、プロジェクト レベルではなく、組織レベルまたはフォルダレベルでバインディングが作成されます。そのため、IAM プリンシパルはプロジェクト内だけではなく、組織で定義する必要があります。

コンソール

組織レベルで共有 VPC 管理者ロールを付与するには

  1. Google Cloud コンソールに組織管理者としてログインし、[IAM] ページに移動します。

    [IAM] ページに移動

  2. プロジェクト メニューから、自分の組織を選択します。

    プロジェクトを選択すると、[ロール] メニューに誤ったエントリが表示されます。

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

  4. 新しいプリンシパルのメールアドレスを入力します。

  5. [ロール] メニューで、[Compute Engine]> [Compute Shared VPC 管理者] を選択します。

  6. [別のロールを追加] をクリックします。

  7. [ロール] プルダウンで、[Resource Manager] > [プロジェクト IAM 管理者] を選択します。

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

フォルダレベルで共有 VPC 管理者ロールを付与するには

  1. Google Cloud コンソールに組織管理者としてログインし、[IAM] ページに移動します。

    [IAM] ページに移動

  2. プロジェクト メニューから、フォルダを選択します。

    プロジェクトまたは組織を選択すると、正しくないオプションが表示されます。

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

  4. 新しいプリンシパルのメールアドレスを入力します。

  5. [ロールを選択] で、[Compute Engine] > [Compute Shared VPC 管理者] を選択します。

  6. [別のロールを追加] をクリックします。

  7. [ロール] メニューで、[Resource Manager] > [プロジェクト IAM 管理者] を選択します。

  8. [別のロールを追加] をクリックします。

  9. [ロール] メニューで、[Resource Manager] > [Compute ネットワーク閲覧者] を選択します。

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

gcloud

  1. 組織管理者として、gcloud で認証します。ORG_ADMIN は、組織管理者の名前に置き換えます。

    gcloud auth login ORG_ADMIN
    
  2. 次のコマンドの出力を調べて、自分の組織 ID 番号を確認します。

    gcloud organizations list
    
  3. 組織レベルで共有 VPC 管理者ロールを割り当てるには、次の操作を行います。

    1. 既存の IAM プリンシパルに共有 VPC 管理者のロールを適用します。ORG_ID は、前の手順で確認した組織 ID 番号に置き換え、EMAIL_ADDRESS は、共有 VPC 管理者のロールを付与するユーザーのメールアドレスに置き換えます。

      gcloud organizations add-iam-policy-binding ORG_ID \
        --member='user:EMAIL_ADDRESS' \
        --role="roles/compute.xpnAdmin"
      
      gcloud organizations add-iam-policy-binding ORG_ID \
        --member='user:EMAIL_ADDRESS' \
        --role="roles/resourcemanager.projectIamAdmin"
      
  4. フォルダレベルで共有 VPC 管理者のロールを割り当てるには、次の操作を行います。

    1. このコマンドの出力を調べて、フォルダ ID を確認します。

      gcloud resource-manager folders list --organization=ORG_ID
      
    2. 既存の IAM プリンシパルに共有 VPC 管理者のロールを適用します。ORG_ID は、前の手順で確認した組織 ID 番号に置き換え、EMAIL_ADDRESS は、共有 VPC 管理者のロールを付与するユーザーのメールアドレスに置き換えます。

      gcloud resource-manager folders add-iam-policy-binding FOLDER_ID \
         --member='user:EMAIL_ADDRESS' \
         --role="roles/compute.xpnAdmin"
      
      gcloud resource-manager folders add-iam-policy-binding FOLDER_ID \
         --member='user:EMAIL_ADDRESS' \
         --role="roles/resourcemanager.projectIamAdmin"
      
      gcloud resource-manager folders add-iam-policy-binding FOLDER_ID \
         --member='user:EMAIL_ADDRESS' \
         --role="roles/compute.networkViewer"
      
  5. アカウントを保護するための作業が完了したら、gcloud コマンドライン ツールで組織管理者アカウント トークンを取り消します。

    gcloud auth revoke ORG_ADMIN
    

API

  • 組織レベルで共有 VPC 管理者ロールを割り当てるには、次の操作を行います。

    1. 組織 ID 番号を特定します。

      POST https://cloudresourcemanager.googleapis.com/v1/organizations
      
    2. 既存の組織のポリシーの詳細を記述し、記録します。

      POST https://cloudresourcemanager.googleapis.com/v1/organizations/ORG_ID:getIamPolicy
      

      ORG_ID は組織の ID に置き換えます。

    3. 共有 VPC 管理者ロールを割り当てます。

      POST https://cloudresourcemanager.googleapis.com/v1/organizations/ORG_ID:setIamPolicy
      {
        "bindings": [
          ...copy existing bindings
          {
            "members": [
              "user:EMAIL_ADDRESS"
            ],
            "role": "roles/compute.xpnAdmin"
          },
          {
            "members": [
              "user:EMAIL_ADDRESS"
            ],
            "role": "roles/resourcemanager.projectIamAdmin"
          }
        ],
        "etag": "ETAG",
        "version": 1,
        ...other existing policy details
      }
      

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

      • ORG_ID: 共有 VPC 管理者のロールを付与するユーザーの ID。
      • EMAIL_ADDRESS: ユーザーのメールアドレス。
      • ETAG: 既存のポリシーを記述するときに取得した固有識別子。これにより、複数の更新リクエストが同時に送信された場合の競合を回避します。

      詳細については、organizations.setIamPolicy メソッドをご覧ください。

  • フォルダレベルで共有 VPC 管理者ロールを割り当てるには、次のリクエストを使用します。

    1. 組織 ID 番号を特定します。

      POST https://cloudresourcemanager.googleapis.com/v1/organizations
      
    2. フォルダ ID を探します。

      GET https://cloudresourcemanager.googleapis.com/v2/folders?parent=organizations/ORG_ID
      

      ORG_ID は組織の ID に置き換えます。

    3. 既存のフォルダ ポリシーの詳細を記述して、記録します。

      POST https://cloudresourcemanager.googleapis.com/v2/folders/FOLDER_ID:getIamPolicy
      

      FOLDER_ID は、フォルダの ID に置き換えます。

    4. 共有 VPC 管理者ロールを割り当てます。

      POST https://cloudresourcemanager.googleapis.com/v1/organizations/FOLDER_ID:setIamPolicy
      {
        "bindings": [
          ...copy existing bindings
          {
            "members": [
              "user:EMAIL_ADDRESS"
            ],
            "role": "roles/compute.xpnAdmin"
          },
          {
            "members": [
              "user:EMAIL_ADDRESS"
            ],
            "role": "roles/resourcemanager.projectIamAdmin"
          },
          {
            "members": [
              "user:EMAIL_ADDRESS"
            ],
            "role": "roles/compute.networkViewer"
          }
        ],
        "etag": "ETAG",
        "version": 1,
        ...other existing policy details
      }
      

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

      • FOLDER_ID: 共有 VPC 管理者のロールを付与するユーザーが属する組織の ID。
      • EMAIL_ADDRESS: ユーザーのメールアドレス。
      • ETAG: 既存のポリシーを記述するときに取得した固有識別子。これにより、複数の更新リクエストが同時に送信された場合の競合を回避します。

      詳細については、folders.setIamPolicy メソッドをご覧ください。

共有 VPC を設定する

このセクションのタスクはすべて、共有 VPC 管理者が行う必要があります。

ホスト プロジェクトの有効化

共有 VPC 管理者は組織内で、割り当てと上限に従ってプロジェクトを共有 VPC ホスト プロジェクトとして指定できます。手順は以下のとおりです。組織のプロジェクト作成者ロールとプロジェクト削除ロールroles/resourcemanager.projectCreatorroles/resourcemanager.projectDeleter)が付与されている場合、共有 VPC 管理者はプロジェクトの作成や削除を行うこともできます。

ホスト プロジェクトを有効にしても、プロジェクトのネットワーク リソースがサービス プロジェクトに自動的に共有されることはありません。ホスト プロジェクトにサービス プロジェクトを接続して、選択したネットワークとサブネットをサービス プロジェクトと共有する必要があります。

コンソール

Compute Shared VPC 管理者ロール(roles/compute.xpnAdmin)がまだ付与されていない場合は、このページを Google Cloud コンソールで表示できません。

  1. Google Cloud コンソールで、[共有 VPC] ページに移動します。

    共有 VPC に移動

  2. 共有 VPC 管理者としてログインします。

  3. プロジェクト選択ツールで、共有 VPC ホスト プロジェクトとして有効にするプロジェクトを選択します。

  4. [共有 VPC を設定] をクリックします。

  5. 次のページの [ホスト プロジェクトを有効にする] で、[保存して続行] をクリックします。

  6. [サブネットを選択する] で、次のいずれかを行います。

    1. ホスト プロジェクトの VPC ネットワーク内の現在と将来のすべてのサブネットを、次の手順で指定するサービス プロジェクトやサービス プロジェクト管理者と共有する必要がある場合、[すべてのサブネットを共有する(プロジェクト レベルの権限)] をクリックします。
    2. ホスト プロジェクトの VPC ネットワークのサブネットを、サービス プロジェクトやサービス プロジェクト管理者と選択的に共有する必要がある場合、[個々のサブネット(サブネット レベルの権限)] をクリックします。次に、[共有するサブネット] を選択します。
  7. [続行] をクリックします。
    その次の画面が表示されます。

  8. [プロジェクト名] で、ホスト プロジェクトに接続するサービス プロジェクトを指定します。サービス プロジェクトを接続しても、サービス プロジェクト管理者は定義されません。これは、次の手順で行います。

  9. [ロール別にユーザーを選択する] セクションで、サービス プロジェクト管理者を追加します。これらのユーザーには、共有サブネットの IAM ロール compute.networkUser が付与されます。共有 VPC ホスト プロジェクトのサブネットでリソースを作成できるのは、サービス プロジェクト管理者のみです。

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

gcloud

  1. 共有 VPC 管理者として gcloud への認証を行います。SHARED_VPC_ADMIN は、共有 VPC 管理者の名前に置き換えます。

    gcloud auth login SHARED_VPC_ADMIN
    
  2. ホスト プロジェクトにする必要のあるプロジェクトに対して、共有 VPC を有効にします。HOST_PROJECT_ID は、プロジェクトの ID に置き換えます。

    gcloud compute shared-vpc enable HOST_PROJECT_ID
    
  3. 組織のホスト プロジェクトとしてプロジェクトがリストされていることを確認します。ORG_ID は、組織 ID(gcloud organizations list で確認)に置き換えます。

    gcloud compute shared-vpc organizations list-host-projects ORG_ID
    
  4. ホスト プロジェクトを有効にするだけでよい場合は、gcloud からログアウトして、共有 VPC 管理者アカウントの認証情報を保護できます。それ以外の場合、この手順をスキップして、サービス プロジェクトを接続する手順に進みます。

    gcloud auth revoke SHARED_VPC_ADMIN
    

API

  1. プロジェクトの共有 VPC を有効にするには、共有 VPC 管理者の権限を持つ認証情報を使用します。

    POST https://compute.googleapis.com/compute/v1/projects/HOST_PROJECT_ID/enableXpnHost
    

    HOST_PROJECT_ID は、共有 VPC ホスト プロジェクトにするプロジェクトの ID に置き換えます。

    詳細については、projects.enableXpnHost メソッドをご覧ください。

  2. プロジェクトがホスト プロジェクトとして表示されていることを確認します。

    POST https://compute.googleapis.com/compute/v1/projects/HOST_PROJECT_ID/listXpnHosts
    

    HOST_PROJECT_ID は、共有 VPC ホスト プロジェクトの ID に置き換えます。

    詳細については、projects.listXpnHosts メソッドをご覧ください。

Terraform

Terraform リソースを使用して、ホスト プロジェクトを有効にできます。

resource "google_compute_shared_vpc_host_project" "host" {
  project = var.project # Replace this with your host project ID in quotes
}

Terraform 構成を適用または削除する方法については、基本的な Terraform コマンドをご覧ください。

サービス プロジェクトの接続

サービス プロジェクトの管理者が共有 VPC を使用するには、サービス プロジェクトがホスト プロジェクトに接続されている必要があります。共有 VPC 管理者は、以下の手順で接続を完了する必要があります。

サービス プロジェクトは 1 つのホスト プロジェクトにのみ接続できますが、ホスト プロジェクトは複数のサービス プロジェクトの接続をサポートしています。詳細については、VPC 割り当てページの共有 VPC に固有の上限をご覧ください。

コンソール

  1. 共有 VPC 管理者として Google Cloud コンソールにログインします。
  2. Google Cloud コンソールで、[共有 VPC] ページに移動します。
    [共有 VPC] ページに移動
  3. [接続されたプロジェクト] タブをクリックします。
  4. [接続されたプロジェクト] タブで、[プロジェクトを接続] ボタンをクリックします。
  5. [プロジェクト名] セクションで、接続するサービス プロジェクトのチェックボックスをオンにします。サービス プロジェクトを接続しても、サービス プロジェクト管理者は定義されません。これは、次の手順で行います。
  6. [VPC ネットワークの権限] セクションで、compute.networkUser ロールを付与するプリンシパルのロールを選択します。IAM プリンシパルには、VPC ネットワーク共有モードに基づいて、ホスト プロジェクト全体またはホスト プロジェクト内の特定のサブネットに対するネットワーク ユーザーのロールが付与されます。これらのプリンシパルは、それぞれのサービス プロジェクトのサービス プロジェクト管理者と呼ばれます。
  7. [VPC ネットワーク共有モード] セクションで、次のいずれかを選択します。
    1. ホスト プロジェクトの VPC ネットワーク内の現在と将来のすべてのサブネットを、すべてのサービス プロジェクトやサービス プロジェクト管理者と共有するには、[すべてのサブネットを共有する(プロジェクト レベルの権限)] をクリックします。
    2. ホスト プロジェクトの VPC ネットワークのサブネットを、サービス プロジェクトやサービス プロジェクト管理者と選択的に共有する必要がある場合、[個々のサブネット(サブネット レベルの権限)] をクリックします。次に、[共有するサブネット] を選択します。
  8. [保存] をクリックします。

gcloud

  1. まだ共有 VPC 管理者として gcloud の認証を行っていない場合は、認証を行います。SHARED_VPC_ADMIN は、共有 VPC 管理者の名前に置き換えます。

    gcloud auth login SHARED_VPC_ADMIN
    
  2. 以前に有効にしたホスト プロジェクトにサービス プロジェクトを接続します。SERVICE_PROJECT_ID はサービス プロジェクトのプロジェクト ID に置き換え、HOST_PROJECT_ID はホスト プロジェクトのプロジェクト ID に置き換えます。

    gcloud compute shared-vpc associated-projects add SERVICE_PROJECT_ID \
        --host-project HOST_PROJECT_ID
    
  3. サービス プロジェクトが接続されていることを確認します。

    gcloud compute shared-vpc get-host-project SERVICE_PROJECT_ID
    
  4. 必要に応じて、ホスト プロジェクトに接続されているサービス プロジェクトの一覧を表示できます。

    gcloud compute shared-vpc list-associated-resources HOST_PROJECT_ID
    
  5. サービス プロジェクトを接続するだけでよい場合、gcloud からログアウトして、共有 VPC 管理者アカウントの認証情報を保護できます。それ以外の場合、この手順をスキップして、すべてのサブネットまたは一部のサブネットのみに対してサービス プロジェクト管理者を定義します。

    gcloud auth revoke SHARED_VPC_ADMIN
    

API

  1. サービス プロジェクトを共有 VPC ホスト プロジェクトに接続します。

    POST https://compute.googleapis.com/compute/v1/projects/HOST_PROJECT_ID/enableXpnResource
    {
      "xpnResource": {
        "id": "SERVICE_PROJECT"
      }
    }
    

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

    • HOST_PROJECT_ID: 共有 VPC ホスト プロジェクトの ID。
    • SERVICE_PROJECT: 接続するサービス プロジェクトの ID。

    詳細については、projects.enableXpnResource メソッドをご覧ください。

  2. サービス プロジェクトがホスト プロジェクトに接続していることを確認します。

    GET https://compute.googleapis.com/compute/v1/projects/HOST_PROJECT_ID/getXpnResources
    

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

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

    詳細については、projects.getXpnResources メソッドをご覧ください。

Terraform

Terraform リソースを使用して、サービス プロジェクトを接続できます。

resource "google_compute_shared_vpc_service_project" "service1" {
  host_project    = google_compute_shared_vpc_host_project.host.project
  service_project = var.service_project # Replace this with your service project ID in quotes
}

Terraform 構成を適用または削除する方法については、基本的な Terraform コマンドをご覧ください。

すべてのサブネットのサービス プロジェクト管理者

共有 VPC 管理者は、サービス プロジェクトの IAM プリンシパルをサービス プロジェクト管理者に割り当て、ホスト プロジェクト内のすべてのサブネットへのアクセスを許可できます。この種のサービス プロジェクト管理者には、ホスト プロジェクト全体に対する compute.networkUser のロールが付与されます。つまり、ホスト プロジェクトに定義されているサブネットだけでなく、今後作成されるサブネットにもアクセスできます。

ホスト プロジェクトで compute.networkUser ロールを持つユーザーは、接続されたサービス プロジェクト内のすべてのサブネットを表示できます。

コンソール

Google Cloud コンソールで、サービス プロジェクトの IAM プリンシパルをサービス プロジェクト管理者として定義し、ホスト プロジェクトのすべてのサブネットにアクセスできるようにするには、サービス プロジェクトの接続セクションをご覧ください。

gcloud

この手順には、ホスト プロジェクト内のすべてのサブネットに対するアクセス権を持つサービス プロジェクト管理者としてサービス プロジェクトから IAM プリンシパルを定義する方法が含まれています。この手順を行うには、事前にホスト プロジェクトを有効にして、ホスト プロジェクトにサービス プロジェクトを接続しておく必要があります。

  1. まだ共有 VPC 管理者として gcloud の認証を行っていない場合は、認証を行います。SHARED_VPC_ADMIN は、共有 VPC 管理者の名前に置き換えます。

    gcloud auth login SHARED_VPC_ADMIN
    
  2. サービス プロジェクト内の IAM プリンシパルをサービス プロジェクト管理者にするポリシー バインディングを作成します。HOST_PROJECT_ID は、ホスト プロジェクトのプロジェクト ID に置き換え、SERVICE_PROJECT_ADMIN は、サービス プロジェクト管理者になるユーザーのメールアドレスに置き換えます。

    gcloud projects add-iam-policy-binding HOST_PROJECT_ID \
    --member "user:SERVICE_PROJECT_ADMIN" \
    --role "roles/compute.networkUser"
    

    次のように --member 引数の形式を変更することで、さまざまな種類のプリンシパルを指定できます。

    • group: を使用して、Google グループをプリンシパルとして指定します(メールアドレスを使用)。
    • domain: を使用して、Google ドメインをプリンシパルとして指定します。
    • serviceAccount: を使用してサービス アカウントを指定します。このユースケースの詳細については、サービス プロジェクト管理者としてのサービス アカウントをご覧ください。
  3. 定義する必要のある他の各サービス プロジェクト管理者に対して、前の手順を繰り返します。

  4. サービス プロジェクト管理者の定義が完了している場合は、gcloud からログアウトして、共有 VPC 管理者アカウントの認証情報を保護できます。

    gcloud auth revoke SHARED_VPC_ADMIN
    

API

  1. 既存のプロジェクト ポリシーの詳細を記述し、記録します。既存のポリシーと etag 値が必要です。

    POST https://cloudresourcemanager.googleapis.com/v2/projects/HOST_PROJECT_ID:getIamPolicy
    

    HOST_PROJECT_ID は、共有 VPC ネットワークを含むホスト プロジェクトの ID に置き換えます。

  2. サービス プロジェクトの IAM プリンシパルをサービス プロジェクト管理者に指定するポリシー バインディングを作成します。

    POST https://cloudresourcemanager.googleapis.com/v1/projects/HOST_PROJECT_ID:setIamPolicy
    {
      "bindings": [
        ...copy existing bindings
        {
          "members": [
            PRINCIPAL,
            ...additional principals
          ],
          "role": "roles/compute.networkUser"
        },
      ],
      "etag": "ETAG",
      "version": 1,
      ...other existing policy details
    }
    

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

    • HOST_PROJECT_ID: 共有 VPC ネットワークを含むホスト プロジェクトの ID。
    • PRINCIPAL: ユーザー、グループ、ドメイン、サービス アカウントなどのロールが関連付けられている ID。詳細については、Resource Manager のドキュメントで members フィールドの説明をご覧ください。
    • ETAG: 既存のポリシーを記述するときに取得した固有識別子。これにより、複数の更新リクエストが同時に送信された場合の競合を回避します。

    詳細については、projects.setIamPolicy メソッドをご覧ください。

一部のサブネットのサービス プロジェクト管理者

共有 VPC 管理者は、サービス プロジェクトの IAM プリンシパルをサービス プロジェクト管理者に割り当て、ホスト プロジェクトの一部のサブネットのみにアクセスを許可できます。このオプションを使用すると、ホスト プロジェクト内の一部のサブネットのみに対する compute.networkUser ロールをサービス プロジェクト管理者に付与することで、管理者をさらに詳細に定義できます。

ホスト プロジェクトで compute.networkUser ロールを持つユーザーは、接続されたサービス プロジェクト内のすべてのサブネットを表示できます。

コンソール

Google Cloud コンソールで、サービス プロジェクトの IAM プリンシパルをサービス プロジェクト管理者として定義し、ホスト プロジェクトの一部のサブネットにのみアクセスできるようにするには、サービス プロジェクトの接続をご覧ください。

gcloud

この手順には、ホスト プロジェクト内の一部のサブネットのみに対するアクセス権を持つサービス プロジェクト管理者としてサービス プロジェクトから IAM プリンシパルを定義する方法が含まれています。管理者を定義するには、事前にホスト プロジェクトを有効にして、ホスト プロジェクトにサービス プロジェクトを接続しておく必要があります。

  1. まだ共有 VPC 管理者として gcloud の認証を行っていない場合は、認証を行います。SHARED_VPC_ADMIN は、共有 VPC 管理者の名前に置き換えます。

    gcloud auth login SHARED_VPC_ADMIN
    
  2. サービス プロジェクト管理者がアクセスする必要のあるホスト プロジェクト内のサブネットを選択します。現在の IAM ポリシーを JSON 形式で取得します。SUBNET_NAME は、ホスト プロジェクト内のサブネットの名前に置き換え、HOST_PROJECT_ID は、ホスト プロジェクトのプロジェクト ID に置き換えます。

    gcloud compute networks subnets get-iam-policy SUBNET_NAME \
        --region SUBNET_REGION \
        --project HOST_PROJECT_ID \
        --format json
    
  3. 前の手順で得た JSON 出力をコピーし、任意のファイルに保存します。わかりやすくするため、ここでは subnet-policy.json という名前のファイルに出力を保存します。

  4. subnet-policy.json ファイルを変更します。サービス プロジェクト管理者にし、サブネットへのアクセスを許可する IAM プリンシパルを追加します。各 SERVICE_PROJECT_ADMIN は、サービス プロジェクトの IAM ユーザーのメールアドレスに置き換えます。

    {
      "bindings": [
      {
         "members": [
               "user:[SERVICE_PROJECT_ADMIN]",
               "user:[SERVICE_PROJECT_ADMIN]"
            ],
            "role": "roles/compute.networkUser"
      }
      ],
      "etag": "[ETAG_STRING]"
    }
    

    次のようにして、ポリシーには、さまざまな種類の IAM プリンシパル(ユーザー以外)を指定できます。

    • user:group: に変更して、Google グループをプリンシパルとして指定します(メールアドレスを使用)。
    • user:domain: に変更して、Google ドメインをプリンシパルとして指定します。
    • serviceAccount: を使用してサービス アカウントを指定します。このユースケースの詳細については、サービス プロジェクト管理者としてのサービス アカウントをご覧ください。
  5. subnet-policy.json ファイルの内容を使用して、サブネットのポリシー バインディングを更新します。

    gcloud compute networks subnets set-iam-policy SUBNET_NAME subnet-policy.json \
        --region SUBNET_REGION \
        --project HOST_PROJECT_ID
    
  6. サービス プロジェクト管理者の定義が完了している場合は、gcloud からログアウトして、共有 VPC 管理者アカウントの認証情報を保護できます。

    gcloud auth revoke SHARED_VPC_ADMIN
    

API

  1. 既存のサブネット ポリシーの詳細を記述し、記録します。既存のポリシーと etag 値が必要です。

    GET https://compute.googleapis.com/compute/v1/projects/HOST_PROJECT_ID/regions/SUBNET_REGION/subnetworks/SUBNET_NAME/getIamPolicy
    

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

    • HOST_PROJECT_ID: 共有 VPC ネットワークを含むホスト プロジェクトの ID。
    • SUBNET_NAME: 共有するサブネットの名前。
    • SUBNET_REGION: サブネットが配置されているリージョン。
  2. サブネット ポリシーを更新して、ホスト プロジェクトのサブネットに対するアクセス権をサービス プロジェクト管理者に付与します。

    POST https://compute.googleapis.com/compute/v1/projects/HOST_PROJECT_ID/regions/SUBNET_REGION/subnetworks/SUBNET_NAME/setIamPolicy
    {
      "bindings": [
        ...copy existing bindings
        {
          "members": [
            PRINCIPAL,
            ...additional principals
          ],
          "role": "roles/compute.networkUser"
        },
      ],
      "etag": "ETAG",
      "version": 1,
      ...other existing policy details
    }
    

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

    • ETAG: 既存のポリシーを記述するときに取得した固有識別子。これにより、複数の更新リクエストが同時に送信された場合の競合を回避します。
    • HOST_PROJECT_ID: 共有 VPC ネットワークを含むホスト プロジェクトの ID。
    • PRINCIPAL: ユーザー、グループ、ドメイン、サービス アカウントなどのロールが関連付けられている ID。詳細については、Resource Manager のドキュメントで members フィールドの説明をご覧ください。
    • SUBNET_NAME: 共有するサブネットの名前。
    • SUBNET_REGION: サブネットが配置されているリージョン。

    詳細については、subnetworks.setIamPolicy メソッドをご覧ください。

サービス プロジェクト管理者としてのサービス アカウント

共有 VPC 管理者は、サービス プロジェクト管理者として、サービス プロジェクトからサービス アカウントを定義することもできます。このセクションでは、サービス プロジェクト管理者として 2 種類のサービス アカウントを定義する方法を説明します。

サービス プロジェクト管理者ロール(compute.networkUser)は、ホスト プロジェクトのすべてのサブネットか、一部のサブネットのみに対して付与されます。ただし、このセクションではわかりやすくするために、ホスト プロジェクトのすべてのサブネットに対するサービス プロジェクト管理者として、2 種類のサービス アカウントを定義する方法を説明します。

サービス プロジェクト管理者としてのユーザー管理サービス アカウント

ここでは、共有 VPC ホスト プロジェクトのすべてのサブネットに対するサービス プロジェクト管理者としてユーザー管理サービス アカウントを定義する方法について説明します。

コンソール

  1. 共有 VPC 管理者として Google Cloud コンソールにログインします。
  2. Google Cloud コンソールで、[設定] ページに移動します。
    [設定] ページに移動
  3. プロジェクトを、サービス プロジェクト管理者として定義する必要のあるサービス アカウントを含むサービス プロジェクトに変更します。
  4. サービス プロジェクトのプロジェクト ID をコピーします。説明をわかりやすくするため、この手順ではサービス プロジェクト ID を SERVICE_PROJECT_ID と示しています。
  5. プロジェクトを共有 VPC ホスト プロジェクトに変更します。
  6. Google Cloud コンソールで [IAM] ページに移動します。
    [IAM] ページに移動
  7. [追加] をクリックします。
  8. [プリンシパル] フィールドに SERVICE_ACCOUNT_NAME@SERVICE_PROJECT_ID.iam.gserviceaccount.com を追加します。SERVICE_ACCOUNT_NAME は、サービス アカウントの名前に置き換えます。
  9. [ロール] メニューから、[Compute Engine] > [Compute ネットワーク ユーザー] を選択します。
  10. [追加] をクリックします。

gcloud

  1. まだ共有 VPC 管理者として gcloud の認証を行っていない場合は、認証を行います。SHARED_VPC_ADMIN は、共有 VPC 管理者の名前に置き換えます。

    gcloud auth login SHARED_VPC_ADMIN
    
  2. サービス プロジェクトのプロジェクト ID が不明な場合、組織内のすべてのプロジェクトを一覧表示すると確認できます。この一覧には、それぞれのプロジェクト ID が示されています。

    gcloud projects list
    
  3. サービス アカウントをサービス プロジェクト管理者にするポリシー バインディングを作成します。HOST_PROJECT_ID は、ホスト プロジェクトのプロジェクト ID に置き換え、SERVICE_ACCOUNT_NAME は、サービス アカウントの名前に置き換え、SERVICE_PROJECT_ID は、サービス プロジェクト ID に置き換えます。

    gcloud projects add-iam-policy-binding HOST_PROJECT_ID \
        --member "serviceAccount:SERVICE_ACCOUNT_NAME@SERVICE_PROJECT_ID.iam.gserviceaccount.com" \
        --role "roles/compute.networkUser"
    

API

  1. 既存のプロジェクト ポリシーの詳細を記述し、記録します。既存のポリシーと etag 値が必要です。

    POST https://cloudresourcemanager.googleapis.com/v2/projects/HOST_PROJECT_ID:getIamPolicy
    

    HOST_PROJECT_ID は、共有 VPC ネットワークを含むホスト プロジェクトの ID に置き換えます。

  2. サービス アカウントをサービス プロジェクト管理者として指定するポリシー バインドを作成します。

    POST https://cloudresourcemanager.googleapis.com/v1/projects/HOST_PROJECT_ID:setIamPolicy
    {
      "bindings": [
        ...copy existing bindings
        {
          "members": [
            "serviceAccount:SERVICE_ACCOUNT_NAME@SERVICE_PROJECT_ID.iam.gserviceaccount.com",
            ...include additional service accounts
          ],
          "role": "roles/compute.networkUser"
        },
      ],
      "etag": "ETAG",
      "version": 1,
      ...other existing policy details
    }
    

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

    • HOST_PROJECT_ID: 共有 VPC ネットワークを含むホスト プロジェクトの ID。
    • SERVICE_ACCOUNT_NAME: サービス アカウントの名前。
    • SERVICE_PROJECT_ID: サービス アカウントを含むサービス プロジェクトの ID。
    • ETAG: 既存のポリシーを記述するときに取得した固有識別子。これにより、複数の更新リクエストが同時に送信された場合の競合を回避します。

    詳細については、projects.setIamPolicy メソッドをご覧ください。

サービス プロジェクト管理者としての Google API サービス アカウント

ここでは、共有 VPC ホスト プロジェクトのすべてのサブネットに対するサービス プロジェクト管理者として、Google API サービス アカウントを定義する方法を説明します。共有 VPC で使用されるマネージド インスタンス グループに対して、Google API サービス アカウントをサービス プロジェクト管理者にする必要があります。インスタンスの作成のようなタスクは、この種のサービス アカウントによって実行されるからです。この関係の詳細については、マネージド インスタンス グループと IAM をご覧ください。

コンソール

  1. 共有 VPC 管理者として Google Cloud コンソールにログインします。
  2. Google Cloud コンソールで、[設定] ページに移動します。
    [設定] ページに移動
  3. プロジェクトを、サービス プロジェクト管理者として定義する必要のあるサービス アカウントを含むサービス プロジェクトに変更します。
  4. サービス プロジェクトの [プロジェクト番号] をコピーします。説明をわかりやすくするため、この手順ではサービス プロジェクト番号を SERVICE_PROJECT_NUMBER と示しています。
  5. プロジェクトを共有 VPC ホスト プロジェクトに変更します。
  6. Google Cloud コンソールで [IAM] ページに移動します。
    [IAM] ページに移動
  7. [追加] をクリックします。
  8. SERVICE_PROJECT_NUMBER@cloudservices.gserviceaccount.com を [メンバー] フィールドに追加します。
  9. [ロール] メニューから、[Compute Engine] > [Compute ネットワーク ユーザー] を選択します。
  10. [追加] をクリックします。

gcloud

  1. まだ共有 VPC 管理者として gcloud の認証を行っていない場合は、認証を行います。SHARED_VPC_ADMIN は、共有 VPC 管理者の名前に置き換えます。

    gcloud auth login SHARED_VPC_ADMIN
    
  2. サービス プロジェクトのプロジェクト番号を確認します。説明をわかりやすくするため、この手順ではサービス プロジェクト番号を SERVICE_PROJECT_NUMBER と示しています。SERVICE_PROJECT_ID は、サービス プロジェクトのプロジェクト ID に置き換えます。

    gcloud projects describe SERVICE_PROJECT_ID --format='get(projectNumber)'
    
    • サービス プロジェクトのプロジェクト ID が不明な場合、組織内のすべてのプロジェクトを一覧表示すると確認できます。このリストには、それぞれのプロジェクト番号が示されています。

      gcloud projects list
      
  3. サービス アカウントをサービス プロジェクト管理者にするポリシー バインディングを作成します。HOST_PROJECT_ID は、ホスト プロジェクトのプロジェクト ID に置き換え、SERVICE_PROJECT_NUMBER は、サービス プロジェクト番号に置き換えます。

    gcloud projects add-iam-policy-binding HOST_PROJECT_ID \
        --member "serviceAccount:SERVICE_PROJECT_NUMBER@cloudservices.gserviceaccount.com" \
        --role "roles/compute.networkUser"
    

API

  1. 既存のプロジェクト ポリシーの詳細を記述し、記録します。既存のポリシーと etag 値が必要です。

    POST https://cloudresourcemanager.googleapis.com/v2/projects/HOST_PROJECT_ID:getIamPolicy
    

    HOST_PROJECT_ID は、共有 VPC ネットワークを含むホスト プロジェクトの ID に置き換えます。

  2. プロジェクトのリストを取得して、プロジェクト番号を探します。

    GET https://cloudresourcemanager.googleapis.com/v1/projects?filter=projectId="SERVICE_PROJECT_ID"
    

    SERVICE_PROJECT_ID は、サービス アカウントが配置されているサービス プロジェクトの ID に置き換えます。

  3. サービス アカウントをサービス プロジェクト管理者として指定するポリシー バインドを作成します。

    POST https://cloudresourcemanager.googleapis.com/v1/projects/HOST_PROJECT_ID:setIamPolicy
    {
      "bindings": [
        ...copy existing bindings
        {
          "members": [
            "serviceAccount:SERVICE_PROJECT_NUMBER@cloudservices.gserviceaccount.com"
          ],
          "role": "roles/compute.networkUser"
        },
      ],
      "etag": "ETAG",
      "version": 1,
      ...other existing policy details
    }
    

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

    • HOST_PROJECT_ID: 共有 VPC ネットワークを含むホスト プロジェクトの ID。
    • SERVICE_PROJECT_NUMBER: サービス アカウントを含むサービス プロジェクトの番号。
    • ETAG: 既存のポリシーを記述するときに取得した固有識別子。これにより、複数の更新リクエストが同時に送信された場合の競合を回避します。

    詳細については、projects.setIamPolicy メソッドをご覧ください。

共有 VPC を使用する

共有 VPC 管理者がホスト プロジェクトの有効化それに対する必要なサービス プロジェクトの接続、ホスト プロジェクト サブネットのすべてまたは一部に対するサービス プロジェクト管理者の定義という各タスクを完了すると、サービス プロジェクト管理者がホスト プロジェクトのサブネットを使用して、サービス プロジェクト内にインスタンス、テンプレート、内部ロードバランサを作成できるようになります。

このセクションのすべてのタスクは、サービス プロジェクト管理者が行う必要があります。

共有 VPC 管理者がサービス プロジェクト管理者に付与できるのは、ホスト プロジェクト全体または一部のサブネットのみに対する Compute ネットワーク ユーザー ロールroles/compute.networkUser)のみです。サービス プロジェクト管理者は、各サービス プロジェクトを管理するために必要なその他のロールも持つ必要があります。たとえば、サービス プロジェクト管理者をプロジェクト所有者にすることも、プロジェクトに対して少なくとも Compute インスタンス管理者ロールroles/compute.instanceAdmin)を持つようにすることもできます。

使用可能なサブネットを一覧表示する

サービス プロジェクト管理者は、次の手順に沿って、自分に権限が付与されているサブネットを一覧表示できます。

コンソール

Google Cloud コンソールで、[共有 VPC] ページに移動します。

共有 VPC に移動

gcloud

  1. まだサービス プロジェクト管理者として gcloud の認証を行っていない場合は、認証を行います。SERVICE_PROJECT_ADMIN は、サービス プロジェクト管理者の名前に置き換えます。

    gcloud auth login SERVICE_PROJECT_ADMIN
    
  2. 次のコマンドを実行します。HOST_PROJECT_ID は、共有 VPC ホスト プロジェクトのプロジェクト ID に置き換えます。

    gcloud compute networks subnets list-usable --project HOST_PROJECT_ID
    

    次の例では、project-1 ホスト プロジェクトで使用可能なサブネットの一覧を取得します。

    $ gcloud compute networks subnets list-usable --project project-1
    
    PROJECT    REGION       NETWORK  SUBNET    RANGE          SECONDARY_RANGES
    project-1  us-west1     net-1    subnet-1  10.138.0.0/20
    project-1  us-central1  net-1    subnet-2  10.128.0.0/20  r-1 192.168.2.0/24
                                                              r-2 192.168.3.0/24
    project-1  us-east1     net-1    subnet-3  10.142.0.0/20
    

詳細については、SDK ドキュメントの list-usable コマンドをご覧ください。

API

ホスト プロジェクトで使用可能なサブネットを一覧で表示します。サービス プロジェクト管理者としてリクエストを行います。

GET https://compute.googleapis.com/compute/v1/projects/HOST_PROJECT_ID/aggregated/subnetworks/listUsable

HOST_PROJECT_ID は、共有 VPC ネットワークを含むホスト プロジェクトの ID に置き換えます。

詳細については、subnetworks.listUsable メソッドをご覧ください。

新しい静的内部 IPv4 または IPv6 アドレスを予約する

サービス プロジェクト管理者は、共有 VPC ネットワークのサブネットに内部 IPv4 または IPv6 アドレスを予約できます。IP アドレス構成オブジェクトはサービス プロジェクト内で作成されますが、その値は選択した共有サブネットで使用可能な IPv4 アドレス範囲から取得されます。

サービス プロジェクトでスタンドアロンの内部 IP アドレスを予約するには、次の手順を完了します。

コンソール

  1. 共有 VPC を設定します
  2. Google Cloud コンソールで、[共有 VPC] ページに移動します。

    共有 VPC に移動

  3. 共有 VPC 管理者としてログインします。

  4. プロジェクト選択ツールからサービス プロジェクトを選択します。

  5. [VPC ネットワーク] > [IP アドレス] の順に選択して、[IP アドレス] ページに移動します。

  6. [内部静的 IP アドレスの予約] をクリックします。

  7. [名前] フィールドに IP アドレス名を入力します。

  8. [IP バージョン] リストで、必要な IP バージョンを選択します。

    • 静的内部 IPv4 アドレスを予約するには、[IPv4] を選択します。
    • 静的内部 IPv6 アドレスを予約するには、[IPv6] を選択します。
  9. [共有ネットワーク] ボタンをクリックします。

  10. [ネットワーク] リストと [サブネットワーク] リストで、VPC ネットワークとサブネットをそれぞれ選択します。

  11. IP アドレスの予約方法を指定します。

    • IPv4 アドレスの場合、予約する静的内部 IPv4 アドレスを指定するには、[静的 IP アドレス] で、[ユーザー指定] を選択し、カスタム IP アドレスを入力します。それ以外の場合、サブネットの静的内部 IPv4 アドレスはシステムによって自動的に割り当てられます。
    • IPv6 アドレスの場合、静的内部 IPv6 アドレスはサブネットの内部 IPv6 アドレス範囲から自動的に割り当てられます。
  12. 省略可: 異なるフロントエンドで静的内部 IPv4 アドレスを共有する場合は、[目的] で [共有] を選択します。デフォルトでは、[共有しない] が選択されています。

  13. [予約] をクリックします。

gcloud

  1. サービス プロジェクト管理者として Google Cloud CLI の認証を行っていない場合は、認証を行います。SERVICE_PROJECT_ADMIN は、サービス プロジェクト管理者の名前に置き換えます。

    gcloud auth login SERVICE_PROJECT_ADMIN
    
  2. compute addresses create コマンドを使用します。

    • IPv4 アドレスを予約します。

      gcloud compute addresses create IP_ADDR_NAME \
          --project SERVICE_PROJECT_ID \
          --subnet projects/HOST_PROJECT_ID/regions/REGION/subnetworks/SUBNET \
          --region=REGION
          --ip-version=IPV4
      
    • IPv6 アドレスを予約します。

      gcloud compute addresses create IP_ADDR_NAME \
          --project SERVICE_PROJECT_ID \
          --subnet projects/HOST_PROJECT_ID/regions/REGION/subnetworks/SUBNET \
          --region=REGION
          --ip-version=IPV6
      

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

    • IP_ADDR_NAME: IPv4 アドレス オブジェクトの名前。
    • SERVICE_PROJECT_ID: サービス プロジェクトの ID。
    • HOST_PROJECT_ID: 共有 VPC ホスト プロジェクトの ID。
    • REGION: 共有サブネットを含むリージョン。
    • SUBNET: 共有サブネットの名前。

IP アドレスの作成の詳細は、SDK のドキュメントに記載されています。

API

addresses.insert メソッドを使用します。

  • サービス プロジェクト管理者として静的内部 IPv4 アドレスを予約します。

    POST https://compute.googleapis.com/compute/v1/projects/SERVICE_PROJECT_ID/regions/REGION/addresses
    {
    "name": "ADDRESS_NAME",
    "subnetwork": "projects/HOST_PROJECT_ID/regions/REGION/subnetworks/SUBNET_NAME",
    "addressType": "INTERNAL"
    }
    

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

  • ADDRESS_NAME: 予約済みの内部 IP アドレスの名前。
  • HOST_PROJECT_ID: 共有 VPC ネットワークを含むプロジェクトの ID。
  • REGION: 予約済み IPv4 アドレスを配置するリージョンと、共有サブネットが存在するリージョン。
  • SERVICE_PROJECT_ID: IPv4 アドレスを予約するサービス プロジェクトの ID。
  • SUBNET_NAME: 共有サブネットの名前。

詳細については、addresses.insert メソッドをご覧ください。

Terraform

Terraform データブロックを使用して、ホスト サブネット情報を指定できます。Terraform リソースを使用して、静的内部 IPv4 アドレスを予約します。オプションの address 引数を省略すると、使用可能な IPv4 アドレスが選択され、予約されます。

ホスト サブネット情報を指定します。

data "google_compute_subnetwork" "subnet" {
  name    = "my-subnet-123"
  project = var.project
  region  = "us-central1"
}

ホスト プロジェクトのサブネットの IPv4 アドレスを予約して、サービス プロジェクトで使用します。

resource "google_compute_address" "internal" {
  project      = var.service_project
  region       = "us-central1"
  name         = "int-ip"
  address_type = "INTERNAL"
  address      = "10.0.0.8"
  subnetwork   = data.google_compute_subnetwork.subnet.self_link
}

Terraform 構成を適用または削除する方法については、基本的な Terraform コマンドをご覧ください。

静的外部 IPv4 アドレスを予約する

サービス プロジェクトのリソースは、サービス プロジェクトまたはホスト プロジェクトで定義されているリージョン静的外部 IPv4 アドレスを使用できます。したがって、接続されたサービス プロジェクトのリソースは、ホスト プロジェクトでリージョンの静的予約済み外部 IPv4 アドレスを使用できます。

静的外部 IPv6 アドレスを予約する

サービス プロジェクト管理者は、サービス プロジェクトで静的外部 IPv6 アドレスを予約できます。IPv6 アドレス構成オブジェクトはサービス プロジェクト内で作成されますが、その値は選択した共有サブネットで使用可能な IPv6 アドレス範囲から取得されます。

コンソール

Google Cloud コンソールを使用して、サービス プロジェクトでスタンドアロンの外部 IPv6 アドレスを予約できます。

  1. 共有 VPC を設定します
  2. Google Cloud コンソールで、[共有 VPC] ページに移動します。
    [共有 VPC] ページに移動
  3. 共有 VPC 管理者としてログインします。
  4. プロジェクト選択ツールからサービス プロジェクトを選択します。
  5. [VPC ネットワーク] > [IP アドレス] の順に選択して、[IP アドレス] ページに移動します。
  6. [静的外部 IP アドレスを予約] をクリックします。
  7. 新しいアドレスの名前を指定します。
  8. ネットワーク サービス ティアがプレミアムスタンダードかを指定します。IPv6 静的アドレス予約は、プレミアム ティアでのみサポートされます。
  9. [IP バージョン] で [IPv6] を選択します。
  10. この IP アドレスがリージョン アドレスかグローバル アドレスかを指定します。
    • グローバル ロードバランサに静的 IP アドレスを予約する場合は、[グローバル] を選択します。
    • インスタンスまたはリージョン ロードバランサ用に静的 IP アドレスを予約する場合は、[リージョン] を選択し、アドレスを作成するリージョンを選択します。
  11. 次のいずれかを選択します。
    • このプロジェクトのネットワーク: IPv6 アドレスを予約する同じ Virtual Private Cloud(VPC)ネットワークのサブネットに外部 IPv6 アドレスを予約する場合は、このオプションを選択します。
    • 共有ネットワーク: 共有 VPC ネットワークのサブネットで外部 IPv6 アドレスを予約する場合は、このオプションを選択します。
  12. 選択した内容に応じて、次のいずれかを選択します。

    • ネットワーク: VPC ネットワーク
    • サブネットワーク: 静的リージョン IPv6 アドレスを割り当てるサブネット
    • エンドポイントのタイプ: [VM インスタンス] または [ネットワーク ロードバランサ] を選択します
  13. (省略可)エンドポイントのタイプとして [VM インスタンス] を選択した場合は、IPv6 アドレスを接続する VM インスタンスを選択します。

  14. [予約] をクリックします。

gcloud

  1. まだサービス プロジェクト管理者として gcloud の認証を行っていない場合は、認証を行います。SERVICE_PROJECT_ADMIN は、サービス プロジェクト管理者の名前に置き換えます。

    gcloud auth login SERVICE_PROJECT_ADMIN
    
  2. gcloud compute addresses create コマンドを実行します。

    gcloud compute addresses create IP_ADDR_NAME \
        --project SERVICE_PROJECT_ID \
        --subnet projects/HOST_PROJECT_ID/regions/REGION/subnetworks/SUBNET \
        --region=REGION \
        --ip-version=IPV6 \
        --endpoint-type=[VM | NETLB]
    

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

    • IP_ADDR_NAME: IPv6 アドレス オブジェクトの名前。
    • SERVICE_PROJECT_ID: サービス プロジェクトの ID。
    • HOST_PROJECT_ID: 共有 VPC ホスト プロジェクトの ID。
    • SUBNET: 共有サブネットの名前。
    • REGION: 共有サブネットを含むリージョン。

API

サービス プロジェクト管理者として静的内部 IPv6 アドレスを予約するには、addresses.insert メソッドを使用します。

POST https://compute.googleapis.com/compute/v1/projects/SERVICE_PROJECT_ID/regions/REGION/addresses
{
  "name": "ADDRESS_NAME",
  "ipVersion": "IPV6",
  "ipv6EndpointType": "VM|LB",
  "networkTier": "PREMIUM",
  "subnetwork": "projects/HOST_PROJECT_ID/regions/REGION/subnetworks/SUBNET_NAME",
  "addressType": "EXTERNAL"
}

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

  • SERVICE_PROJECT_ID: IPv6 アドレスを予約するサービス プロジェクトの ID。
  • REGION: 予約済みの IPv6 アドレスと共有サブネットがあるリージョン。
  • ADDRESS_NAME: 予約済みの静的外部 IPv6 アドレスの名前。
  • HOST_PROJECT_ID: 共有 VPC ネットワークを含むプロジェクトの ID。
  • SUBNET_NAME: 共有サブネットの名前。

インスタンスを作成する

共有 VPC を使用してインスタンスを作成する場合は、次の点に注意してください。

  • インスタンスを作成する標準的なプロセスには、ゾーン、ネットワーク、サブネットの選択が含まれます。選択したサブネットと選択したゾーンの両方が同じリージョン内に存在する必要があります。サービス プロジェクト管理者が共有 VPC ネットワークのサブネットを使用してインスタンスを作成する場合、そのインスタンス用に選択されたゾーンは、選択したサブネットと同じリージョン内に存在する必要があります。

    予約された静的内部 IPv4 アドレスを持つインスタンスを作成する場合、その静的 IPv4 アドレスが作成された時点で、サブネットとリージョンはすでに選択されています。ここでは、静的内部 IPv4 アドレスを持つインスタンスを作成する gcloud の例について説明します。

  • サービス プロジェクト管理者は、権限が付与されているサブネットを使用する場合に限り、インスタンスを作成できます。使用可能なサブネットについては、使用可能なサブネットを一覧表示するをご覧ください。

  • Google Cloud は、共有 VPC ネットワークのサブネットにインスタンスを作成するリクエストを受信すると、リクエストを送信した IAM プリンシパルがその共有サブネットを使用する権限を持っているかどうかを確認します。チェックが失敗した場合、インスタンスは作成されず、Google Cloud は権限エラーを返します。詳しくは、共有 VPC 管理者にお問い合わせください。

  • デュアル スタックのサブネットでインスタンスを作成している場合は、デュアル スタック インスタンスを作成できます。デュアルスタック サブネットは、カスタムモード VPC ネットワークでのみサポートされます。サブネットの IPv6 アクセスタイプによって、VM に割り当てられた IPv6 アドレスが、内部 IPv6 アドレスか外部 IPv6 アドレスかが決まります。

コンソール

  1. 共有 VPC を設定します
  2. Google Cloud コンソールで、[共有 VPC] ページに移動します。

    共有 VPC に移動

  3. 共有 VPC 管理者としてログインします。

  4. プロジェクト選択ツールからサービス プロジェクトを選択します。

  5. [Compute Engine] > [VM インスタンス] > [インスタンスを作成] の順に選択して、[インスタンスの作成] ページに移動します。

  6. インスタンスの名前を指定します。

  7. [リージョン] で、共有サブネットワークを含むリージョンを選択します。

  8. [詳細オプション] で [ネットワーキング] をクリックします。

  9. [ネットワーク インターフェース] で [共有ネットワーク] ラジオボタンをクリックします。

  10. [共有サブネットワーク] リストで、インスタンスを作成するサブネットを選択します。

    • IPv4 アドレスの場合は、任意のシングル スタック サブネットを選択します。
    • IPv6 アドレスの場合は、必要な IPv6 アクセスタイプのデュアルスタック サブネットを選択します。
  11. IP スタックタイプを選択します。

    • IPv4 アドレスの場合は、[IPv4(シングル スタック)] を選択します。
    • IPv6 アドレスの場合は、[IPv4 と IPv6(デュアル スタック)] を選択します。
  12. インスタンスに必要な他のパラメータを指定します。

  13. [作成] をクリックします。

gcloud

  • 共有 VPC ネットワークの共有サブネット内にある内部エフェメラル IPv4 アドレスでインスタンスを作成します。

    gcloud compute instances create INSTANCE_NAME \
        --project SERVICE_PROJECT_ID \
        --subnet projects/HOST_PROJECT_ID/regions/REGION/subnetworks/SUBNET \
        --zone ZONE
    

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

    • INSTANCE_NAME: インスタンスの名前。
    • SERVICE_PROJECT_ID: サービス プロジェクトの ID。
    • HOST_PROJECT_ID: 共有 VPC ホスト プロジェクトの ID。
    • REGION: 共有サブネットを含むリージョン。
    • SUBNET: 共有サブネットの名前。
    • ZONE: 指定されたリージョン内のゾーン。
  • 共有 VPC ネットワーク内の予約済み静的内部 IPv4 アドレスを使用してインスタンスを作成します。

    1. ホスト プロジェクトの使用可能なアドレスの範囲から、サービス プロジェクトの静的内部 IPv4 アドレスを予約します。
    2. インスタンスを作成します。

      gcloud compute instances create INSTANCE_NAME \
          --project SERVICE_PROJECT_ID \
          --private-network-ip IP_ADDR_NAME \
          --zone ZONE \
          --subnet projects/HOST_PROJECT_ID/regions/REGION/subnetworks/SUBNET
      

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

      • INSTANCE_NAME: インスタンスの名前。
      • SERVICE_PROJECT_ID: サービス プロジェクトの ID。
      • IP_ADDR_NAME: 静的 IP アドレスの名前。
      • ZONE: IP_ADDR_NAME と同じリージョン内のゾーン。
      • HOST_PROJECT_ID: 共有 VPC ホスト プロジェクトの ID。
      • REGION: 共有サブネットを含むリージョン。
      • SUBNET: 静的内部 IPv4 アドレスに関連付けられている共有サブネットの名前。
  • エフェメラル内部 IPv4 アドレスとエフェメラル IPv6 アドレスを持つインスタンスを作成します。

    gcloud compute instances create INSTANCE_NAME \
        --project SERVICE_PROJECT_ID \
        --stack-type IPV4_IPV6 \
        --subnet projects/HOST_PROJECT_ID/regions/REGION/subnetworks/SUBNET \
        --zone ZONE
    

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

    • INSTANCE_NAME: インスタンスの名前。
    • SERVICE_PROJECT_ID: サービス プロジェクトの ID。
    • HOST_PROJECT_ID: 共有 VPC ホスト プロジェクトの ID。
    • REGION: 共有サブネットを含むリージョン。
    • SUBNET: 共有サブネットの名前。
    • ZONE: 指定されたリージョン内のゾーン
  • 予約済みの静的外部 IPv6 アドレスを持つインスタンスを作成します。

    gcloud compute instances create INSTANCE_NAME \
        --project SERVICE_PROJECT_ID \
        --stack-type IPV4_IPV6 \
        --subnet projects/HOST_PROJECT_ID/regions/REGION/subnetworks/SUBNET \
        --ipv6-address IPV6_ADDRESS \
        --ipv6-prefix-length=96 \
        --ipv6-network-tier PREMIUM \
        --zone ZONE
    

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

    • INSTANCE_NAME: インスタンスの名前。
    • SERVICE_PROJECT_ID: サービス プロジェクトの ID。
    • HOST_PROJECT_ID: 共有 VPC ホスト プロジェクトの ID。
    • REGION: 共有サブネットを含むリージョン。
    • SUBNET: 共有サブネットの名前。
    • IPV6_ADDRESS: VM に割り当てる IPv6 アドレス。
    • ZONE: 指定されたリージョン内のゾーン

API

  • エフェメラル内部 IPv4 アドレスを持つインスタンスを作成するには、サブネットのみを指定します。

    POST https://compute.googleapis.com/compute/v1/projects/SERVICE_PROJECT_ID/zones/ZONE/instances
    {
      "machineType": "MACHINE_TYPE",
      "name": "INSTANCE_NAME",
      "networkInterfaces": [
        {
          "subnetwork": "projects/HOST_PROJECT_ID/regions/REGION/subnetworks/SUBNET_NAME"
        }
      ],
      "disks": [
        {
          "boot": true,
          "initializeParams": {
            "sourceImage": "SOURCE_IMAGE"
          }
        }
      ]
    }
    

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

    • INSTANCE_NAME: インスタンスの名前。
    • HOST_PROJECT_ID: 共有 VPC ネットワークを含むプロジェクトの ID。
    • MACHINE_TYPE: インスタンスのマシンタイプ。
    • REGION: 共有サブネットを含むリージョン。
    • SERVICE_PROJECT_ID: サービス プロジェクトの ID。
    • SOURCE_IMAGE: インスタンスのイメージ。
    • SUBNET: 共有サブネットの名前。
    • ZONE: 指定されたリージョン内のゾーン

    詳細については、instances.insert メソッドをご覧ください。

  • 予約済み内部 IPv4 アドレスを持つインスタンスを作成するには、サブネットと予約済み IPv4 アドレスの名前を指定します。

    POST https://compute.googleapis.com/compute/v1/projects/SERVICE_PROJECT_ID/zones/ZONE/instances
    {
      "machineType": "MACHINE_TYPE",
      "name": "INSTANCE_NAME",
      "networkInterfaces": [
        {
          "subnetwork": "projects/HOST_PROJECT_ID/regions/REGION/subnetworks/SUBNET_NAME",
          "networkIP": "projects/SERVICE_PROJECT_ID/regions/REGION/addresses/ADDRESS_NAME"
        }
      ],
      "disks": [
        {
          "boot": true,
          "initializeParams": {
            "sourceImage": "SOURCE_IMAGE"
          }
        }
      ]
    }
    

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

    • ADDRESS_NAME: 予約済みの内部 IPv4 アドレスの名前。
    • INSTANCE_NAME: インスタンスの名前。
    • HOST_PROJECT_ID: 共有 VPC ネットワークを含むプロジェクトの ID。
    • MACHINE_TYPE: インスタンスのマシンタイプ。
    • REGION: 共有サブネットを含むリージョン。
    • SERVICE_PROJECT_ID: サービス プロジェクトの ID。
    • SOURCE_IMAGE: インスタンスのイメージ。
    • SUBNET: 共有サブネットの名前。
    • ZONE: 指定されたリージョン内のゾーン

    詳細については、instances.insert メソッドをご覧ください。

  • エフェメラル内部 IPv4 アドレスとエフェメラル IPv6 アドレスを持つインスタンスを作成するには、サブネットとスタックタイプを指定します。

    POST https://compute.googleapis.com/compute/v1/projects/SERVICE_PROJECT_ID/zones/ZONE/instances
    {
      "machineType": "MACHINE_TYPE",
      "name": "INSTANCE_NAME",
      "networkInterfaces": [
        {
          "subnetwork": "projects/HOST_PROJECT_ID/regions/REGION/subnetworks/SUBNET_NAME",
          "stackType": "IPv4_IPv6"
        }
      ],
      "disks": [
        {
          "boot": true,
          "initializeParams": {
            "sourceImage": "SOURCE_IMAGE"
          }
        }
      ]
    }
    

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

    • INSTANCE_NAME: インスタンスの名前。
    • HOST_PROJECT_ID: 共有 VPC ネットワークを含むプロジェクトの ID。
    • MACHINE_TYPE: インスタンスのマシンタイプ。
    • REGION: 共有サブネットを含むリージョン。
    • SERVICE_PROJECT_ID: サービス プロジェクトの ID。
    • SOURCE_IMAGE: インスタンスのイメージ。
    • SUBNET: 共有サブネットの名前。
    • ZONE: 指定されたリージョン内のゾーン

    詳細については、instances.insert メソッドをご覧ください。

Terraform

Terraform データブロックを使用して、ホスト サブネット情報を指定できます。次に、Terraform リソースを使用して、サービス プロジェクトに VM インスタンスを作成します。

ホスト サブネット情報を指定します。

data "google_compute_subnetwork" "subnet" {
  name    = "my-subnet-123"
  project = var.project
  region  = "us-central1"
}

ホスト プロジェクトの共有サブネットのエフェメラル IPv4 アドレスを使用して、サービス プロジェクトに VM インスタンスを作成します。

resource "google_compute_instance" "ephemeral_ip" {
  project      = var.service_project
  zone         = "us-central1-a"
  name         = "my-vm"
  machine_type = "e2-medium"
  boot_disk {
    initialize_params {
      image = "debian-cloud/debian-9"
    }
  }
  network_interface {
    subnetwork = data.google_compute_subnetwork.subnet.self_link
  }
}

ホスト プロジェクトの共有サブネットの予約された静的 IPv4 アドレスを使用して、サービス プロジェクトに VM インスタンスを作成します。

resource "google_compute_instance" "reserved_ip" {
  project      = var.service_project
  zone         = "us-central1-a"
  name         = "reserved-ip-instance"
  machine_type = "e2-medium"
  boot_disk {
    initialize_params {
      image = "debian-cloud/debian-9"
    }
  }
  network_interface {
    subnetwork = data.google_compute_subnetwork.subnet.self_link
    network_ip = google_compute_address.internal.address
  }
}

Terraform 構成を適用または削除する方法については、基本的な Terraform コマンドをご覧ください。

インスタンス テンプレートの作成

共有 VPC を使用してインスタンス テンプレートを作成する場合は、次の点に注意してください。

  • インスタンス テンプレートを作成するプロセスには、ネットワークとサブネットの選択が含まれます。

    • カスタムモードの共有 VPC ネットワークで使用するために作成されたテンプレートで、ネットワークとサブネットの両方を指定する必要があります。

    • 自動モードの共有 VPC ネットワークで使用するために作成されたテンプレートでは、後でサブネットを選択することもできます。このような場合、サブネットは、テンプレートを使用するいずれかのマネージド インスタンス グループと同じリージョンで自動的に選択されます(定義上、自動モードのネットワークはリージョンごとにサブネットを 1 つずつ持ちます)。

  • IAM プリンシパルがインスタンス テンプレートを作成したときに、Google Cloud は、プリンシパルが指定されたサブネットを使用できるかどうかを確認する権限チェックを実行しません。この権限チェックは、テンプレートを使用しているマネージド インスタンス グループがリクエストされるまで延期されます。

  • デュアル スタックのサブネットでテンプレートを作成している場合は、デュアル スタック インスタンスのテンプレートを作成できます。デュアルスタック サブネットは、カスタムモード VPC ネットワークでのみサポートされます。サブネットの IPv6 アクセスタイプによって、VM に割り当てられた IPv6 アドレスが、内部 IPv6 アドレスか外部 IPv6 アドレスかが決まります。

コンソール

  1. 共有 VPC を設定します
  2. Google Cloud コンソールで、[共有 VPC] ページに移動します。
    [共有 VPC] ページに移動
  3. 共有 VPC 管理者としてログインします。
  4. プロジェクト選択ツールからサービス プロジェクトを選択します。
  5. [Compute Engine] > [インスタンス テンプレート] > [インスタンス テンプレートを作成] の順に選択して、[インスタンス テンプレートを作成] ページに移動します。
  6. インスタンス テンプレートの名前を指定します。
  7. [詳細オプション] で [ネットワーキング] をクリックします。
  8. [ネットワーク インターフェース] セクションで、[共有ネットワーク] ラジオボタンをクリックします。
  9. [共有サブネットワーク] リストで、インスタンス テンプレートを作成するサブネットを選択します。
    • IPv4 アドレスの場合は、任意のシングル スタック サブネットを選択します。
    • IPv6 アドレスの場合は、必要な IPv6 アクセスタイプのデュアルスタック サブネットを選択します。
  10. IP スタックタイプを選択します。
    • IPv4 アドレスの場合は、[IPv4(シングル スタック)] を選択します。
    • IPv6 アドレスの場合は、[IPv4 と IPv6(デュアル スタック)] を選択します。
  11. インスタンス テンプレートに必要な他のパラメータを指定します。
  12. [作成] をクリックします。

gcloud

  • 自動モードの共有 VPC ネットワークの自動的に作成されたサブネットで使用するように IPv4-専用インスタンス テンプレートを作成します。

    gcloud compute instance-templates create TEMPLATE_NAME \
        --project SERVICE_PROJECT_ID \
        --network projects/HOST_PROJECT_ID/global/networks/NETWORK
    

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

    • TEMPLATE_NAME: テンプレートの名前。
    • SERVICE_PROJECT_ID: サービス プロジェクトの ID。
    • HOST_PROJECT_ID: 共有 VPC ホスト プロジェクトの ID。
    • NETWORK: 共有 VPC ネットワークの名前。
  • 共有 VPC ネットワーク(自動モードまたはカスタムモードのいずれか)で、手動で作成されたサブネット用に IPv4 専用インスタンス テンプレートを作成するには:

    gcloud compute instance-templates create TEMPLATE_NAME \
        --project SERVICE_PROJECT_ID \
        --region REGION \
        --subnet projects/HOST_PROJECT_ID/regions/REGION/subnetworks/SUBNET
    

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

    • TEMPLATE_NAME: テンプレートの名前。
    • SERVICE_PROJECT_ID: サービス プロジェクトの ID。
    • HOST_PROJECT_ID: 共有 VPC ホスト プロジェクトの ID。
    • REGION: 共有サブネットを含むリージョン。
    • SUBNET: 共有サブネットの名前。
  • カスタムモードの共有 VPC ネットワークのサブネットを使用するデュアル スタック インスタンス テンプレートを作成します。

    gcloud compute instance-templates create TEMPLATE_NAME \
        --project SERVICE_PROJECT_ID \
        --stack-type IPV4_IPV6 \
        --region REGION \
        --subnet projects/HOST_PROJECT_ID/regions/REGION/subnetworks/SUBNET
    

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

    • TEMPLATE_NAME: テンプレートの名前。
    • SERVICE_PROJECT_ID: サービス プロジェクトの ID。
    • HOST_PROJECT_ID: 共有 VPC ホスト プロジェクトの ID。
    • REGION: 共有サブネットを含むリージョン。
    • SUBNET: 共有サブネットの名前。

API

  • 自動モードの共有 VPC ネットワークで自動生成のサブネットを使用する IPv4 専用インスタンス テンプレートを作成するには、VPC ネットワークを指定します。

    POST https://compute.googleapis.com/compute/v1/projects/SERVICE_PROJECT_ID/global/instanceTemplates
    {
    "properties": {
      "networkInterfaces": [
        {
          "network": "projects/HOST_PROJECT_ID/global/networks/NETWORK"
        }
      ]
    ...
    }
    

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

    • HOST_PROJECT_ID: 共有 VPC ネットワークを含むプロジェクトの ID。
    • SERVICE_PROJECT_ID: サービス プロジェクトの ID。
    • NETWORK: 共有 VPC ネットワークの名前。

    詳細については、instanceTemplates.insert メソッドをご覧ください。

  • 共有 VPC ネットワーク(自動モードまたはカスタムモード)で手動で作成したサブネットを使用する IPv4 専用インスタンス テンプレートを作成するには、サブネットを指定します。

    POST https://compute.googleapis.com/compute/v1/projects/SERVICE_PROJECT_ID/global/instanceTemplates
    {
    "properties": {
      "networkInterfaces": [
        {
          "subnetwork": "projects/HOST_PROJECT_ID/regions/REGION/subnetworks/SUBNET_NAME"
        }
      ]
    ...
    }
    

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

    • HOST_PROJECT_ID: 共有 VPC ネットワークを含むプロジェクトの ID。
    • REGION: 共有サブネットを含むリージョン。
    • SERVICE_PROJECT_ID: サービス プロジェクトの ID。
    • SUBNET_NAME: 共有サブネットの名前。

    詳細については、instanceTemplates.insert メソッドをご覧ください。

  • カスタムモードの共有 VPC ネットワークのサブネットを使用するデュアル スタック インスタンス テンプレートを作成するには、サブネットとスタックの種類を指定します。

    POST https://compute.googleapis.com/compute/v1/projects/SERVICE_PROJECT_ID/global/instanceTemplates
    {
    "properties": {
      "networkInterfaces": [
        {
          "subnetwork": "projects/HOST_PROJECT_ID/regions/REGION/subnetworks/SUBNET_NAME",
          "stackType": "IPV4_IPV6"
        }
      ]
    ...
    }
    

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

    • HOST_PROJECT_ID: 共有 VPC ネットワークを含むプロジェクトの ID。
    • REGION: 共有サブネットを含むリージョン。
    • SERVICE_PROJECT_ID: サービス プロジェクトの ID。
    • SUBNET_NAME: 共有サブネットの名前。

    詳細については、instanceTemplates.insert メソッドをご覧ください。

Terraform

Terraform データブロックを使用して、ホスト サブネット情報を指定できます。次に、Terraform リソースを使用して VM インスタンス テンプレートを作成します。VM の IPv4 アドレスは、ホスト プロジェクトの共有サブネットから取得されます。

サブネットは、VM インスタンスが作成されるリージョンと同じリージョンに存在する必要があります。

ホスト サブネット情報を指定します。

data "google_compute_subnetwork" "subnet" {
  name    = "my-subnet-123"
  project = var.project
  region  = "us-central1"
}

サービス プロジェクトに VM インスタンス テンプレートを作成します。

resource "google_compute_instance_template" "default" {
  project      = var.service_project
  name         = "appserver-template"
  description  = "This template is used to create app server instances."
  machine_type = "n1-standard-1"
  disk {
    source_image = "debian-cloud/debian-9"
  }
  network_interface {
    subnetwork = data.google_compute_subnetwork.subnet.self_link
  }
}

Terraform 構成を適用または削除する方法については、基本的な Terraform コマンドをご覧ください。

マネージド インスタンス グループを作成する

共有 VPC を使用してマネージド インスタンス グループを作成するときは、次の点に注意してください。

  • 共有 VPC で使用されるマネージド インスタンス グループでは、Google API サービス アカウントをサービス プロジェクト管理者にする必要があります。これは、自動スケーリングを使用した自動インスタンス作成のようなタスクが、そのサービス アカウントによって行われるためです。

  • マネージド インスタンス グループを作成する標準的なプロセスには、グループの種類とインスタンス テンプレートに応じた、ゾーンやリージョンの選択が含まれます(ネットワークとサブネットの詳細は、インスタンス テンプレートに関連付けられています)。適格なインスタンス テンプレートは、マネージド インスタンス グループによって使用されているリージョンと同じリージョン内のサブネットを参照しているテンプレートに限定されます。

  • サービス プロジェクト管理者が作成できるのは、権限が付与されているサブネットをメンバー インスタンスが使用するマネージド インスタンス グループのみです。ネットワークとサブネットの詳細はインスタンス テンプレートに関連付けられているため、サービス プロジェクト管理者が使用できるのは、使用が許可されているサブネットを参照しているテンプレートのみです。

  • Google Cloud は、マネージド インスタンス グループの作成リクエストを受信すると、リクエストを送信した IAM プリンシパルがインスタンス テンプレートで指定されたサブネット(グループと同じリージョン)で使用する権限を持っているかどうかを確認します。チェックが失敗した場合、マネージド インスタンス グループは作成されず、Google Cloud はエラー Required 'compute.subnetworks.use' permission for 'projects/SUBNET_NAME を返します。

    使用可能なサブネットを一覧表示して使用可能なサブネットをチェックし、サービス アカウントへの追加のアクセス権が必要であれば、共有 VPC 管理者に連絡してください。詳細については、サービス プロジェクト管理者としてのサービス アカウントをご覧ください。

詳細については、Compute Engine のドキュメントでマネージド インスタンスのグループを作成するをご覧ください。

HTTP(S) ロードバランサを作成する

共有 VPC ネットワーク内で外部アプリケーション ロードバランサを構成する方法は数多くあります。デプロイの種類に関係なく、ロードバランサのすべてのコンポーネントを同じ組織と同じ共有 VPC ネットワークに配置する必要があります。

サポートされている共有 VPC アーキテクチャの詳細については、以下をご覧ください。

内部パススルー ネットワーク ロードバランサを作成する

次の例では、共有 VPC ネットワークで内部パススルー ネットワーク ロードバランサを作成する際の考慮事項について説明します。サービス プロジェクト管理者は、ホスト プロジェクトでアクセス権のあるサブネットを使用する内部パススルー ネットワーク ロードバランサを作成できます。ロードバランサの内部転送ルールはサービス プロジェクトで定義されますが、サブネット参照はホスト プロジェクトの共有 VPC ネットワーク内のサブネットを参照します。

共有 VPC 環境で内部パススルー ネットワーク ロードバランサを作成する前に、共有 VPC アーキテクチャをご覧ください。

コンソール

  1. Google Cloud コンソールの [ロード バランシング] ページに移動します。
    [ロード バランシング] ページに移動

  2. 内部 TCP / UDP ロードバランサを作成して、次の調整を行います。[フロントエンド サービスの構成] セクションに移動し、[サブネット] メニューの [他のプロジェクトで共有されるネットワーク] セクションから必要な共有 VPC サブネットを選択します。

  3. ロードバランサの作成を完了します。

gcloud

内部転送ルールを作成する場合は、--subnet フラグを使用してホスト プロジェクトのサブネットを指定します。

gcloud compute forwarding-rules create FR_NAME \
    --project SERVICE_PROJECT_ID \
    --load-balancing-scheme internal \
    --region REGION \
    --ip-protocol IP_PROTOCOL \
    --ports PORT,PORT,... \
    --backend-service BACKEND_SERVICE_NAME \
    --subnet projects/HOST_PROJECT_ID/regions/REGION/subnetworks/SUBNET \
    --address INTERNAL_IP

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

  • FR_NAME: 転送ルールの名前。
  • SERVICE_PROJECT_ID: サービス プロジェクトの ID。
  • REGION: 共有サブネットを含むリージョン。
  • IP_PROTOCOL: TCP または UDP のいずれか。ロードバランサのバックエンド サービスのプロトコルに合わせて指定します。
  • PORT: ロードバランサの数値ポートまたはポートのリスト。
  • BACKEND_SERVICE_NAME: バックエンド サービスの名前(内部パススルー ネットワーク ロードバランサの作成の一般的な手順で作成済み)。
  • HOST_PROJECT_ID: 共有 VPC ホスト プロジェクトの ID。
  • SUBNET: 共有サブネットの名前。
  • INTERNAL_IP: 共有サブネット内の内部 IP アドレス(指定しなかった場合、使用可能なアドレスが選択されます)。

その他のオプションについては、gcloud compute forwarding-rules create コマンドをご覧ください。

API

内部転送ルールを作成し、ホスト プロジェクトのサブネットを指定します。

POST https://compute.googleapis.com/compute/v1/projects/SERVICE_PROJECT_ID/regions/REGION/forwardingRules
{
  "name": "FR_NAME",
  "IPAddress": "IP_ADDRESS",
  "IPProtocol": "PROTOCOL",
  "ports": [ "PORT", ... ],
  "loadBalancingScheme": "INTERNAL",
  "subnetwork": "https://www.googleapis.com/compute/v1/projects/HOST_PROJECT_ID/regions/REGION/subnetworks/SUBNET",
  "network": "https://www.googleapis.com/compute/v1/projects/HOST_PROJECT_ID/global/networks/NETWORK_NAME",
  "backendService": "https://www.googleapis.com/compute/v1/projects/SERVICE_PROJECT_ID/regions/us-west1/backendServices/BE_NAME",
  "networkTier": "PREMIUM"
}

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

  • BE_NAME: バックエンド サービスの名前(内部パススルー ネットワーク ロードバランサの作成の一般的な手順で作成済み)。
  • FR_NAME: 転送ルールの名前。
  • HOST_PROJECT_ID: 共有 VPC ホスト プロジェクトの ID。
  • IP_ADDRESS: 共有サブネットの内部 IP アドレス。
  • IP_PROTOCOL: TCP または UDP のいずれか。ロードバランサのバックエンド サービスのプロトコルに合わせて指定します。
  • PORT: ロードバランサの数値ポートまたはポートのリスト。
  • REGION: 共有サブネットを含むリージョン。
  • SERVICE_PROJECT_ID: サービス プロジェクトの ID。
  • SUBNET: 共有サブネットの名前。

詳細については、forwardingRules.insert メソッドをご覧ください。

Terraform

Terraform データブロックを使用して、ホスト サブネットホスト ネットワークを指定できます。次に、Terraform リソースを使用して転送ルールを作成します。

ホスト ネットワークを指定します。

data "google_compute_network" "network" {
  name    = "my-network-123"
  project = var.project
}

ホスト サブネット情報を指定します。

data "google_compute_subnetwork" "subnet" {
  name    = "my-subnet-123"
  project = var.project
  region  = "us-central1"
}

サービス プロジェクトで、ホスト プロジェクトのネットワークとサブネットに転送ルールを作成します。

resource "google_compute_forwarding_rule" "default" {
  project               = var.service_project
  name                  = "l4-ilb-forwarding-rule"
  backend_service       = google_compute_region_backend_service.default.id
  region                = "europe-west1"
  ip_protocol           = "TCP"
  load_balancing_scheme = "INTERNAL"
  all_ports             = true
  allow_global_access   = true
  network               = data.google_compute_network.network.self_link
  subnetwork            = data.google_compute_subnetwork.subnet.self_link
}

Terraform 構成を適用または削除する方法については、基本的な Terraform コマンドをご覧ください。

次のステップ