エンドポイントから Google API にアクセスする

このドキュメントでは、Private Service Connect エンドポイントを使用して Google API に接続する方法について説明します。storage.googleapis.com などのサービス エンドポイント用に一般公開されている IP アドレスに送信するのではなく、エンドポイントの内部 IP アドレスに API リクエストを送信できます。

また、Private Service Connect を使用して別の VPC ネットワーク内のサービスにアクセスし、サービスを公開することもできます。

ロール

このガイドのタスクを行うには、次の IAM ロールが必要です。

タスク ロール
エンドポイントを作成する 以下のすべてのロール:
Compute ネットワーク管理者roles/compute.networkAdmin)、
Service Directory 編集者roles/servicedirectory.editor)、
DNS 管理者roles/dns.admin
限定公開の Google アクセスの構成(省略可) Compute ネットワーク管理者roles/compute.networkAdmin

始める前に

  • DNS の構成や制限事項などの詳細については、エンドポイントを使用した Google API への接続についてをご覧ください。

  • Private Service Connect では、API は自動的に有効になりません。Google Cloud Console の [API とサービス] ページで、使用する Google API を有効にする必要があります。

  • プロジェクトで Compute Engine API有効にする必要があります。

  • プロジェクトで Service Directory API有効にする必要があります。

  • プロジェクトで Cloud DNS API有効にする必要があります。

  • エンドポイントに使用する IP アドレスを選択する必要があります。使用できる IP アドレスについては、IP アドレスの要件をご覧ください。

  • 下り(外向き)ファイアウォール ルールで、エンドポイントへのトラフィックを許可する必要があります。VPC ネットワークのデフォルトのファイアウォール構成には暗黙の下り(外向き)許可ルールが含まれ、このトラフィックが許可されます。トラフィックをブロックする優先度の高い下り(外向き)ルールがないことを確認します。

  • プライベート IP アドレスのない仮想マシン(VM)は、エンドポイントを使用して Google API やサービスにアクセスするために、限定公開の Google アクセスが有効なサブネットを使用する必要があります。

    外部 IP アドレスを持つ VM は、そのサブネットで限定公開の Google アクセスが無効になっていても、エンドポイントを使用して Google API とサービスにアクセスできます。エンドポイントへの接続は Google のネットワーク内にとどまります。

  • VPC ネットワークにエンドポイントが含まれていない場合は、p.googleapis.com に Cloud DNS 限定公開ゾーンが存在するかどうかを確認します。ゾーンが存在する場合は、エンドポイントを作成する前にゾーンを削除します。これを削除しないと、Private Service Connect に使用される Service Directory の DNS ゾーンの作成は失敗します。詳細については、トラブルシューティングをご覧ください。

  • エンドポイントは、ピアリングされた VPC ネットワークからアクセスできません。

サブネットで限定公開の Google アクセスを有効にする

プライベート IP アドレスのない VM は、エンドポイントを使用して Google API やサービスにアクセスするために、限定公開の Google アクセスが有効なサブネットに接続する必要があります。

VM に複数のインターフェースがある場合、デフォルト ルート(通常は nic0)で構成されたインターフェースを接続します。

VM から送信されたパケットの送信元 IP アドレスは、VM インターフェースのプライマリ内部 IPv4 アドレスまたはエイリアス IP 範囲の内部 IPv4 アドレスと一致している必要があります。

サブネットで限定公開の Google アクセスを有効にする方法は次のとおりです。

コンソール

  1. Google Cloud コンソールの [VPC ネットワーク] ページに移動します。

    [VPC ネットワーク] に移動

  2. 限定公開の Google アクセスを有効にするサブネットが含まれるネットワークの名前をクリックします。

  3. サブネットの名前をクリックします。[サブネットの詳細] ページが表示されます。

  4. [編集] をクリックします。

  5. [限定公開の Google アクセス] セクションで、[オン] を選択します。

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

