エンドポイントから Google API にアクセスする
このドキュメントでは、Private Service Connect エンドポイントを使用して Google API に接続する方法について説明します。storage.googleapis.com
などのサービス エンドポイント用に一般公開されている IP アドレスに送信するのではなく、Private Service Connect エンドポイントの内部 IP アドレスに API リクエストを送信できます。
また、Private Service Connect を使用して別の VPC ネットワーク内のサービスにアクセスし、サービスを公開することもできます。
ロール
このガイドのタスクを行うには、次の IAM ロールが必要です。
タスク | ロール |
---|---|
Private Service Connect エンドポイントの作成 |
以下のすべてのロール: 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 コンソールの [API とサービス] ページで、使用する Google API を有効にする必要があります。
プロジェクトで Compute Engine API を有効にする必要があります。
プロジェクトで Service Directory API を有効にする必要があります。
プロジェクトで Cloud DNS API を有効にする必要があります。
エンドポイントに使用する IP アドレスを選択する必要があります。使用できる IP アドレスについては、IP アドレスの要件をご覧ください。
下り(外向き)ファイアウォール ルールで、Private Service Connect エンドポイントへのトラフィックを許可する必要があります。VPC ネットワークのデフォルトのファイアウォール構成には暗黙の下り(外向き)許可ルールが含まれ、このトラフィックが許可されます。トラフィックをブロックする優先度の高い下り(外向き)ルールがないことを確認します。
Private Service Connect エンドポイントを使用して Google API やサービスにアクセスするため、外部 IP アドレスが割り当てられていない仮想マシン(VM)インスタンスは、限定公開の Google アクセスが有効になっているサブネットを使用する必要があります。
外部 IP アドレスを持つ VM は、そのサブネットで限定公開の Google アクセスが無効になっていても、Private Service Connect エンドポイントを使用して Google API とサービスにアクセスできます。Private Service Connect エンドポイントへの接続は Google のネットワーク内にとどまります。
VPC ネットワークに Private Service Connect エンドポイントが含まれていない場合は、
p.googleapis.com
に Cloud DNS 限定公開ゾーンが存在するかどうかを確認します。ゾーンが存在する場合は、Private Service Connect エンドポイントを作成する前にゾーンを削除します。これを削除しないと、Private Service Connect に使用される Service Directory の DNS ゾーンの作成は失敗します。詳細については、トラブルシューティングをご覧ください。Private Service Connect エンドポイントは、ピアリングされた VPC ネットワークからアクセスできません。
サブネットで限定公開の Google アクセスを有効にする
プライベート IP アドレスのない VM は、Private Service Connect エンドポイントを使用して Google API やサービスにアクセスするために、限定公開の Google アクセスが有効なサブネットに接続する必要があります。
VM に複数のインターフェースがある場合、デフォルト ルート(通常は nic0
)で構成されたインターフェースを接続します。
VM から送信されたパケットの送信元 IP アドレスが、VM インターフェースのプライマリ内部 IPv4 アドレスまたはエイリアス IP 範囲の内部 IPv4 アドレスと一致している必要があります。
サブネットで限定公開の Google アクセスを有効にする方法は次のとおりです。
コンソール
Google Cloud コンソールの [VPC ネットワーク] ページに移動します。
限定公開の Google アクセスを有効にするサブネットが含まれるネットワークの名前をクリックします。
サブネットの名前をクリックします。[サブネットの詳細] ページが表示されます。
[編集] をクリックします。
[限定公開の Google アクセス] セクションで、[オン] を選択します。
[保存] をクリックします。
gcloud
サブネットの名前とリージョンを特定します。次のコマンドで特定のネットワークのサブネットを一覧表示します。
gcloud compute networks subnets list --filter=NETWORK_NAME
次のコマンドを実行して、限定公開の Google アクセスを有効にします。
gcloud compute networks subnets update SUBNET_NAME \ --region=REGION \ --enable-private-ip-google-access
次のコマンドで、限定公開の Google アクセスが有効になっていることを確認します。
gcloud compute networks subnets describe SUBNET_NAME \ --region=REGION \ --format="get(privateIpGoogleAccess)"
次のように置き換えます。
SUBNET_NAME
: サブネットの名前REGION
: サブネットのリージョンNETWORK_NAME
: サブネットを含む VPC ネットワークの名前
Terraform
Terraform リソースを使用して、サブネットで限定公開の Google アクセスを有効にできます。
Terraform 構成を適用または削除する方法については、基本的な Terraform コマンドをご覧ください。
Private Service Connect エンドポイントを作成する
要件を満たす IP アドレスを選択したら、Private Service Connect エンドポイントを作成できます。
Private Service Connect エンドポイントは、グローバル転送ルールを使用して Google API とサービスに接続します。各転送ルールは、Private Service Connect の VPC ネットワークごとの割り当てにカウントされます。
コンソール
Google Cloud Console で、[Private Service Connect] ページに移動します。
[接続エンドポイント] タブをクリックします。
[エンドポイントを接続] をクリックします。
[対象] で、使用する対象 API バンドルを選択します。
- すべての Google API
- VPC-SC
[エンドポイント名] にエンドポイントの名前を入力します。
エンドポイントのネットワークを選択します。
エンドポイントの IP アドレスを選択します。
IP アドレスが所定の要件を満たしている必要があります。
新しい IP アドレスが必要な場合は、次のように作成します。
- [IP アドレスを作成] をクリックします。
- IP アドレスの名前と説明を入力します。
- 使用する IP アドレスを入力し、[保存] をクリックします。
この VPC ネットワークで Service Directory リージョンがまだ構成されていない場合は、使用するリージョンを選択します。
特定の VPC ネットワークで Google API とサービスへのアクセスに使用されるすべてのエンドポイントは同じ Service Directory リージョンを使用します。
この VPC ネットワークに対して Service Directory の名前空間がまだ構成されていない場合は、使用する名前空間を構成します。
自動的に割り当てられた名前空間を使用するには、[名前空間] プルダウン メニューをクリックして、自動的に割り当てられた名前空間を選択します。
別のネットワークで使用されている既存の名前空間を選択するには、[名前空間] プルダウン メニューをクリックして、リストから名前空間を選択します。このリストには、プロジェクト内のすべての名前空間が表示されます。Google API へのアクセスに使用される Private Service Connect エンドポイントにのみ使用される名前空間を選択する必要があります。
新しい名前空間を作成するには、[名前空間] プルダウン メニューをクリックして、[名前空間の作成] をクリックします。名前空間を入力し、[作成] をクリックします。
特定の VPC ネットワークで Google API とサービスへのアクセスに使用するすべてのエンドポイントは同じ Service Directory 名前空間を使用します。
[エンドポイントを追加] をクリックします。
gcloud
エンドポイントに割り振るグローバル内部 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 ネットワークの名前。
エンドポイントを 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 は、Private Service Connect エンドポイントを作成するプロジェクトを参照する必要があります。リージョンは
projects/PROJECT_NAME/locations/REGION
でのみ定義できます。projects/PROJECT_NAME/locations/REGION/namespaces/NAMESPACE
を使用してリージョンと名前空間を定義できます。
--service-directory-registration
を完全に省略するか、名前空間のないリージョンを設定すると、次のようになります。この VPC ネットワークにリージョンまたは名前空間がすでに構成されている場合は、これらのデフォルトが使用されます。
リージョンが構成されていない場合、リージョンは
us-central1
に設定されます。名前空間が構成されていない場合、システム生成の名前空間が割り当てられます。
API
エンドポイントに割り振るグローバル内部 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 を検索します。
エンドポイントを 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-central1
。REGION
を省略し、この VPC ネットワークにリージョンがすでに構成されている場合、そのリージョンが使用されます。リージョンが構成されていない場合、リージョンはus-central1
に設定されます。NAMESPACE
: 使用する Service Directory の名前空間の名前。NAMESPACE
を省略し、この VPC ネットワークに名前空間がすでに構成されている場合、その名前空間が使用されます。名前空間が構成されていない場合、システム生成の名前空間が割り当てられます。
Terraform
次の Terraform リソースを使用して、Private Service Connect エンドポイントを作成できます。
エンドポイントが機能していることを確認する
Private Service Connect が構成されている VPC ネットワークに VM インスタンスを作成します。VM で次のコマンドを実行して、Private Service Connect エンドポイントが機能していることを確認します。Private Service Connect エンドポイントは、ping(ICMP)リクエストに応答しません。
curl -v ENDPOINT_IP/generate_204
ENDPOINT_IP
は、Private Service Connect エンドポイントの IP アドレスに置き換えます。
エンドポイントが機能している場合は、HTTP 204
レスポンス コードが表示されます。
エンドポイントを一覧表示する
構成済みの Private Service Connect エンドポイントの一覧を取得できます。
コンソール
Google Cloud Console で、[Private Service Connect] ページに移動します。
[接続エンドポイント] タブをクリックします。
Private Service Connect エンドポイントが表示されます。
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
エンドポイントに関する情報を取得する
Private Service Connect エンドポイントの構成の詳細を表示できます。
コンソール
Google Cloud Console で、[Private Service Connect] ページに移動します。
[接続エンドポイント] タブをクリックします。
Private Service Connect エンドポイントが表示されます。
詳細を表示する Private Service Connect エンドポイントをクリックします。
gcloud
gcloud compute forwarding-rules describe \ ENDPOINT_NAME --global
エンドポイントにラベルを付ける
Private Service Connect エンドポイントのラベルを管理できます。詳細については、リソースのラベル付けをご覧ください。
エンドポイントを削除する
Private Service Connect エンドポイントを削除できます。
コンソール
Google Cloud Console で、[Private Service Connect] ページに移動します。
[接続エンドポイント] タブをクリックします。
削除する Private Service Connect エンドポイントを選択し、[削除] をクリックします。
gcloud
gcloud compute forwarding-rules delete \ ENDPOINT_NAME --global
ENDPOINT_NAME
は、削除するエンドポイントの名前に置き換えます。
エンドポイントを使用する
Private Service Connect エンドポイントを使用するには、エンドポイントの IP アドレスに解決される DNS ホスト名にリクエストを送信します。
カスタム エンドポイントを使用するようにクライアントを構成し、使用する API とサービスに
p.googleapis.com
DNS レコードが作成されている場合、自動的に作成されるp.googleapis.com
DNS 名を使用できます。詳細については、p.googleapis.com
DNS 名の使用をご覧ください。たとえば、エンドポイント名が
xyz
の場合、API バンドルにstorage-xyz.p.googleapis.com
、compute-xyz.p.googleapis.com
、その他の一般的に使用される API の DNS レコードが作成されます。カスタム エンドポイントを使用するように構成されていないクライアントを使用している場合、または使用するサービスに
p.googleapis.com
DNS レコードが存在しない場合は、デフォルトの DNS 名を使用して DNS レコードを作成できます。詳細については、デフォルトの DNS 名を使用して DNS レコードを作成するをご覧ください。たとえば、
storage.googleapis.com
とcompute.googleapis.com
の DNS レコードを作成します。
p.googleapis.com
DNS 名を使用する
Private Service Connect エンドポイントを作成すると、そのエンドポイントを使用して利用可能な一般的に使用されている 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.com
、compute-xyz.p.googleapis.com
と、他のサポートされている API の DNS レコードが作成されます。
カスタム エンドポイントを使用するように構成できるクライアントは、p.googleapis.com
DNS 名を使用して Private Service Connect エンドポイントにリクエストを送信できます。
カスタム エンドポイントを使用するように構成する方法については、クライアントまたはクライアント ライブラリのドキュメントをご覧ください。例:
Python:
google-api-core
パッケージのクライアント オプション クラスでapi_endpoint
を構成できます。Go:
api
パッケージのクライアント オプション パッケージでWithEndpoint
を構成できます。gcloud: 次のコマンドで
api_endpoint_overrides
を構成できます。gcloud config set api_endpoint_overrides/SERVICE ENDPOINT_URL
例:
gcloud config set api_endpoint_overrides/compute https://compute-xyz.p.googleapis.com/compute/v1/
デフォルトの DNS 名を使用して DNS レコードを作成する
次の状況では、API とサービスのデフォルトの DNS 名を Private Service Connect エンドポイントに転送するために DNS レコードを作成する必要があります。
クライアントまたはアプリケーションが
p.googleapis.com
DNS 名を使用するように構成することができない。サポートされているサービスにアクセスする必要があるが、そのサービス用に自動的に作成される
p.googleapis.com
DNS 名がない。
Private Service Connect エンドポイントを指定する DNS レコードを作成する手順は次のとおりです。
使用するドメインの DNS ゾーンを作成します(例:
googleapis.com
、gcr.io
)。そのためには、Cloud DNS 限定公開ゾーンの作成を検討してください。この DNS ゾーンで次のことを行います。
ドメイン(ゾーン)名自体の
A
レコード(例:googleapis.com
、gcr.io
)を作成します。このA
レコードが Private Service Connect エンドポイントの IP アドレスを指すようにします。Cloud DNS を使用している場合は、レコードの追加をご覧ください。アスタリスクとドットに続くドメイン(ゾーン)名を使用して、可能性のあるすべての追加ドメインのホスト名に対する
CNAME
レコードを作成します(例:*.googleapis.com
、*.gcr.io
)。このCNAME
レコードが、同じゾーンのA
レコードを指すようにします。たとえば、*.googleapis.com
はgoogleapis.com
を指し、*.gcr.io
はgcr.io
を指します。
オンプレミス ホストからエンドポイントにアクセスする
オンプレミス ネットワークが VPC ネットワークに接続されている場合、Private Service Connect を使用すると、Private Service Connect エンドポイントの内部 IP アドレスを使用して、オンプレミス ホストから Google API とサービスにアクセスできます。
オンプレミス ネットワークは、Cloud VPN トンネルまたは VLAN アタッチメントを使用して VPC ネットワークに接続する必要があります。
Private Service Connect エンドポイントは、オンプレミス ネットワークに接続されている VPC ネットワーク内にあります。
オンプレミス ネットワークには、Private Service Connect エンドポイントの適切なルートが必要です。Cloud VPN トンネルまたは VLAN アタッチメントのルートを管理する BGP セッションで Private Service Connect エンドポイントのルートを通知するように、Cloud Router のカスタムルート アドバタイズを構成します。
限定公開 DNS ゾーンにクエリを実行できるように、オンプレミス システムを構成する必要があります。
Cloud DNS を使用して限定公開 DNS ゾーンを実装している場合は、次の手順を行います。
オンプレミス ネットワークが接続する VPC ネットワークにインバウンド サーバー ポリシーを作成します。
オンプレミス ネットワークが接続する VPC ネットワークで、Cloud VPN トンネルと VLAN アタッチメントが配置されているリージョンのインバウンド フォワーダー エントリポイントを特定します。
Private Service Connect エンドポイントの DNS 名を、VPC ネットワークに接続する Cloud VPN トンネルまたは VLAN アタッチメントと同じリージョンのインバウンド フォワーダーのエントリ ポイントに転送するように、オンプレミス システムとオンプレミスの DNS ネームサーバーを構成します。
トラブルシューティング
限定公開 DNS ゾーンを作成できない
Private Service Connect エンドポイントを作成すると、Service Directory DNS ゾーンが作成されます。ゾーンの作成が失敗する理由には、次のようなものがあります。
プロジェクトで Cloud DNS API が有効になっていない。
Service Directory DNS ゾーンを作成するために必要な権限がない。
この VPC ネットワークに同じゾーン名を持つ DNS ゾーンが存在する。
この VPC ネットワークに
p.googleapis.com
の DNS ゾーンがすでに存在する。
前の削除が失敗して、ゾーンの競合が発生している可能性があります。
Service Directory DNS ゾーンを作成するには、次の手順を行います。
プロジェクトで Cloud DNS API が有効になっていることを確認します。
Service Directory DNS ゾーンの作成に必要な権限があることを確認します。
dns.managedZones.create
servicedirectory.namespaces.associatePrivateZone
Private Service Connect エンドポイントに関連付けられている 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 ネットワーク内にある最後の Private Service Connect エンドポイントを削除すると、関連する Service Directory の構成(DNS ゾーンを含む)が削除されます。
次の理由により、この削除が失敗することがあります。
DNS ゾーンを削除するために必要な権限がない。
このゾーンには、Service Directory 以外で作成されたユーザー定義の DNS エントリが含まれている。
この問題を解決するには、次の手順を行います。
dns.managedZones.delete
権限があることを確認します。詳細については、Cloud DNS ドキュメントのアクセス制御をご覧ください。