エンドポイントから 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 コンソールの [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 アクセスを有効にする方法は次のとおりです。
コンソール
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 コマンドをご覧ください。
エンドポイントを作成する
要件を満たす IP アドレスを選択したら、エンドポイントを作成できます。
エンドポイントは、グローバル転送ルールを使用して Google API とサービスに接続します。各転送ルールは、Private Service Connect の VPC ネットワークごとの割り当てにカウントされます。
Google API とサービスのエンドポイントは、作成後に更新できません。Google API とサービスのエンドポイントを更新する必要がある場合は、エンドポイントを削除してから新しいエンドポイントを作成します。
コンソール
Google Cloud コンソールで [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 へのアクセスに使用されるエンドポイントにのみ使用される名前空間を選択する必要があります。
新しい名前空間を作成するには、[名前空間] プルダウン メニューをクリックして、[名前空間の作成] をクリックします。名前空間を入力し、[作成] をクリックします。
特定の 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 は、エンドポイントを作成するプロジェクトを参照する必要があります。リージョンは
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 が構成されている VPC ネットワークに VM インスタンスを作成します。VM で次のコマンドを実行して、Private Service Connect エンドポイントが機能していることを確認します。エンドポイントは ping(ICMP)リクエストに応答しません。
curl -v ENDPOINT_IP/generate_204
ENDPOINT_IP
は、エンドポイントの IP アドレスに置き換えます。
エンドポイントが機能している場合は、HTTP 204
レスポンス コードが表示されます。
エンドポイントを一覧表示する
構成したエンドポイントの一覧を取得できます。
コンソール
Google Cloud コンソールで [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
エンドポイントに関する情報を取得する
エンドポイントのすべての構成の詳細を表示できます。
コンソール
Google Cloud コンソールで [Private Service Connect] ページに移動します。
[接続エンドポイント] タブをクリックします。
エンドポイントが表示されます。
詳細を表示するエンドポイントをクリックします。
gcloud
gcloud compute forwarding-rules describe \ ENDPOINT_NAME --global
エンドポイントにラベルを付ける
エンドポイントのラベルを管理できます。詳細については、リソースのラベル付けをご覧ください。
エンドポイントを削除する
エンドポイントを削除できます。
コンソール
Google Cloud コンソールで [Private Service Connect] ページに移動します。
[接続エンドポイント] タブをクリックします。
削除するエンドポイントを選択し、[削除] をクリックします。
gcloud
gcloud compute forwarding-rules delete \ ENDPOINT_NAME --global
ENDPOINT_NAME
は、削除するエンドポイントの名前に置き換えます。
エンドポイントを使用する
エンドポイントを使用するには、エンドポイントの 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 名を使用する
エンドポイントを作成すると、そのエンドポイントを使用して利用可能な一般的に使用されている 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 名を使用してエンドポイントにリクエストを送信できます。
カスタム エンドポイントを使用するように構成する方法については、クライアントまたはクライアント ライブラリのドキュメントをご覧ください。次に例を示します。
Python: Client options で
api_endpoint
を構成できます。Go: ClientOptions で
WithEndpoint
を構成できます。.NET: クライアントのビルダークラスで
Endpoint
を構成できます。gcloud: gcloud CLI で
api_endpoint_overrides
を構成できます。
デフォルトの DNS 名を使用して DNS レコードを作成する
次の状況では、API とサービスのデフォルトの DNS 名をエンドポイントに転送するために 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
レコードがエンドポイントの IP アドレスを指すようにします。Cloud DNS を使用している場合は、レコードの追加をご覧ください。アスタリスクとドットに続くドメイン(ゾーン)名を使用して、可能性のあるすべての追加ドメインのホスト名に対する
CNAME
レコードを作成します(例:*.googleapis.com
、*.gcr.io
)。このCNAME
レコードが、同じゾーンのA
レコードを指すようにします。たとえば、*.googleapis.com
はgoogleapis.com
を指し、*.gcr.io
はgcr.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 ゾーンを実装している場合は、次の手順を行います。
オンプレミス ネットワークが接続する VPC ネットワークにインバウンド サーバー ポリシーを作成します。
オンプレミス ネットワークが接続する VPC ネットワークで、Cloud VPN トンネルと VLAN アタッチメントが配置されているリージョンのインバウンド フォワーダー エントリ ポイントを特定します。
Private Service Connect エンドポイントの DNS 名を、VPC ネットワークに接続する Cloud VPN トンネルまたは VLAN アタッチメントと同じリージョンのインバウンド フォワーダーのエントリ ポイントに転送するように、オンプレミス システムとオンプレミスの 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 ゾーンを作成するには、次の手順を行います。
プロジェクトで Cloud DNS API が有効になっていることを確認します。
Service Directory DNS ゾーンの作成に必要な権限があることを確認します。
dns.managedZones.create
servicedirectory.namespaces.associatePrivateZone
エンドポイントに関連付けられている 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 エントリが含まれている。
この問題を解決するには、次の手順を行います。
dns.managedZones.delete
権限があることを確認します。詳細については、Cloud DNS ドキュメントのアクセス制御をご覧ください。