gcloud

  1. サブネットの名前とリージョンを特定します。次のコマンドで特定のネットワークのサブネットを一覧表示します。

    gcloud compute networks subnets list --filter=NETWORK_NAME
    
  2. 次のコマンドを実行して、限定公開の Google アクセスを有効にします。

    gcloud compute networks subnets update SUBNET_NAME \
    --region=REGION \
    --enable-private-ip-google-access
    
  3. 次のコマンドで、限定公開の Google アクセスが有効になっていることを確認します。

    gcloud compute networks subnets describe SUBNET_NAME \
    --region=REGION \
    --format="get(privateIpGoogleAccess)"
    

以下を置き換えます。

  • SUBNET_NAME: サブネットの名前
  • REGION: サブネットのリージョン
  • NETWORK_NAME: サブネットを含む VPC ネットワークの名前

Terraform

Terraform リソースを使用して、サブネットで限定公開の Google アクセスを有効にできます。

resource "google_compute_network" "network" {
  project                 = var.project # Replace this with your project ID in quotes
  name                    = "tf-test"
  auto_create_subnetworks = false
}

resource "google_compute_subnetwork" "vpc_subnetwork" {
  project                  = google_compute_network.network.project
  name                     = "test-subnetwork"
  ip_cidr_range            = "10.2.0.0/16"
  region                   = "us-central1"
  network                  = google_compute_network.network.id
  private_ip_google_access = true
}

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

エンドポイントを作成する

要件を満たす IP アドレスを選択したら、エンドポイントを作成できます。

エンドポイントは、グローバル転送ルールを使用して Google API とサービスに接続します。各転送ルールは、Private Service Connect の VPC ネットワークごとの割り当てにカウントされます。

Google API とサービスのエンドポイントは、作成後に更新できません。Google API とサービスのエンドポイントを更新する必要がある場合は、エンドポイントを削除してから新しいエンドポイントを作成します。

コンソール

  1. Google Cloud コンソールで [Private Service Connect] ページに移動します。

    [Private Service Connect] に移動

  2. [接続エンドポイント] タブをクリックします。

  3. [エンドポイントを接続] をクリックします。

  4. [対象] で、使用する対象 API バンドルを選択します。

    • すべての Google API
    • VPC-SC
  5. [エンドポイント名] にエンドポイントの名前を入力します。

  6. エンドポイントのネットワークを選択します。

  7. エンドポイントの IP アドレスを選択します。

    IP アドレスが所定の要件を満たしている必要があります。

    新しい IP アドレスが必要な場合は、次のように作成します。

    1. [IP アドレスを作成] をクリックします。
    2. IP アドレスの名前説明を入力します。
    3. 使用する IP アドレスを入力し、[保存] をクリックします。
  8. この VPC ネットワークで Service Directory リージョンがまだ構成されていない場合は、使用するリージョンを選択します。

    特定の VPC ネットワークで Google API とサービスへのアクセスに使用されるすべてのエンドポイントは同じ Service Directory リージョンを使用します。

  9. この VPC ネットワークに対して Service Directory の名前空間がまだ構成されていない場合は、使用する名前空間を構成します。

    • 自動的に割り当てられた名前空間を使用するには、[名前空間] プルダウン メニューをクリックして、自動的に割り当てられた名前空間を選択します。

    • 別のネットワークで使用されている既存の名前空間を選択するには、[名前空間] プルダウン メニューをクリックして、リストから名前空間を選択します。このリストには、プロジェクト内のすべての名前空間が表示されます。Google API へのアクセスに使用されるエンドポイントにのみ使用される名前空間を選択する必要があります。

    • 新しい名前空間を作成するには、[名前空間] プルダウン メニューをクリックして、[名前空間の作成] をクリックします。名前空間を入力し、[作成] をクリックします。

    特定の VPC ネットワークで Google API とサービスへのアクセスに使用するすべてのエンドポイントは同じ Service Directory 名前空間を使用します。

  10. [エンドポイントを追加] をクリックします。

