1. はじめに
Private Service Connect インターフェースは、プロデューサーの Virtual Private Cloud(VPC)ネットワークがコンシューマーの VPC ネットワーク内のさまざまな宛先への接続を開始できるようにするためのリソースです。プロデューサー ネットワークとコンシューマー ネットワークは、異なるプロジェクトや組織に属していてもかまわない。
ネットワーク アタッチメントが Private Service Connect インターフェースからの接続を受け入れると、Google Cloud はネットワーク アタッチメントで指定されたコンシューマー サブネットからインターフェースに IP アドレスを割り振ります。コンシューマ ネットワークとプロデューサー ネットワークが接続され、内部 IP アドレスを使用して通信が可能になります。
ネットワーク アタッチメントと Private Service Connect インターフェース間の接続は、Private Service Connect のエンドポイントとサービス アタッチメント間の接続に似ていますが、重要な違いが 2 つあります。
- ネットワーク アタッチメントは、プロデューサー ネットワークからコンシューマー ネットワークへの接続(マネージド サービスの下り、外向き)を開始できるようにします。エンドポイントは、コンシューマー ネットワークからプロデューサー ネットワークへの接続(マネージド サービスの上り、内向き)を開始できるようにします。
- Private Service Connect インターフェースの接続は推移的です。これは、プロデューサー ネットワークは、コンシューマー ネットワークに接続されている他のネットワークと通信できることを意味します。
Vertex AI PSC インターフェースの到達可能性に関する考慮事項
- PSC インターフェースは、RFC1918 アドレス ブロック内の VPC またはオンプレミス ベースの宛先にトラフィックをルーティングできます。
- RFC-1918 以外のアドレス ブロックをターゲットとする PSC インターフェースには、RFC-1918 アドレスを持つコンシューマーの VPC にデプロイされた明示的なプロキシが必要です。Vertex AI デプロイ内では、プロキシはターゲット エンドポイントの FQDN とともに定義する必要があります。
- PSC インターフェースのみを使用してデプロイを構成すると、デフォルトのインターネット アクセスが保持されます。このアウトバウンド トラフィックは、安全な Google 管理のテナント ネットワークから直接下り(外向き)に送信されます。
Vertex AI PSC-Interface VPC-SC に関する考慮事項
- プロジェクトが VPC Service Controls 境界の一部である場合、Google マネージド テナントのデフォルトのインターネット アクセスは、データの引き出しを防止するため、境界によってブロックされます。
- このシナリオでデプロイがパブリック インターネットにアクセスできるようにするには、VPC を介してトラフィックをルーティングする安全な下り(外向き)パスを明示的に構成する必要があります。
- これを行うには、RFC1918 アドレスを使用して VPC 境界内にプロキシ サーバーを設定し、プロキシ VM がインターネットにアクセスできるように Cloud NAT ゲートウェイを作成することをおすすめします。
詳しくは、次のリソースをご覧ください。
エージェントをデプロイする | Vertex AI の生成 AI | Google Cloud
Vertex AI リソースの Private Service Connect インターフェースを設定する | Google Cloud
作成するアプリの概要
このチュートリアルでは、Private Service Connect(PSC)インターフェースを使用してデプロイされた包括的な Agent Engine を構築し、RFC1918 アドレスを使用してコンシューマーの VPC にデプロイされたプロキシ VM を介してパブリック サイト(https://api.frankfurter.app/)に接続できるようにします。このデプロイ例は、VPC-SC が有効になっているプロジェクト、またはテナント VPC ではなく顧客のネットワークを介してインターネット下り(外向き)を必要とする管理者に適用できます。
図 1

コンシューマー VPC に単一の psc-network-attachment を作成し、DNS ピアリングを利用して、Agent Engine をホストするテナント プロジェクト内のコンシューマー ネットワーク プロキシ VM を解決します。これにより、次のユースケースが実現します。
Agent Engine をデプロイし、明示的なプロキシとして機能するようにプロキシ VM を構成して、パブリック URL https://api.frankfurter.app にアクセスできるようにします。
学習内容
- ネットワーク アタッチメントを作成する方法
- プロデューサーがネットワーク アタッチメントを使用して PSC インターフェースを作成する方法
- DNS ピアリングを使用してプロデューサーからコンシューマーへの通信を確立する方法
- インターネット下り(外向き)用のプロキシ VM をデプロイして使用する方法
必要なもの
Google Cloud プロジェクト
IAM 権限
- Compute ネットワーク管理者 (roles/compute.networkAdmin)
- Compute インスタンス管理者 (roles/compute.instanceAdmin)
- Compute セキュリティ管理者(roles/compute.securityAdmin)
- DNS 管理者(roles/dns.admin)
- IAP で保護されたトンネル ユーザー(roles/iap.tunnelResourceAccessor)
- Logging 管理者(roles/logging.admin)
- Notebooks 管理者(roles/notebooks.admin)
- Project IAM 管理者(roles/resourcemanager.projectIamAdmin)
- サービス アカウント管理者(roles/iam.serviceAccountAdmin)
- Service Usage 管理者(roles/serviceusage.serviceUsageAdmin)
2. 始める前に
チュートリアルをサポートするようにプロジェクトを更新する
このチュートリアルでは、$variables を使用して、Cloud Shell での gcloud 構成の実装を支援します。
Cloud Shell で、次の操作を行います。
gcloud config list project
gcloud config set project [YOUR-PROJECT-NAME]
projectid=YOUR-PROJECT-NAME
echo $projectid
API の有効化
Cloud Shell で、次の操作を行います。
gcloud services enable "compute.googleapis.com"
gcloud services enable "aiplatform.googleapis.com"
gcloud services enable "dns.googleapis.com"
gcloud services enable "notebooks.googleapis.com"
gcloud services enable "storage.googleapis.com"
gcloud services enable "iap.googleapis.com"
API が正常に有効になっていることを確認する
gcloud services list --enabled
3. コンシューマーの設定
コンシューマー VPC を作成する
この VPC はお客様のプロジェクトに存在します。この VPC に次のリソースが作成されます。
- コンシューマー サブネット
- ネットワーク アタッチメント サブネット
- Cloud Router(Cloud NAT に必要)
- Cloud NAT
Cloud Shell で、次の操作を行います。
gcloud compute networks create consumer-vpc --project=$projectid --subnet-mode=custom
コンシューマー サブネットを作成する
Cloud Shell 内で、プロキシ VM のサブネットを作成します。
gcloud compute networks subnets create rfc1918-subnet1 --project=$projectid --range=10.10.10.0/28 --network=consumer-vpc --region=us-central1
Private Service Connect ネットワーク アタッチメント サブネットを作成する
Cloud Shell 内で、PSC ネットワーク アタッチメントのサブネットを作成します。
gcloud compute networks subnets create intf-subnet --project=$projectid --range=192.168.10.0/28 --network=consumer-vpc --region=us-central1
Cloud Router と NAT の構成
このチュートリアルでは、パブリック IP アドレスを持たないプロキシ VM にインターネット アクセスを提供するために Cloud NAT を使用します。Cloud NAT を使用すると、プライベート IP アドレスのみを持つ VM がインターネットに接続して、ソフトウェア パッケージのインストールなどのタスクを実行できます。
Cloud Shell 内で、Cloud Router を作成します。
gcloud compute routers create cloud-router-for-nat --network consumer-vpc --region us-central1
Cloud Shell 内で、ロギングを有効にして NAT ゲートウェイを作成します。ロギングを使用して、Frankfurter API(https://api.frankfurter.app/)の公開 IP へのアクセスを検証します。
gcloud compute routers nats create cloud-nat-us-central1 --router=cloud-router-for-nat --auto-allocate-nat-external-ips --nat-all-subnet-ip-ranges --region us-central1 --enable-logging --log-filter=ALL
4. IAP を有効にする
IAP に VM インスタンスへの接続を許可するには、次のファイアウォール ルールを作成します。
- IAP を使用してアクセス可能にするすべての VM インスタンスに適用されます。
- IP 範囲 35.235.240.0/20 からの上り(内向き)トラフィックを許可します。この範囲には、IAP が TCP 転送に使用するすべての IP アドレスが含まれています。
Cloud Shell 内で、IAP ファイアウォール ルールを作成します。
gcloud compute firewall-rules create ssh-iap-consumer \
--network consumer-vpc \
--allow tcp:22 \
--source-ranges=35.235.240.0/20
5. コンシューマー VM インスタンスを作成する
Cloud Shell 内で、Agent Engine の明示的なプロキシとして機能するコンシューマー VM インスタンス proxy-vm を作成します。HTTP トラフィックのプロキシ処理には、tinyproxy をアプリケーションとして使用します。
gcloud compute instances create proxy-vm \
--project=$projectid \
--machine-type=e2-micro \
--image-family debian-11 \
--no-address \
--can-ip-forward \
--image-project debian-cloud \
--zone us-central1-a \
--subnet=rfc1918-subnet1 \
--shielded-secure-boot \
--metadata startup-script="#! /bin/bash
sudo apt-get update
sudo apt-get install tcpdump
sudo apt-get install tinyproxy -y
sudo apt-get install apache2 -y
sudo service apache2 restart
echo 'proxy server !!' | tee /var/www/html/index.html
EOF"
6. Private Service Connect ネットワーク アタッチメント
ネットワーク アタッチメントは、Private Service Connect インターフェースのコンシューマー側を表すリージョン リソースです。単一のサブネットをネットワーク アタッチメントに関連付けると、プロデューサーはそのサブネットから Private Service Connect インターフェースに IP を割り当てます。サブネットは、ネットワーク アタッチメントと同じリージョンに存在する必要があります。ネットワーク アタッチメントは、プロデューサー サービスと同じリージョンに存在する必要があります。
ネットワーク アタッチメントを作成する
Cloud Shell 内で、ネットワーク アタッチメントを作成します。
gcloud compute network-attachments create psc-network-attachment \
--region=us-central1 \
--connection-preference=ACCEPT_AUTOMATIC \
--subnets=intf-subnet
ネットワーク アタッチメントを一覧表示する
Cloud Shell 内で、ネットワーク アタッチメントを一覧表示します。
gcloud compute network-attachments list
ネットワーク アタッチメントの説明を取得する
Cloud Shell 内で、ネットワーク アタッチメントの説明を取得します。
gcloud compute network-attachments describe psc-network-attachment --region=us-central1
Private Service Connect インターフェースの作成時にプロデューサーが使用する PSC ネットワーク アタッチメント名 psc-network-attachment をメモします。
Cloud Console で PSC ネットワーク アタッチメントの URL を表示するには、次の場所に移動します。
[ネットワーク サービス] → [Private Service Connect] → [ネットワーク アタッチメント] → [psc-network-attachment]

7. 限定公開 DNS ゾーン
demo.com の Cloud DNS ゾーンを作成し、プロキシ VM の IP アドレスを指す A レコードを入力します。その後、DNS ピアリングが Agent Engine にデプロイされ、コンシューマーの DNS レコードにアクセスできるようになります。
Cloud Shell で、次の操作を行って DNS 名 demo.com を作成します。
gcloud dns --project=$projectid managed-zones create private-dns-codelab --description="" --dns-name="demo.com." --visibility="private" --networks="https://compute.googleapis.com/compute/v1/projects/$projectid/global/networks/consumer-vpc"
DNS A レコードに使用されるインスタンスの IP アドレスを取得して保存します。
Cloud Shell 内で、VM インスタンスに対して説明を実行します。
gcloud compute instances describe proxy-vm --zone=us-central1-a | grep networkIP:
Cloud Shell で、VM(proxy-vm.demo.com)のレコードセットを作成します。環境の出力に基づいて IP アドレスを更新してください。
gcloud dns --project=$projectid record-sets create proxy-vm.demo.com. --zone="private-dns-codelab" --type="A" --ttl="300" --rrdatas="10.10.10.2"
PSC インターフェースからのアクセスを許可する Cloud Firewall ルールを作成する
次のセクションでは、PSC ネットワーク アタッチメントからコンシューマー VPC の proxy-vm へのアクセスを許可するファイアウォール ルールを作成します。
Cloud Shell で、内向きファイアウォール ルールを作成します。
gcloud compute firewall-rules create allow-access-to-compute \
--network=consumer-vpc \
--action=ALLOW \
--rules=ALL \
--direction=INGRESS \
--priority=1000 \
--source-ranges="192.168.10.0/28" \
--destination-ranges="10.10.10.0/28" \
--enable-logging
8. Jupyter ノートブックを作成する
次のセクションでは、Jupyter Notebook の作成について説明します。このノートブックは、インターネット下り(外向き)の明示的なプロキシをターゲットとする Agent Engine のデプロイに使用されます。
ユーザー管理のサービス アカウントを作成する
次のセクションでは、チュートリアルで使用する Vertex AI Workbench インスタンスに関連付けるサービス アカウントを作成します。
このチュートリアルでは、サービス アカウントに次のロールが適用されます。
Cloud Shell 内で、サービス アカウントを作成します。
gcloud iam service-accounts create notebook-sa \
--display-name="notebook-sa"
Cloud Shell 内で、ロール「ストレージ管理者」を使用してサービス アカウントを更新します。
gcloud projects add-iam-policy-binding $projectid --member="serviceAccount:notebook-sa@$projectid.iam.gserviceaccount.com" --role="roles/storage.admin"
Cloud Shell 内で、Vertex AI ユーザーロールを使用してサービス アカウントを更新します。
gcloud projects add-iam-policy-binding $projectid --member="serviceAccount:notebook-sa@$projectid.iam.gserviceaccount.com" --role="roles/aiplatform.user"
Cloud Shell 内で、Artifact Registry 管理者のロールを使用してサービス アカウントを更新します。
gcloud projects add-iam-policy-binding $projectid --member="serviceAccount:notebook-sa@$projectid.iam.gserviceaccount.com" --role="roles/artifactregistry.admin"
Cloud Shell 内で、ノートブック サービス アカウントが Compute Engine のデフォルト サービス アカウントを使用できるようにします。
gcloud iam service-accounts add-iam-policy-binding \
$(gcloud projects describe $(gcloud config get-value project) --format='value(projectNumber)')-compute@developer.gserviceaccount.com \
--member="serviceAccount:notebook-sa@$projectid.iam.gserviceaccount.com" \
--role="roles/iam.serviceAccountUser"
9. 明示的プロキシを更新する
次のセクションでは、明示的プロキシに SSH 接続し、tinyproxy.conf 構成ファイルを更新してからリセットを実行する必要があります。
Cloud Shell から
gcloud compute ssh --zone us-central1-a "proxy-vm" --tunnel-through-iap --project $projectid
tinyproxy 構成ファイルを開き、任意のエディタを使用して更新します。以下は、VIM を使用した例です。
sudo vim /etc/tinyproxy/tinyproxy.conf
# Locate the "Listen" configuration line to restrict listening to only its private IP address of the Proxy-VM, rather than all interfaces.
Listen 10.10.10.2
# Locate the "Allow" configuration line to allow requests ONLY from the PSC Network Attachment Subnet
Allow 192.168.10.0/24
Save the configs by the following steps:
1. Press the `ESC` key to enter Command Mode.
2. Type `:wq` to save (w) and quit (q).
3. Press `Enter`
Restart the tinyproxy service to apply the changes:
sudo systemctl restart tinyproxy
Validate the tinyproxy service is running:
sudo systemctl status tinyproxy
Perform an exit returning to cloud shell
exit
10. Vertex AI Workbench インスタンスを作成する
次のセクションでは、前に作成したサービス アカウント notebook-sa を組み込んだ Vertex AI Workbench インスタンスを作成します。
Cloud Shell 内で private-client インスタンスを作成します。
gcloud workbench instances create workbench-tutorial --vm-image-project=cloud-notebooks-managed --vm-image-family=workbench-instances --machine-type=n1-standard-4 --location=us-central1-a --subnet-region=us-central1 --subnet=rfc1918-subnet1 --disable-public-ip --shielded-secure-boot=true --shielded-integrity-monitoring=true --shielded-vtpm=true --service-account-email=notebook