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 インターフェースの接続は推移的です。これは、プロデューサー ネットワークは、コンシューマー ネットワークに接続されている他のネットワークと通信できることを意味します。
図 1
Vertex AI PSC インターフェースの到達可能性に関する考慮事項
- Vertex AI PSC インターフェースは、RFC1918 アドレス ブロック内の VPC またはオンプレミスの宛先にトラフィックをルーティングできます。
- RFC-1918 以外のアドレス ブロックをターゲットとする PSC インターフェースには、RFC-1918 アドレスを持つコンシューマーの VPC にデプロイされた明示的なプロキシが必要です。Vertex AI デプロイ内で、プロキシはターゲット エンドポイントの FQDN とともに定義する必要があります。図 1 は、次の RFC-1918 以外の CIDR へのルーティングを容易にするために、コンシューマー VPC で構成された明示的プロキシ モードの Secure Web Proxy(SWP)を表しています。
- 240.0.0.0/4
- 203.0.113.0/24
- 10.10.20.0/28 プロキシは不要です。RFC-1918 範囲に含まれます。
- インターネット下り
Google マネージド テナント ネットワークのインターネット接続:
VPC-SC を使用しない Vertex AI PSC インターフェース
- PSC インターフェースのみを使用してデプロイを構成すると、デフォルトのインターネット アクセスが保持されます。このアウトバウンド トラフィックは、Google 管理のテナント ネットワークから直接下り(外向き)に送信されます。
VPC-SC を使用した Vertex AI PSC インターフェース
- プロジェクトが VPC Service Controls 境界の一部である場合、Google マネージド テナントのデフォルトのインターネット アクセスは境界によってブロックされ、データの引き出しが防止されます。
- このシナリオでデプロイがパブリック インターネットにアクセスできるようにするには、Vertex AI に接続されている VPC を介してトラフィックをルーティングする安全な下り(外向き)パスを明示的に構成する必要があります。これを行うには、RFC 1918 アドレスを使用して VPC ネットワーク内にプロキシ サーバーをデプロイし、Cloud NAT ゲートウェイとペアリングします。Secure Web Proxy を使用してトラフィックをインターネットに転送することもできます。Secure Web Proxy を作成すると、Cloud NAT ゲートウェイが自動的に作成されます。
詳しくは、次のリソースをご覧ください。
Vertex AI リソースの Private Service Connect インターフェースを設定する | Google Cloud
作成するアプリの概要
このチュートリアルでは、図 1 に示すように、Private Service Connect(PSC)インターフェースを使用して包括的な Vertex AI Pipelines デプロイを構築し、class-e-subnet の RFC 1918 以外のエンドポイントをターゲットとして、プロデューサーからコンシューマーのコンピューティングへの接続を可能にします。
図 2
コンシューマー VPC に単一の psc-network-attachment を作成し、DNS ピアリングを利用して Vertex AI Training をホストするテナント プロジェクト内のコンシューマー VM を解決します。これにより、次のユースケースが実現します。
Vertex AI Pipelines をデプロイし、明示的なプロキシ モードで Secure Web Proxy を構成して、クラス E サブネット内の VM に対して wget を実行できるようにします。
学習内容
- ネットワーク アタッチメントを作成する方法
- プロデューサーがネットワーク アタッチメントを使用して PSC インターフェースを作成する方法
- Google マネージド VPC ネットワークからコンシューマー VPC ネットワークで構成されたプライベート ドメインを解決するために DNS ピアリングを確立する方法
- Vertex AI PSC インターフェースから Secure Web Proxy にトラフィックを転送する方法
- Vertex AI Pipelines から RFC-1918 以外の IP アドレス空間への通信を確立する方法
必要なもの
Google Cloud プロジェクト
IAM 権限
- Compute ネットワーク管理者 (roles/compute.networkAdmin)
- Compute インスタンス管理者 (roles/compute.instanceAdmin)
- Compute セキュリティ管理者(roles/compute.securityAdmin)
- セキュリティ ポリシー管理者(roles/compute.orgSecurityPolicyAdmin)
- DNS 管理者(roles/dns.admin)
- IAP で保護されたトンネル ユーザー(roles/iap.tunnelResourceAccessor)
- Logging 管理者(roles/logging.admin)
- Notebooks 管理者(roles/notebooks.admin)
- Project IAM 管理者(roles/resourcemanager.projectIamAdmin)
- サービス アカウント管理者(roles/iam.serviceAccountAdmin)
- サービス アカウント ユーザー(roles/iam.serviceAccountUser)
- Service Usage 管理者(roles/serviceusage.serviceUsageAdmin)
2. 始める前に
チュートリアルをサポートするようにプロジェクトを更新する
このチュートリアルでは、$variables を使用して、Cloud Shell での gcloud 構成の実装を支援します。
Cloud Shell で、次の操作を行います。
gcloud config list project
gcloud config set project [YOUR-PROJECT-ID]
projectid=YOUR-PROJECT-ID
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 "cloudresourcemanager.googleapis.com"
gcloud services enable "artifactregistry.googleapis.com"
gcloud services enable "cloudbuild.googleapis.com"
gcloud services enable "networkservices.googleapis.com"
gcloud services enable "networksecurity.googleapis.com"
gcloud services enable "certificatemanager.googleapis.com"
3. コンシューマーの設定
コンシューマー VPC を作成する
Cloud Shell で、次の操作を行います。
gcloud compute networks create consumer-vpc --project=$projectid --subnet-mode=custom
コンシューマー サブネットを作成する
Cloud Shell で、次の操作を行います。
gcloud compute networks subnets create class-e-subnet --project=$projectid --range=240.0.0.0/4 --network=consumer-vpc --region=us-central1
Cloud Shell で、次の操作を行います。
gcloud compute networks subnets create rfc1918-subnet1 --project=$projectid --range=10.10.10.0/28 --network=consumer-vpc --region=us-central1 --enable-private-ip-google-access
プロキシ専用サブネットを作成する
gcloud compute networks subnets create proxy-only-uscentral1 \
--purpose=REGIONAL_MANAGED_PROXY \
--role=ACTIVE \
--region=us-central1 \
--network=consumer-vpc \
--range=10.10.100.0/26
Private Service Connect ネットワーク アタッチメント サブネットを作成する
Cloud Shell で、次の操作を行います。
gcloud compute networks subnets create intf-subnet \
--project=$projectid \
--range=192.168.10.0/28 \
--network=consumer-vpc \
--region=us-central1 \
--enable-private-ip-google-access
Cloud Router と NAT 構成
Google Cloud Secure Web Proxy は、デプロイされているリージョンで Cloud NAT ゲートウェイと関連する Cloud Router を自動的にプロビジョニングして管理します。
4. IAP を有効にする
IAP(Identity-Aware Proxy)が 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 内で、コンシューマー VM インスタンス class-e-vm を作成します。
gcloud compute instances create class-e-vm \
--project=$projectid \
--machine-type=e2-micro \
--image-family debian-11 \
--no-address \
--shielded-secure-boot \
--image-project debian-cloud \
--zone us-central1-a \
--subnet=class-e-subnet \
--private-network-ip=240.0.0.2
6. Secure Web Proxy
Secure Web Proxy の明示モード(または明示プロキシ ルーティング モード)は、クライアント ワークロードが SWP の内部 IP アドレスまたは完全修飾ドメイン名とポートを転送プロキシとして使用するように明示的に構成する必要があるデプロイ方法です。
以下の手順では、YOUR-PROJECT-ID をプロジェクト ID に変更してください。
ウェブ プロキシを作成します。
Cloud Shell で、テキスト エディタを使用して policy.yaml ファイルを作成します。
cat > policy.yaml << EOF
description: basic Secure Web Proxy policy
name: projects/$projectid/locations/us-central1/gatewaySecurityPolicies/policy1
EOF
Cloud Shell で、Secure Web Proxy ポリシーを生成します。
gcloud network-security gateway-security-policies import policy1 \
--source=policy.yaml \
--location=us-central1
次のセクションでは、ホスト sessionMatcher に基づいて class-e-vm へのアクセスを許可するルールを作成します。
Cloud Shell で、テキスト エディタを使用して rule1.yaml ファイルを作成します。
cat > rule1.yaml << EOF
name: projects/$projectid/locations/us-central1/gatewaySecurityPolicies/policy1/rules/allow-nonrfc-classe
description: Allow nonrfc class-e
enabled: true
priority: 1
basicProfile: ALLOW
sessionMatcher: host() == 'class-e-vm.demo.com'
EOF
次のセクションでは、Jupyter ノートブックが "class-e" VM にアクセスして apache2 をインストールできるようにするルールを作成します。
Cloud Shell で、テキスト エディタを使用して rule2.yaml ファイルを作成します。
cat > rule2.yaml << EOF
name: projects/$projectid/locations/us-central1/gatewaySecurityPolicies/policy1/rules/allow-apache2
description: Allow Apache2 install on class-e VM
enabled: true
priority: 2
basicProfile: ALLOW
sessionMatcher: inIpRange(source.ip,'240.0.0.2')
EOF
Cloud Shell で、セキュリティ ポリシー ルール 1 を生成します。
gcloud network-security gateway-security-policies rules import allow-nonrfc-classe \
--source=rule1.yaml \
--location=us-central1 \
--gateway-security-policy=policy1
Cloud Shell で、セキュリティ ポリシー rule2 を生成します。
gcloud network-security gateway-security-policies rules import allow-apache2 \
--source=rule2.yaml \
--location=us-central1 \
--gateway-security-policy=policy1
Vertex AI Training をサポートするには、次の設定で Secure Web Proxy ゲートウェイを構成します。
- リスニング ポート: Vertex AI アプリケーションのコードの明示的なプロキシ設定で構成されているポート(8080 など)と同じポートを使用します。
- アドレス: RFC 1918 範囲のプライベート IP アドレスを割り当てます。
- ルーティング モード: EXPLICIT_ROUTING_MODE に設定します。
Cloud Shell で、Secure Web Proxy ゲートウェイを定義する gateway.yaml ファイルを作成します。
cat > gateway.yaml << EOF
name: projects/$projectid/locations/us-central1/gateways/swp1
type: SECURE_WEB_GATEWAY
addresses: ["10.10.10.5"]
ports: [8080]
gatewaySecurityPolicy: projects/$projectid/locations/us-central1/gatewaySecurityPolicies/policy1
network: projects/$projectid/global/networks/consumer-vpc
subnetwork: projects/$projectid/regions/us-central1/subnetworks/rfc1918-subnet1
routingMode: EXPLICIT_ROUTING_MODE
EOF
Cloud Shell で、Secure Web Proxy インスタンスを生成します。
gcloud network-services gateways import swp1 \
--source=gateway.yaml \
--location=us-central1
Secure Web Proxy のデプロイには数分かかることがあります。