gcloud

  1. エンドポイントに割り振るグローバル内部 IP アドレスを予約します。

    gcloud compute addresses create ADDRESS_NAME \
      --global \
      --purpose=PRIVATE_SERVICE_CONNECT \
      --addresses=ENDPOINT_IP \
      --network=NETWORK_NAME
    

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

    • ADDRESS_NAME: 予約済みの IP アドレスに割り当てる名前。

    • ENDPOINT_IP: エンドポイントに予約する IP アドレス。

      IP アドレスが所定の要件を満たしている必要があります。

    • NETWORK_NAME: エンドポイントの VPC ネットワークの名前。

  2. エンドポイントを Google API およびサービスに接続する転送ルールを作成します。

    gcloud compute forwarding-rules create ENDPOINT_NAME \
      --global \
      --network=NETWORK_NAME \
      --address=ADDRESS_NAME \
      --target-google-apis-bundle=API_BUNDLE \
      [ --service-directory-registration=REGION_NAMESPACE_URI ]
    

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

    • ENDPOINT_NAME: エンドポイントに割り当てる名前。名前は 1~20 文字にし、小文字と数字のみを使用する必要があります。名前の先頭は文字にしてください。

    • NETWORK_NAME: エンドポイントの VPC ネットワークの名前。

    • ADDRESS_NAME: 関連付けられたネットワークに予約されたアドレスの名前。

    • API_BUNDLE: エンドポイントで使用できる API のバンドル。サポートされている API のリストをご覧ください。

      • all-apis を使用して、サポートされているすべての API へのアクセスを許可します。

      • vpc-sc を使用して、VPC Service Controls をサポートする Google API へのアクセスを制限します。

    • REGION_NAMESPACE_URI: 使用する Service Directory のリージョンまたは名前空間の URI。この URI は、エンドポイントを作成するプロジェクトを参照する必要があります。

      • リージョンは projects/PROJECT_NAME/locations/REGION でのみ定義できます。

      • projects/PROJECT_NAME/locations/REGION/namespaces/NAMESPACE を使用してリージョンと名前空間を定義できます。

      --service-directory-registration を完全に省略するか、名前空間のないリージョンを設定すると、次のようになります。

      • この VPC ネットワークにリージョンまたは名前空間がすでに構成されている場合は、これらのデフォルトが使用されます。

      • リージョンが構成されていない場合、リージョンは us-central1 に設定されます。名前空間が構成されていない場合、システム生成の名前空間が割り当てられます。

API

  1. エンドポイントに割り振るグローバル内部 IP アドレスを予約します。

    POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/global/addresses
    
    {
    "name": ADDRESS_NAME,
    "address": ENDPOINT_IP,
    "addressType": "INTERNAL",
    "purpose": PRIVATE_SERVICE_CONNECT,
    "network": NETWORK_URL
    }
    

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

    • PROJECT_ID: プロジェクト ID。

    • ADDRESS_NAME: 予約済みの IP アドレスに割り当てる名前。

    • ENDPOINT_IP: エンドポイントに予約する IP アドレス。

      IP アドレスが所定の要件を満たしている必要があります。

    • NETWORK_URL: エンドポイントの VPC ネットワーク。network.list メソッドまたは gcloud compute networks list --uri を使用して、ネットワークの URL を検索します。

  2. エンドポイントを Google API およびサービスに接続する転送ルールを作成します。

    POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/global/forwardingRules
    {
     "IPAddress": ADDRESS_URL,
     "network": NETWORK_URL,
     "name": ENDPOINT_NAME,
     "target": API_BUNDLE,
     "serviceDirectoryRegistrations : [
       {
         "service_directory_region": REGION,
         "namespace": "NAMESPACE"
    
       }
     ],
    }
    

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

    • PROJECT_ID: プロジェクト ID。

    • ENDPOINT_NAME: エンドポイントに割り当てる名前。名前は 1~20 文字にし、小文字と数字のみを使用する必要があります。名前の先頭は文字にしてください。

    • NETWORK_URL: エンドポイントの VPC ネットワーク。network.list メソッドまたは gcloud compute networks list --uri を使用して、ネットワークの URL を検索します。

    • ADDRESS_URL: 関連付けられたネットワークに予約されたアドレスの URL。globalAddresses.list メソッドまたは gcloud compute addresses list --uri を使用して、予約されたアドレスの URL を検索します。

    • API_BUNDLE: エンドポイントで使用できる API のバンドル。サポートされている API のリストをご覧ください。

      • all-apis を使用して、サポートされているすべての API へのアクセスを許可します。

      • vpc-sc を使用して、VPC Service Controls をサポートする Google API へのアクセスを制限します。

    • REGION: 使用する Service Directory リージョン。例: us-central1REGION を省略し、この VPC ネットワークにリージョンがすでに構成されている場合、そのリージョンが使用されます。リージョンが構成されていない場合、リージョンは us-central1 に設定されます。

    • NAMESPACE: 使用する Service Directory の名前空間の名前。NAMESPACE を省略し、この VPC ネットワークに名前空間がすでに構成されている場合、その名前空間が使用されます。名前空間が構成されていない場合、システム生成の名前空間が割り当てられます。

