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

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

共有 VPC では、任意のスタックタイプのサブネットをエクスポートできます。

サービス プロジェクトの接続解除または共有 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 管理者アカウントの認証情報を保護できます。それ以外の場合、この手順をスキップして、すべてのサブネットまたは