7. 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_MANUAL \
--subnets=intf-subnet
注: Vertex AI が構成されている場合、Google マネージド テナント プロジェクトは「自動的に受け入れる」が構成されているかのように自動的に追加されるため、この添付ファイルで受け入れられたプロジェクト ID を明示的に言及する必要はありません。
ネットワーク アタッチメントを一覧表示する
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]

8. 限定公開 DNS ゾーン
demo.com の Cloud DNS ゾーンを作成し、VM の IP アドレスを指す A レコードを入力します。その後、DNS ピアリングが Vertex AI Pipelines ジョブにデプロイされ、コンシューマーの DNS レコードにアクセスできるようになります。
Cloud Shell で、次の操作を行います。
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"
Cloud Shell 内で、VM のレコードセット class-e-vm を作成します。環境の出力に基づいて IP アドレスを更新してください。
gcloud dns --project=$projectid record-sets create class-e-vm.demo.com. --zone="private-dns-codelab" --type="A" --ttl="300" --rrdatas="240.0.0.2"
Cloud Shell で、Secure Web Proxy のレコードセットを作成します。環境の出力に基づいて IP アドレスを更新してください。
gcloud dns --project=$projectid record-sets create explicit-swp.demo.com. --zone="private-dns-codelab" --type="A" --ttl="300" --rrdatas="10.10.10.5"
PSC インターフェースからのアクセスを許可する Cloud Firewall ルールを作成する
次のセクションでは、PSC ネットワーク アタッチメントから送信されたトラフィックがコンシューマー VPC の RFC 1918 コンピューティング リソースにアクセスできるようにするファイアウォール ルールを作成します。
Cloud Shell で、プロキシ専用サブネットからクラス E サブネットへのアクセスを許可する上り(内向き)ファイアウォール ルールを作成します。SWP は、送信元アドレスとしてプロキシ専用サブネットを使用して接続を開始します。
gcloud compute firewall-rules create allow-access-to-class-e \
--network=consumer-vpc \
--action=ALLOW \
--rules=ALL \
--direction=INGRESS \
--priority=1000 \
--source-ranges="10.10.100.0/28" \
--destination-ranges="240.0.0.0/4" \
--enable-logging
9. Jupyter ノートブックを作成する
次のセクションでは、Jupyter Notebook の作成について説明します。このノートブックは、Vertex AI Pipelines からテスト インスタンスに wget を送信する Vertex AI Pipelines ジョブをデプロイするために使用されます。インスタンスを含む Vertex AI Pipelines とコンシューマー ネットワーク間のデータパスは、Private Service Connect インターフェースを使用します。
ユーザー管理のサービス アカウントを作成する
次のセクションでは、チュートリアルで使用する Vertex AI Workbench インスタンスに関連付けるサービス アカウントを作成します。
このチュートリアルでは、サービス アカウントに次のロールが適用されます。
Cloud Shell にログインして、次の操作を行います。
サービス アカウントを作成します。
gcloud iam service-accounts create notebook-sa \
--display-name="notebook-sa"
ロール「ストレージ管理者」でサービス アカウントを更新します。
gcloud projects add-iam-policy-binding $projectid --member="serviceAccount:notebook-sa@$projectid.iam.gserviceaccount.com" --role="roles/storage.admin"
ロール AI Platform ユーザーでサービス アカウントを更新します。
gcloud projects add-iam-policy-binding $projectid --member="serviceAccount:notebook-sa@$projectid.iam.gserviceaccount.com" --role="roles/aiplatform.user"
Artifact Registry 管理者のロールを使用してサービス アカウントを更新します。
gcloud projects add-iam-policy-binding $projectid --member="serviceAccount:notebook-sa@$projectid.iam.gserviceaccount.com" --role="roles/artifactregistry.admin"
Cloud Build 編集者のロールを持つサービス アカウントを更新します。
gcloud projects add-iam-policy-binding $projectid --member="serviceAccount:notebook-sa@$projectid.iam.gserviceaccount.com" --role="roles/cloudbuild.builds.editor"
ノートブック サービス アカウントが 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"
10. Vertex AI Workbench インスタンスを作成する
次のセクションでは、前に作成したサービス アカウント notebook-sa を組み込んだ Vertex AI Workbench インスタンスを作成します。
Cloud Shell 内でプライベート クライアント インスタンスを作成します。
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-sa@$projectid.iam.gserviceaccount.com
11. Vertex AI サービス エージェントの更新
Vertex AI は、PSC インターフェースの作成に使用される PSC ネットワーク アタッチメント サブネットから IP アドレスを取得するなどのオペレーションをユーザーに代わって実行します。これを行うため、Vertex AI は ネットワーク管理者権限を必要とするサービス エージェント(下記)を使用します。
service-$projectnumber@gcp-sa-aiplatform.iam.gserviceaccount.com
注: サービス エージェントの権限を更新する前に、Cloud コンソールの Vertex AI に移動して、Vertex AI API が有効になっていることを確認してください。
Cloud Shell 内:
プロジェクト番号を取得します。
gcloud projects describe $projectid | grep projectNumber
プロジェクト番号を設定します。
projectnumber=YOUR-PROJECT-NUMBER
AI Platform のサービス アカウントを作成します。プロジェクトに既存のサービス アカウントがある場合は、この手順をスキップします。
gcloud beta services identity create --service=aiplatform.googleapis.com --project=$projectnumber
ロール compute.networkAdmin を使用してサービス エージェント アカウントを更新します。
gcloud projects add-iam-policy-binding $projectid --member="serviceAccount:service-$projectnumber@gcp-sa-aiplatform.iam.gserviceaccount.com" --role="roles/compute.networkAdmin"
ロール dns.peer を使用してサービス エージェント アカウントを更新する
gcloud projects add-iam-policy-binding $projectid --member="serviceAccount:service-$projectnumber@gcp-sa-aiplatform.iam.gserviceaccount.com" --role="roles/dns.peer"
デフォルトのサービス アカウントの更新
Compute Engine API を有効にして、Vertex AI へのアクセス権をデフォルトのサービス アカウントに付与します。アクセス権の変更が反映されるまでに時間がかかることがあります。
Cloud Shell を使用して、次のようにデフォルトのサービス アカウントを更新します。
ロール aiplatform.user を使用してデフォルトのサービス アカウントを更新する
gcloud projects add-iam-policy-binding $projectid \
--member="serviceAccount:$projectnumber-compute@developer.gserviceaccount.com" \
--role="roles/aiplatform.user"
ロール storage.admin を使用してデフォルトのサービス アカウントを更新する
gcloud projects add-iam-policy-binding $projectid \
--member="serviceAccount:$projectnumber-compute@developer.gserviceaccount.com" \
--role="roles/storage.admin"
ロール artifactregistry.admin を使用してデフォルトのサービス アカウントを更新する
gcloud projects add-iam-policy-binding $projectid \
--member="serviceAccount:$projectnumber-compute@developer.gserviceaccount.com" \
--role="roles/artifactregistry.admin"
12. 「class-e-vm」に Apache2 をインストールして Tcpdump を有効にします。
class-e-vm から Secure Web Proxy 経由で apache2 をインストールします。
新しい Cloud Shell タブを開き、プロジェクト変数を更新して class-e-vm に SSH で接続します。
gcloud compute ssh --zone us-central1-a "class-e-vm" --tunnel-through-iap --project $projectid
sudo apt-get -o Acquire::http::Proxy="http://10.10.10.5:8080" update
sudo apt-get -o Acquire::http::Proxy="http://10.10.10.5:8080" install apache2 -y
sudo service apache2 restart
echo 'class-e Server !!' | sudo tee /var/www/html/index.html
Secure Web Proxy がトラフィックをターゲットに転送するために使用するプロキシ専用サブネットで tcpdump フィルタリングを実行します。
class-e-vm OS から、proxy-vm サブネットで tcpdump フィルタリングを実行します。
sudo tcpdump -i any net 10.10.100.0/24 -nn
注: JupyterLab セッションを開くには、workbench-tutorial インスタンスのサブネットでプライベート Google アクセスを有効にしてください。
13. Vertex AI Pipelines ジョブをデプロイする
次のセクションでは、Vertex AI Pipelines から明示的なプロキシへの wget を正常に実行するノートブックを作成します。これにより、class-e-vm などの RFC 1918 以外の VM にアクセスできます。Vertex AI Pipelines が rfc1918-vm にアクセスする場合、そのターゲットは RFC 1918 IP アドレスであるため、明示的なプロキシは必要ありません。
Vertex AI Workbench インスタンスでトレーニング ジョブを実行します。
- Google Cloud コンソールで、Vertex AI Workbench ページの [インスタンス] タブに移動します。
- Vertex AI Workbench インスタンス名(workbench-tutorial)の横にある [JupyterLab を開く] をクリックします。JupyterLab で Vertex AI Workbench インスタンスが開きます。
- [ファイル] > [新規] > [ノートブック] の順に選択します。
- [Kernel] > [Python 3] を選択します。
JupyterLab ノートブックで、新しいセルを作成し、次のコードを更新して実行します。PROJECT_ID は、環境の詳細に更新してください。
import json
import requests
import pprint
PROJECT_ID = 'YOUR-PROJECT-ID' #Enter your project ID
PROJECT_NUMBER=!gcloud projects list --filter="project_id:$PROJECT_ID" --format="value(PROJECT_NUMBER)"
PROJECT_NUMBER=str(PROJECT_NUMBER).strip('[').strip(']').strip("'")
print(PROJECT_NUMBER)
JupyterLab ノートブックで、新しいセルを作成して次のコマンドを実行します。
# us-central1 is used for the codelab
REGION = "us-central1" #@param {type:"string"}
SERVICE_NAME = "aiplatform" #@param {type:"string"}
SERVICE ="{}.googleapis.com".format(SERVICE_NAME)
ENDPOINT="{}-{}.googleapis.com".format(REGION, SERVICE_NAME)
API_VERSION = "v1" # @param {type: "string"}
LOCATION = REGION
JupyterLab ノートブックで、新しいセルを作成して次の構成を実行します。次の点に注意してください。
- proxy_server = "http://explicit-swp.demo.com:8080"
- FQDN は、コンシューマー VPC にデプロイされたプロキシ VM に関連付けられています。後の手順で DNS ピアリングを使用して FQDN を解決します。
%%writefile main.py
import logging
import socket
import sys
import os
def make_api_request(url: str, proxy_vm_ip: str, proxy_vm_port: str):
"""
Makes a GET request to a nonRFC-1918 API and saves the response.
Args:
url: The URL of the API to send the request to.
"""
import requests
try:
# response = requests.get(url)
proxy_server = f"http://explicit-swp.demo.com:8080" # replace it with your Secure Web proxy Ip-address and the port.
proxies = {
"http": proxy_server,
"https": proxy_server,
}
response = requests.get(url, proxies=proxies)
logging.info(response.text)
response.raise_for_status() # Raise an exception for bad status codes
logging.info(f"Successfully fetched data from {url}")
except requests.exceptions.RequestException as e:
logging.error(f"An error occurred: {e}")
raise e
if __name__ == '__main__':
# Configure logging to print clearly to the console
logging.basicConfig(
level=logging.INFO,
format='%(levelname)s: %(message)s',
stream=sys.stdout
)
url_to_test = os.environ['NONRFC_URL']
proxy_vm_ip = os.environ['PROXY_VM_IP']
proxy_vm_port = os.environ['PROXY_VM_PORT']
logging.info(f"url_to_test: {url_to_test}")
logging.info(f"proxy_vm_ip: {proxy_vm_ip}")
logging.info(f"proxy_vm_port: {proxy_vm_port}")
make_api_request(url_to_test, proxy_vm_ip, proxy_vm_port)
JupyterLab ノートブックで、新しいセルを作成して次のコマンドを実行します。
%%writefile Dockerfile
FROM python:3.9-slim
RUN apt-get update && \
apt-get install -y iputils-ping && \
apt-get install -y wget
RUN pip install cloudml-hypertune requests kfp
COPY main.py /main.py
ENTRYPOINT ["python3", "/main.py"]
JupyterLab ノートブックで、新しいセルを作成して次のコマンドを実行します。
!gcloud artifacts repositories create pipelines-test-repo-psc --repository-format=docker --location=us-central1
JupyterLab ノートブックで、新しいセルを作成して次のコマンドを実行します。
IMAGE_PROJECT = PROJECT_ID
IMAGE_REPO = 'pipelines-test-repo-psc'
IMAGE_NAME = 'nonrfc-ip-call'
TAG = 'v1'
IMAGE_URI= f'us-central1-docker.pkg.dev/{IMAGE_PROJECT}/{IMAGE_REPO}/{IMAGE_NAME}:{TAG}'
IMAGE_URI
JupyterLab ノートブックで、新しいセルを作成して次のコマンドを実行します。
!gcloud auth configure-docker us-docker.pkg.dev --quiet
JupyterLab ノートブックで、新しいセルを作成して次のコマンドを実行します。エラー(gcloud.builds.submit)が表示された場合は無視します。
!gcloud builds submit --tag {IMAGE_URI} --region=us-central1
JupyterLab ノートブックで、次のセルを作成して実行します。次のハイライトに注意してください。
- コンシューマー VPC への DNS ピアリングは、ドメイン名 demo.com の dnsPeeringConfigs(dnsPeeringConfigs)を使用して構成されます。
- ここで明示的なルーティング モードのウェブプロキシは explicit-swp.demo.com です。解決は、コンシューマーの VPC 内の DNS ピアリングによって処理されます。
- ポート 8080 は、Secure Web Proxy で構成されたリスニング ポート(デフォルト)です。
wgetから class-e-vm-demo.com への解決は DNS ピアリングを介して行われる- このコードは Vertex の「psc-network-attachment」を指定し、ネットワーク アタッチメント サブネットを使用して 2 つの PSC インターフェース インスタンスをデプロイできるようにします。
import json
from datetime import datetime
JOB_ID_PREFIX='test_psci-nonRFC' #@param {type:"string"}
JOB_ID = '{}_{}'.format(JOB_ID_PREFIX, datetime.now().strftime("%Y%m%d%H%M%S"))
# PSC-I configs
PRODUCER_PROJECT_ID = PROJECT_ID
DNS_DOMAIN = 'class-e-vm.demo.com' #@param {type:"string"}
NON_RFC_URL = f"http://{DNS_DOMAIN}"
PROXY_VM_IP = "explicit-swp.demo.com" #@param {type:"string"}
PROXY_VM_PORT = "8080" #@param {type:"string"}
CUSTOM_JOB = {
"display_name": JOB_ID,
"job_spec": {
"worker_pool_specs": [
{
"machine_spec": {
"machine_type": "n1-standard-4",
},
"replica_count": 1,
"container_spec": {
"image_uri": IMAGE_URI,
"env": [{
"name": "NONRFC_URL",
"value": NON_RFC_URL
},
{
"name": "PROXY_VM_IP",
"value": PROXY_VM_IP
},
{
"name": "PROXY_VM_PORT",
"value": PROXY_VM_PORT
}]
},
},
],
"enable_web_access": True,
"psc_interface_config": {
"network_attachment": "psc-network-attachment",
"dns_peering_configs": [
{
"domain": "demo.com.",
"target_project": PROJECT_ID,
"target_network": "consumer-vpc"
},
]
},
}
}
print(json.dumps(CUSTOM_JOB, indent=2))
JupyterLab ノートブックで、新しいセルを作成して次のコマンドを実行します。
import requests
bearer_token = !gcloud auth application-default print-access-token
headers = {
'Content-Type': 'application/json',
'Authorization': 'Bearer {}'.format(bearer_token[0]),
}
request_uri = f"https://{REGION}-aiplatform.googleapis.com/{API_VERSION}/projects/{PROJECT_NUMBER}/locations/{REGION}/customJobs/"
print("request_uri: ", request_uri)
JupyterLab ノートブックで、新しいセルを作成して次のコマンドを実行します。
response_autopush = requests.post(request_uri, json=CUSTOM_JOB, headers=headers)
response = response_autopush
print("response:", response)
if response.reason == 'OK':
job_name = response.json()['name']
job_id = job_name.split('/')[-1]
print("Created Job: ", response.json()['name'])
else:
print(response.text)
JupyterLab ノートブックで、新しいセルを作成して次のコマンドを実行します。
# Print KFP SDK version (should be >= 1.6)
! python3 -c "import kfp; print('KFP SDK version: {}'.format(kfp.__version__))"
# Print AI Platform version
! python3 -c "from google.cloud import aiplatform; print('AI Platform version: {}'.format(aiplatform.__version__))"
JupyterLab ノートブックで、新しいセルを作成して次のコマンドを実行します。
BUCKET_URI = "your-unique-bucket" # Provide a globally unique bucket name
JupyterLab ノートブックで、新しいセルを作成して次のコマンドを実行します。
!gcloud storage buckets create gs://{BUCKET_URI}
JupyterLab ノートブックで、新しいセルを作成して次のコマンドを実行します。
# pipeline parameters
CACHE_PIPELINE = False # @param {type: "string"}
_DEFAULT_IMAGE = IMAGE_URI
BUCKET_URI = "gs://{BUCKET_URI}" # @param {type: "string"}
PIPELINE_ROOT = f"{BUCKET_URI}/pipeline_root/intro"
PIPELINE_DISPLAY_NAME = "pipeline_nonRFCIP" # @param {type: "string"}
JupyterLab ノートブックで、新しいセルを作成して次のコマンドを実行します。
from re import S
import kfp
from kfp import dsl
from kfp.dsl import container_component, ContainerSpec
from kfp import compiler
from google.cloud import aiplatform
# ==== Component with env variable ====
@container_component
def dns_peering_test_op(dns_domain: str, proxy_vm_ip:str, proxy_vm_port:str):
return ContainerSpec(
image=_DEFAULT_IMAGE,
command=["bash", "-c"],
args=[
"""
apt-get update && apt-get install inetutils-traceroute inetutils-ping netcat-openbsd curl -y
echo "Local IP(s): $(hostname -I)"
echo "Attempting to trace route to %s"
traceroute -w 1 -m 7 "%s"
echo "Sending curl requests to http://%s via proxy %s:%s and recording trace..."
if curl -L -v --trace-ascii /dev/stdout -x http://%s:%s "http://%s"; then
echo "Curl request succeeded!"
else
echo "Curl request failed!"
exit 1
fi
""" % (dns_domain, dns_domain, dns_domain, proxy_vm_ip, proxy_vm_port, proxy_vm_ip, proxy_vm_port, dns_domain)
]
)
# ==== Pipeline ====
@dsl.pipeline(
name="dns-peering-test-pipeline",
description="Test DNS Peering using env variable",
pipeline_root=PIPELINE_ROOT,
)
def dns_peering_test_pipeline(dns_domain: str, proxy_vm_ip:str, proxy_vm_port:str):
dns_test_task = dns_peering_test_op(dns_domain=dns_domain, proxy_vm_ip=proxy_vm_ip, proxy_vm_port=proxy_vm_port)
dns_test_task.set_caching_options(enable_caching=CACHE_PIPELINE)
# ==== Compile pipeline ====
if __name__ == "__main__":
aiplatform.init(project=PROJECT_ID, location=LOCATION)
compiler.Compiler().compile(
pipeline_func=dns_peering_test_pipeline,
package_path="dns_peering_test_pipeline.yaml",
)
print("✅ Pipeline compiled to dns_peering_test_pipeline.yaml")
JupyterLab ノートブックで、新しいセルを作成して次のコマンドを実行します。
# Define the PipelineJob body; see API Reference https://cloud.google.com/vertex-ai/docs/reference/rest/v1/projects.locations.pipelineJobs/create
import requests, json
import datetime
bearer_token = !gcloud auth application-default print-access-token
headers = {
'Content-Type': 'application/json',
'Authorization': 'Bearer {}'.format(bearer_token[0]),
}
request_uri = f"https://{REGION}-aiplatform.googleapis.com/{API_VERSION}/projects/{PROJECT_NUMBER}/locations/{REGION}/pipelineJobs/"
print("request_uri: ", request_uri)
14. PSC インターフェースの検証
次の場所に移動して、Vertex AI Pipelines で使用されるネットワーク アタッチメントの IP を確認することもできます。
[ネットワーク サービス] → [Private Service Connect] → [ネットワーク アタッチメント] → [psc-network-attachment]
テナント プロジェクト(-tp で終わるプロジェクト名)を選択します。