Terraform

次の Terraform リソースを使用して、エンドポイントを作成できます。

resource "google_compute_global_address" "default" {
  project      = google_compute_network.network.project
  name         = "global-psconnect-ip"
  address_type = "INTERNAL"
  purpose      = "PRIVATE_SERVICE_CONNECT"
  network      = google_compute_network.network.id
  address      = "10.3.0.5"
}
resource "google_compute_global_forwarding_rule" "default" {
  project               = google_compute_network.network.project
  name                  = "globalrule"
  target                = "all-apis"
  network               = google_compute_network.network.id
  ip_address            = google_compute_global_address.default.id
  load_balancing_scheme = ""
}

エンドポイントが機能していることを確認する

Private Service Connect が構成されている VPC ネットワークに VM インスタンスを作成します。VM で次のコマンドを実行して、Private Service Connect エンドポイントが機能していることを確認します。エンドポイントは ping(ICMP)リクエストに応答しません。

curl -v ENDPOINT_IP/generate_204

ENDPOINT_IP は、エンドポイントの IP アドレスに置き換えます。

エンドポイントが機能している場合は、HTTP 204 レスポンス コードが表示されます。

エンドポイントを一覧表示する

構成したエンドポイントの一覧を取得できます。

Console

  1. Google Cloud コンソールで [Private Service Connect] ページに移動します。

    [Private Service Connect] に移動

  2. [接続エンドポイント] タブをクリックします。

    エンドポイントが表示されます。

gcloud

gcloud compute forwarding-rules list  \
--filter target="(all-apis OR vpc-sc)" --global

出力は次のようになります。

NAME  REGION  IP_ADDRESS  IP_PROTOCOL  TARGET
RULE          IP          TCP          all-apis

エンドポイントに関する情報を取得する

エンドポイントのすべての構成の詳細を表示できます。

コンソール

  1. Google Cloud コンソールで [Private Service Connect] ページに移動します。

    [Private Service Connect] に移動

  2. [接続エンドポイント] タブをクリックします。

    エンドポイントが表示されます。

  3. 詳細を表示するエンドポイントをクリックします。

gcloud

gcloud compute forwarding-rules describe \
    ENDPOINT_NAME --global

エンドポイントにラベルを付ける

エンドポイントのラベルを管理できます。詳細については、リソースのラベル付けをご覧ください。

エンドポイントを削除する

エンドポイントを削除できます。

コンソール

  1. Google Cloud コンソールで [Private Service Connect] ページに移動します。

    [Private Service Connect] に移動

  2. [接続エンドポイント] タブをクリックします。

  3. 削除するエンドポイントを選択し、[削除] をクリックします。

gcloud

    gcloud compute forwarding-rules delete \
        ENDPOINT_NAME --global