ハイライト表示されたフィールドは、PSC ネットワーク アタッチメントから Vertex AI Pipelines で使用される IP アドレスを示します。

15. Cloud Logging の検証
Vertex AI Pipelines ジョブの初回実行には約 14 分かかりますが、以降の実行ははるかに短時間で完了します。結果が正常であることを確認するには、次の操作を行います。
[Vertex AI] → [トレーニング] → [カスタムジョブ] に移動します。
実行されたカスタムジョブを選択する

[ログを表示] を選択する

Cloud Logging が使用可能になったら、ハイライト表示された選択を生成するクエリを実行し、Vertex AI Pipelines から class-e-vm への wget が成功したことを確認します。


16. TCPDump の検証
コンピューティング インスタンスへの接続をさらに検証する TCPDUMP 出力を確認します。
class-e-vm から HTTP GET と 200 OK を確認します。
XXXXXXXXX@class-e-vm:~$ sudo tcpdump -i any net 10.10.100.0/28 -nn tcpdump: data link type LINUX_SLL2 tcpdump: verbose output suppressed, use -v[v]... for full protocol decode listening on any, link-type LINUX_SLL2 (Linux cooked v2), snapshot length 262144 bytes 05:51:14.173641 ens4 In IP 10.10.100.8.55306 > 240.0.0.2.80: Flags [S], seq 1747181041, win 65535, options [mss 1420,sackOK,TS val 3942828403 ecr 0,nop,wscale 8], length 0 05:51:14.173668 ens4 Out IP 240.0.0.2.80 > 10.10.100.8.55306: Flags [S.], seq 3013226100, ack 1747181042, win 64768, options [mss 1420,sackOK,TS val 1886125065 ecr 3942828403,nop,wscale 7], length 0 05:51:14.174977 ens4 In IP 10.10.100.8.55306 > 240.0.0.2.80: Flags [.], ack 1, win 1054, options [nop,nop,TS val 3942828405 ecr 1886125065], length 0 05:51:14.175066 ens4 In IP 10.10.100.8.55306 > 240.0.0.2.80: Flags [P.], seq 1:223, ack 1, win 1054, options [nop,nop,TS val 3942828405 ecr 1886125065], length 222: HTTP: GET / HTTP/1.1 05:51:14.175096 ens4 Out IP 240.0.0.2.80 > 10.10.100.8.55306: Flags [.], ack 223, win 505, options [nop,nop,TS val 1886125066 ecr 3942828405], length 0 05:51:14.239042 ens4 Out IP 240.0.0.2.80 > 10.10.100.8.55306: Flags [P.], seq 1:246, ack 223, win 505, options [nop,nop,TS val 1886125130 ecr 3942828405], length 245: HTTP: HTTP/1.1 200 OK
17. クリーンアップ
Cloud Shell から、チュートリアルのコンポーネントを削除します。
gcloud workbench instances delete workbench-tutorial --project=$projectid --location=us-central1-a
gcloud network-security gateway-security-policies rules delete allow-nonrfc-classe \
--gateway-security-policy=policy1 \
--location=us-central1
gcloud network-security gateway-security-policies rules delete allow-apache2 \
--gateway-security-policy=policy1 \
--location=us-central1
gcloud network-security gateway-security-policies delete policy1 \
--location=us-central1
gcloud network-services gateways delete swp1 \
--location=us-central1
gcloud compute network-attachments delete psc-network-attachment --region=us-central1 --quiet
gcloud compute networks subnets delete intf-subnet rfc1918-subnet1 --region=us-central1 --quiet
gcloud dns record-sets delete class-e-vm.demo.com --zone=private-dns-codelab --type=A
gcloud dns record-sets delete explicit-swp.demo.com --zone=private-dns-codelab --type=A
gcloud dns managed-zones delete private-dns-codelab
gcloud computeinstances delete class-e-vm --project=$projectid --zone=us-central1-a --quiet
gcloud compute networks delete consumer-vpc --quiet
18. 完了
おめでとうございます。Vertex AI Pipelines Private Service Connect インターフェースと RFC 以外の IP 範囲間の接続を Secure Web Proxy 経由で正常に構成して検証しました。
コンシューマー インフラストラクチャを作成し、プロデューサーがマルチ NIC VM を作成してコンシューマーとプロデューサーの通信をブリッジできるようにするネットワーク アタッチメントを追加しました。このチュートリアルでは、コンシューマー VPC ネットワークに明示的なプロキシをデプロイして、Vertex から直接ルーティングできない class-e-vm インスタンスへの接続を許可する DNS ピアリングを作成する方法について説明しました。

次のステップ
参考資料と動画
リファレンス ドキュメント
- Vertex AI ネットワーキング アクセスの概要 | Google Cloud
- Private Service Connect インターフェースを介した Vertex AI サービスへのアクセスについて | Google Cloud
- Vertex AI Training に Private Service Connect インターフェースを使用する | Google Cloud
- Vertex AI リソースの Private Service Connect インターフェースを設定する | Google Cloud
- ホストアドレスや IP アドレスなどとともにサービス アカウントを関連付けて、明示的ルーティング モードでトラフィックを SWP に転送することもできます。その他の例については、CEL 言語のドキュメントをご覧ください。