ENDPOINT_NAME は、削除する VM の名前に置き換えます。

エンドポイントを使用する

エンドポイントを使用するには、エンドポイントの IP アドレスに解決される DNS ホスト名にリクエストを送信します。

  • カスタム エンドポイントを使用するようにクライアントを構成し、使用する API とサービスに p.googleapis.com DNS レコードが作成されている場合、自動的に作成される p.googleapis.com DNS 名を使用できます。詳細については、p.googleapis.com DNS 名の使用をご覧ください。

    たとえば、エンドポイント名が xyz の場合、API バンドルに storage-xyz.p.googleapis.comcompute-xyz.p.googleapis.com、その他の一般的に使用される API の DNS レコードが作成されます。

  • カスタム エンドポイントを使用するように構成されていないクライアントを使用している場合、または使用するサービスに p.googleapis.com DNS レコードが存在しない場合は、デフォルトの DNS 名を使用して DNS レコードを作成できます。詳細については、デフォルトの DNS 名を使用して DNS レコードを作成するをご覧ください。

    たとえば、storage.googleapis.comcompute.googleapis.com の DNS レコードを作成します。

p.googleapis.com DNS 名を使用する

エンドポイントを作成すると、そのエンドポイントを使用して利用可能な一般的に使用されている API とサービスの DNS レコードが Service Directory によって作成されます。DNS レコードは、末尾が googleapis.com のデフォルトの DNS 名を有する API とサービスと、それらの API とサービスのサブセットに対してのみ作成されます。

DNS レコードは p.googleapis.com 限定公開ゾーンに作成されます。レコードはエンドポイント IP アドレスを指し、SERVICE-ENDPOINT.p.googleapis.com の形式を使用します。

たとえば、エンドポイント名が xyz の場合、storage-xyz.p.googleapis.comcompute-xyz.p.googleapis.com と、他のサポートされている API の DNS レコードが作成されます。

カスタム エンドポイントを使用するように構成できるクライアントは、p.googleapis.com DNS 名を使用してエンドポイントにリクエストを送信できます。

カスタム エンドポイントを使用するように構成する方法については、クライアントまたはクライアント ライブラリのドキュメントをご覧ください。次に例を示します。

  • Python: Client optionsapi_endpoint を構成できます。

  • Go: ClientOptionsWithEndpoint を構成できます。

  • .NET: クライアントのビルダークラスで Endpoint を構成できます。

  • gcloud: gcloud CLIapi_endpoint_overrides を構成できます。

デフォルトの DNS 名を使用して DNS レコードを作成する

次の状況では、API とサービスのデフォルトの DNS 名をエンドポイントに転送するために DNS レコードを作成する必要があります。

  • クライアントまたはアプリケーションが p.googleapis.com DNS 名を使用するように構成することができない。

  • サポートされているサービスにアクセスする必要があるが、そのサービス用に自動的に作成される p.googleapis.com DNS 名がない。

Private Service Connect エンドポイントを指定する DNS レコードを作成する手順は次のとおりです。

  1. 使用するドメインの DNS ゾーンを作成します(例: googleapis.comgcr.io)。そのためには、Cloud DNS 限定公開ゾーンの作成を検討してください。

  2. この DNS ゾーンで次のことを行います。

    1. ドメイン(ゾーン)名自体の A レコード(例: googleapis.comgcr.io)を作成します。この A レコードがエンドポイントの IP アドレスを指すようにします。Cloud DNS を使用している場合は、レコードの追加をご覧ください。

    2. アスタリスクとドットに続くドメイン(ゾーン)名を使用して、可能性のあるすべての追加ドメインのホスト名に対する CNAME レコードを作成します(例: *.googleapis.com*.gcr.io)。この CNAME レコードが、同じゾーンの A レコードを指すようにします。たとえば、*.googleapis.comgoogleapis.com を指し、*.gcr.iogcr.io を指します。

オンプレミス ホストからエンドポイントにアクセスする

オンプレミス ネットワークが VPC ネットワークに接続されている場合、Private Service Connect でエンドポイントの内部 IP アドレスを使用して、オンプレミス ホストから Google API とサービスにアクセスできます。

  • オンプレミス ネットワークは、Cloud VPN トンネルまたは Cloud Interconnect の VLAN アタッチメントを使用して VPC ネットワークに接続されている必要があります。

  • エンドポイントは、オンプレミス ネットワークに接続されている VPC ネットワークに存在しなければなりません。

  • オンプレミス ネットワークには、エンドポイントに向かう適切なルートが必要です。Cloud VPN トンネルまたは VLAN アタッチメントのルートを管理する BGP セッションでエンドポイントへのルートを通知するように、Cloud Router のカスタムルート アドバタイズを構成します。

    • オンプレミス ネットワークで等価コスト マルチパス(ECMP)ルーティングを使用して Private Service Connect エンドポイントにトラフィックを分散する場合は、単一の TCP 接続のすべてのパケットが同じ Cloud VPN トンネルまたは VLAN アタッチメントを介して転送されるようにする必要があります。確立済みの TCP 接続のパケットが複数のパスに転送されると、TCP リセット(RST)が断続的に発生することがあります。リセットを防ぐには、ネクストホップの宛先の一貫性を維持するようにオンプレミス ピアルーターを構成します。
  • 限定公開 DNS ゾーンにクエリを実行できるように、オンプレミス システムを構成する必要があります。

    Cloud DNS を使用して限定公開 DNS ゾーンを実装している場合は、次の手順を行います。

トラブルシューティング

以下のセクションでは、Google API へのアクセスに使用される Private Service Connect エンドポイントに関する問題の解決方法について説明します。

限定公開 DNS ゾーンを作成できない

エンドポイントを作成すると、Service Directory DNS ゾーンが作成されます。ゾーンの作成が失敗する理由には、次のようなものがあります。

  • プロジェクトで Cloud DNS API が有効になっていない。

  • Service Directory の DNS ゾーンを作成するために必要な権限がない。

  • この VPC ネットワークに同じゾーン名を持つ DNS ゾーンが存在する。

  • この VPC ネットワークに p.googleapis.com の DNS ゾーンがすでに存在する。

前の削除が失敗して、ゾーンの競合が発生している可能性があります。

Service Directory DNS ゾーンを作成するには、次の手順を行います。

  1. プロジェクトで Cloud DNS API が有効になっていることを確認します。

  2. Service Directory DNS ゾーンの作成に必要な権限があることを確認します。

    • dns.managedZones.create
    • servicedirectory.namespaces.associatePrivateZone
  3. DNS ゾーンを削除します

  4. エンドポイントに関連付けられている Service Directory 名前空間に基づいて Service Directory の DNS ゾーンを作成します。

    ゾーンを作成するときに、次の値を使用します。

    • ゾーン名: 作成に失敗したときに使用したゾーン名を使用します。使用したゾーン名はエラー メッセージに表示されています。

    • DNS 名: p.googleapis.com.(末尾のドットも含む)。

    • Service Directory 名前空間: 作成した Private Service Connect エンドポイントの Service Directory 名前空間を検索し、Service Directory DNS ゾーンの作成時にこの名前空間を使用します。

    Service Directory の名前空間は goog-psc-NETWORK_NAME-NETWORK_ID という形式になります。

限定公開 DNS ゾーンを削除できない

VPC ネットワーク内にある最後のエンドポイントを削除すると、関連する Service Directory の構成(DNS ゾーンを含む)が削除されます。

次の理由により、この削除が失敗することがあります。

  • DNS ゾーンを削除するために必要な権限がない。

  • このゾーンには、Service Directory 以外で作成されたユーザー定義の DNS エントリが含まれている。

この問題を解決するには、次の手順を行います。

  1. dns.managedZones.delete 権限があることを確認します。詳細については、Cloud DNS ドキュメントのアクセス制御をご覧ください。

  2. DNS ゾーンを削除します