1. はじめに
Private Service Connect インターフェースは、プロデューサーの Virtual Private Cloud(VPC)ネットワークがコンシューマー ネットワーク内のさまざまな宛先への接続を開始できるようにするためのリソースです。プロデューサー ネットワークとコンシューマー ネットワークは、異なるプロジェクトや組織に属していてもかまわない。
ネットワーク アタッチメントと Private Service Connect インターフェース間の接続は、Private Service Connect のエンドポイントとサービス アタッチメント間の接続に似ていますが、重要な違いが 2 つあります。
- ネットワーク アタッチメントは、プロデューサー ネットワークからコンシューマー ネットワークへの接続(マネージド サービスの下り、外向き)を開始できるようにします。エンドポイントは、コンシューマー ネットワークからプロデューサー ネットワークへの接続(マネージド サービスの上り、内向き)を開始できるようにします。
- Private Service Connect インターフェースの接続は推移的です。これは、プロデューサー ネットワークは、コンシューマー ネットワークに接続されている他のネットワークと通信できることを意味します。
作成するアプリの概要
Google マネージド テナント プロジェクトにデプロイされた Vertex AI Pipelines は、PSC ネットワーク アタッチメントを利用して、プロデューサー ネットワークとコンシューマー ネットワークの間にマルチ NIC インスタンスを作成します。PSC ネットワーク アタッチメントはコンシューマー ネットワークのマルチ NIC でデプロイされるため、Vertex AI Pipelines はコンシューマー ネットワークから利用可能なルートに到達できます。
このチュートリアルでは、図 1 に示すように、Cloud Firewall ルールを使用してプロデューサーからコンシューマーのテスト インスタンスへの接続を許可または拒否する、Vertex AI Pipelines 用の包括的な Private Service Connect(PSC)インターフェース アーキテクチャを構築します。
図 1

コンシューマー VPC に 1 つの psc-network-attachment を作成すると、次のユースケースが実現します。
- コンシューマー VPC に上り(内向き)ファイアウォール ルールを作成し、Vertex AI Pipeline サブネット(192.168.10.0/28)が test-svc-1 にアクセスできるようにします。TCPDUMP を使用して、パイプライン ジョブから test-svc-1 への PING が正常に生成されたことを確認する
- コンシューマー VPC に上り(内向き)ファイアウォール ルールを作成し、Vertex AI Pipeline サブネット(192.168.10.0/28)から test-svc-2 へのアクセスを拒否します。ログ エクスプローラで生成されたファイアウォール ログに基づいて、PING の失敗を確認します。
学習内容
- ネットワーク アタッチメントを作成する方法
- Vertex AI Pipelines がネットワーク アタッチメントを使用して PSC インターフェースを作成する方法
- プロデューサーからコンシューマーへの通信を確立する方法
- Verex AI Pipelines からコンシューマー VM(test-svc-1)へのアクセスを許可する方法
- Cloud Firewall を使用して Verex AI Pipelines からコンシューマー VM(test-svc-2)へのアクセスを拒否する方法
必要なもの
- Google Cloud プロジェクト
- IAM 権限
- Compute インスタンス管理者 (roles/compute.instanceAdmin)
- Compute ネットワーク管理者 (roles/compute.networkAdmin)
- Compute セキュリティ管理者(roles/compute.securityAdmin)
- IAP で保護されたトンネル ユーザー(roles/iap.tunnelResourceAccessor)
- Logging 管理者(roles/logging.admin)
- Notebooks 管理者(roles/notebooks.admin)
- Project IAM 管理者(roles/resourcemanager.projectIamAdmin)
- 割り当て管理者(roles/servicemanagement.quotaAdmin)
- サービス アカウント管理者(roles/iam.serviceAccountAdmin)
- サービス アカウント ユーザー (roles/iam.serviceAccountUser)
- Vertex AI 管理者 (roles/aiplatform.admin)
2. 始める前に
このチュートリアルでは、$variables を使用して、Cloud Shell での gcloud 構成の実装を支援します。
Cloud Shell で、次の操作を行います。
gcloud config list project
gcloud config set project [YOUR-PROJECT-NAME]
projectid=YOUR-PROJECT-NAME
echo $projectid
チュートリアルをサポートするようにプロジェクトを更新する
Cloud Shell で、次の操作を行います。
gcloud services enable notebooks.googleapis.com
gcloud services enable aiplatform.googleapis.com
gcloud services enable compute.googleapis.com
gcloud services enable cloudresourcemanager.googleapis.com
3. コンシューマーの設定
コンシューマー VPC を作成する
Cloud Shell で、次の操作を行います。
gcloud compute networks create consumer-vpc --project=$projectid --subnet-mode=custom
コンシューマー サブネットを作成する
Cloud Shell で、次の操作を行います。
gcloud compute networks subnets create test-subnet-1 --project=$projectid --range=192.168.20.0/28 --network=consumer-vpc --region=us-central1
Cloud Shell で、次の操作を行います。
gcloud compute networks subnets create test-subnet-2 --project=$projectid --range=192.168.30.0/28 --network=consumer-vpc --region=us-central1
Cloud Shell で、次の操作を行います。
gcloud compute networks subnets create workbench-subnet --project=$projectid --range=192.168.40.0/28 --network=consumer-vpc --region=us-central1 --enable-private-ip-google-access
Cloud Router と NAT 構成
ノートブック インスタンスに外部 IP アドレスがないため、ノートブック ソフトウェア パッケージのダウンロードには Cloud ネットワーク アドレス変換(NAT)が使用されます。Cloud NAT には下り(外向き)NAT 機能があります。つまり、インターネット ホストはユーザー管理ノートブックとの通信を開始できないため、セキュリティが強化されます。
Cloud Shell 内で、リージョン Cloud Router を作成します。
gcloud compute routers create cloud-router-us-central1 --network consumer-vpc --region us-central1
Cloud Shell 内で、リージョン クラウド NAT ゲートウェイを作成します。
gcloud compute routers nats create cloud-nat-us-central1 --router=cloud-router-us-central1 --auto-allocate-nat-external-ips --nat-all-subnet-ip-ranges --region us-central1
Private Service Connect ネットワーク アタッチメント サブネットを作成する
Cloud Shell 内で、Vertex AI Pipelines で使用されるネットワーク アタッチメント サブネットを作成します。
gcloud compute networks subnets create intf-subnet --project=$projectid --range=192.168.10.0/28 --network=consumer-vpc --region=us-central1
4. Identity-Aware Proxy(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 内で、コンシューマー VM インスタンス test-svc-1 を作成します。
gcloud compute instances create test-svc-1 \
--project=$projectid \
--machine-type=e2-micro \
--image-family debian-11 \
--no-address \
--image-project debian-cloud \
--zone us-central1-a \
--subnet=test-subnet-1 \
--shielded-secure-boot
Cloud Shell 内で、コンシューマー VM インスタンス test-svc-2 を作成します。
gcloud compute instances create test-svc-2 \
--project=$projectid \
--machine-type=e2-micro \
--image-family debian-11 \
--no-address \
--image-project debian-cloud \
--zone us-central1-a \
--subnet=test-subnet-2 \
--shielded-secure-boot
インスタンスの IP アドレスを取得して保存します。
Cloud Shell 内で、テスト VM インスタンスに対して説明を実行します。
gcloud compute instances describe test-svc-1 --zone=us-central1-a | grep networkIP:
gcloud compute instances describe test-svc-2 --zone=us-central1-a | grep networkIP:
例:
user@cloudshell(psc-vertex)$ gcloud compute instances describe test-svc-1 --zone=us-central1-a | grep networkIP:
gcloud compute instances describe test-svc-2 --zone=us-central1-a | grep networkIP:
networkIP: 192.168.20.2
networkIP: 192.168.30.2
6. Private Service Connect ネットワーク アタッチメント
ネットワーク アタッチメントは、Private Service Connect インターフェースのコンシューマー側を表すリージョン リソースです。単一のサブネットをネットワーク アタッチメントに関連付けると、プロデューサー(Vertex AI Pipelines)はそのサブネットから Private Service Connect インターフェースに IP を割り当てます。
ネットワーク アタッチメントを作成する
Cloud Shell 内で、ネットワーク アタッチメントを作成します。
gcloud compute network-attachments create psc-network-attachment \
--region=us-central1 \
--connection-preference=ACCEPT_MANUAL \
--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-network-attachment URI をメモします。
次の例では、PSC ネットワーク アタッチメント URI は次のとおりです。
projects/psc-vertex/regions/us-central1/networkAttachments/psc-network-attachment
user@cloudshell$ gcloud compute network-attachments describe psc-network-attachment --region=us-central1
connectionPreference: ACCEPT_MANUAL
creationTimestamp: '2025-01-21T12:25:25.385-08:00'
fingerprint: m9bHc9qnosY=
id: '56224423547354202'
kind: compute#networkAttachment
name: psc-network-attachment
network: https://www.googleapis.com/compute/v1/projects/psc-vertex/global/networks/consumer-vpc
region: https://www.googleapis.com/compute/v1/projects/psc-vertex/regions/us-central1
selfLink: https://www.googleapis.com/compute/v1/projects/psc-vertex/regions/us-central1/networkAttachments/psc-network-attachment
subnetworks:
- https://www.googleapis.com/compute/v1/projects/psc-vertex/regions/us-central1/subnetworks/intf-subnet
7. Vertex AI Workbench の設定
次のセクションでは、Jupyter Notebook の作成手順について説明します。このノートブックは、Vertex AI Pipelines からテスト インスタンスに PING を送信する Pipelines ジョブをデプロイするために使用されます。インスタンスを含む Vertex AI Pipelines とコンシューマー ネットワーク間のデータパスは、Private Service Connect ネットワーク インターフェースを使用します。
ユーザー管理のサービス アカウントを作成する
次のセクションでは、チュートリアルで使用する 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"
Vertex AI Workbench インスタンスを作成する
次のセクションでは、前に作成したサービス アカウント notebook-sa を組み込んだ Vertex AI Workbench インスタンスを作成します。
Cloud Shell 内で private-client インスタンスを作成します。
gcloud workbench instances create workbench-tutorial --vm-image-project=deeplearning-platform-release --vm-image-family=common-cpu-notebooks --machine-type=n1-standard-4 --location=us-central1-a --subnet-region=us-central1 --subnet=workbench-subnet --disable-public-ip --shielded-secure-boot=true --service-account-email=notebook-sa@$projectid.iam.gserviceaccount.com
8. Vertex AI Pipelines から test-svc-1 への接続
新しい Cloud Shell タブを開き、プロジェクト設定を更新します。
Cloud Shell で、次の操作を行います。
gcloud config list project
gcloud config set project [YOUR-PROJECT-NAME]
projectid=YOUR-PROJECT-NAME
echo $projectid
Vertex AI Pipelines から test-svc-1 への接続を許可するには、PSC ネットワーク アタッチメントを送信元(192.168.10.0/28)、test-svc-1 IP アドレスを宛先として指定する上り(内向き)ファイアウォール ルールを作成します。
Cloud Shell 内で、test-svc-1 の IP アドレスと一致するように destination-range を更新します。
gcloud compute --project=$projectid firewall-rules create allow-icmp-vertex-pipelines-to-test-svc1-vm --direction=INGRESS --priority=1000 --network=consumer-vpc --action=ALLOW --source-ranges=192.168.10.0/28 --destination-ranges=<your-test-svc-1-vm-ip> --rules=icmp
例:
gcloud compute --project=$projectid firewall-rules create allow-icmp-vertex-pipelines-to-test-svc1-vm --direction=INGRESS --priority=1000 --network=consumer-vpc --action=ALLOW --source-ranges=192.168.10.0/28 --destination-ranges=192.168.20.2 --rules=icmp
Cloud Shell で IAP を使用して test-svc-1 インスタンスにログインします。
gcloud compute ssh test-svc-1 --project=$projectid --zone=us-central1-a --tunnel-through-iap
OS で tcpdump を実行して、icmp トラフィックをキャプチャします。この OS セッションは、Vertex AI Pipeline と VM 間の通信を検証するために使用されます。
sudo tcpdump -i any icmp -nn
9. Vertex AI サービス エージェントの更新
Vertex AI Pipelines は、PSC インターフェースの作成に使用される PSC ネットワーク アタッチメント サブネットから IP アドレスを取得するなどのオペレーションをユーザーに代わって実行します。これを行うため、Vertex AI Pipelines は ネットワーク管理者権限を必要とするサービス エージェント(下記)を使用します。
service-$projectnumber@gcp-sa-aiplatform.iam.gserviceaccount.com
Cloud Shell で、プロジェクト番号を取得します。
gcloud projects describe $projectid | grep projectNumber
例:
gcloud projects describe $projectid | grep projectNumber:
projectNumber: '795057945528'
Cloud Shell 内で、ロール compute.networkAdmin を使用してサービス エージェント アカウントを更新します。
gcloud projects add-iam-policy-binding $projectid --member="serviceAccount:service-<your-projectnumber>@gcp-sa-aiplatform.iam.gserviceaccount.com" --role="roles/compute.networkAdmin"
例:
gcloud projects add-iam-policy-binding $projectid --member="serviceAccount:service-795057945528@gcp-sa-aiplatform.iam.gserviceaccount.com" --role="roles/compute.networkAdmin"
10. デフォルトのサービス アカウントの更新
Compute Engine API を有効にして、Vertex AI へのアクセス権をデフォルトのサービス アカウントに付与します。アクセス権の変更が反映されるまでに時間がかかることがあります。
Cloud Shell 内で、デフォルトのサービス アカウントを aiplatform.user ロールで更新します。
gcloud projects add-iam-policy-binding $projectid \
--member="serviceAccount:<your-projectnumber>-compute@developer.gserviceaccount.com" \
--role="roles/aiplatform.user"
例:
gcloud projects add-iam-policy-binding $projectid \
--member="serviceAccount:795057945528-compute@developer.gserviceaccount.com" \
--role="roles/aiplatform.user"
11. Vertex AI Pipelines ジョブをデプロイする
次のセクションでは、コンシューマー test-svc-1 インスタンスへの PING を正常に実行するノートブックを作成します。
Vertex AI Workbench インスタンスでトレーニング ジョブを実行します。
- Google Cloud コンソールで、Vertex AI Workbench ページの [インスタンス] タブに移動します。
- Vertex AI Workbench インスタンス名(workbench-tutorial)の横にある [JupyterLab を開く] をクリックします。JupyterLab で Vertex AI Workbench インスタンスが開きます。
- [ファイル] > [新規] > [ノートブック] の順に選択します。
- [Kernel] > [Python 3] を選択します。
- 新しいノートブックのセルで次のコマンドを実行して、pip の最新バージョンがあることを確認します。
! pip3 install --upgrade --quiet google-cloud-aiplatform \
kfp \
google-cloud-pipeline-components
- 新しいノートブック セルでプロジェクト変数を設定する
PROJECT_ID = "<your-projectid>"
REGION = "<your-region>"
NETWORK_ATTACHMENT_NAME = "psc-network-attachment"
例:
PROJECT_ID = "psc-vertex"
REGION = "us-central1"
NETWORK_ATTACHMENT_NAME = "psc-network-attachment"
- 新しいノートブック セルでグローバルに一意のバケット名を変数として定義する
BUCKET_URI = f"gs://<your-bucket-name>"
例:
BUCKET_URI = f"gs://psc-vertex-bucket"
- 新しいノートブック セルでバケットを作成します。
! gsutil mb -l {REGION} -p {PROJECT_ID} {BUCKET_URI}
次のセクションでは、パイプライン ジョブの実行に使用するデフォルトの Compute Engine サービス アカウントを特定し、適切な権限を付与します。
shell_output = ! gcloud projects describe $PROJECT_ID
PROJECT_NUMBER = shell_output[-1].split(":")[1].strip().replace("'", "")
SERVICE_ACCOUNT = f"{PROJECT_NUMBER}-compute@developer.gserviceaccount.com"
print(f"Project Number: {PROJECT_NUMBER}")
print(f"Service Account: {SERVICE_ACCOUNT}")
実行が成功したことを確認するために、サービス アカウントとプロジェクト番号が出力されます。
- 新しいノートブック セルで、前の手順で作成したバケット内のパイプライン アーティファクトに対する読み取り / 書き込み権限をサービス アカウントに付与します。
! gsutil iam ch serviceAccount:{SERVICE_ACCOUNT}:roles/storage.objectCreator {BUCKET_URI}
! gsutil iam ch serviceAccount:{SERVICE_ACCOUNT}:roles/storage.objectViewer {BUCKET_URI}
- 新しいノートブック セルで、パイプライン パラメータを定義します。NETWORK_ATTACHMENT_NAME は PSC ネットワーク アタッチメントであるため、一致している必要があります。
PIPELINE_ROOT = f"{BUCKET_URI}/pipeline_root/psc_test"
NETWORK_ATTACHMENT_URI = f"projects/{PROJECT_NUMBER}/regions/{REGION}/networkAttachments/{NETWORK_ATTACHMENT_NAME}"
- 新しいノートブック セルで Vertex AI SDK を初期化する
from kfp import dsl
from google.cloud import aiplatform, aiplatform_v1beta1
import time
from google.cloud.aiplatform_v1.types import pipeline_state
import yaml
from datetime import datetime
import logging
aiplatform.init(project=PROJECT_ID, location=REGION, staging_bucket=BUCKET_URI)
# Configure logging
logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s')
- 新しいノートブック セルで、テスト コンポーネントを定義します。
@dsl.container_component
def ping_check(network_address: str):
"""Pings a network address
Args:
network_address: The IP address to ping
"""
return dsl.ContainerSpec(
image="ubuntu:22.04",
command=["sh", "-c"],
args=[
f"""
# Use sed for regex replacement, cleaner than bash parameter expansion for this
cleaned_address=$(echo "{network_address}" | sed 's/[^0-9.]//g')
apt-get update && apt-get install inetutils-traceroute inetutils-ping -y
echo "Will ping $cleaned_address"
if ! ping -c 3 $cleaned_address; then
echo "Ping failed"
traceroute -w 1 -m 7 $cleaned_address
exit 1
fi
"""
],
)
- 新しいノートブックのセルで、パイプラインを定義します。
@dsl.pipeline(name="check-connectivity")
def pipeline(ip_address: str):
"""Pings an IP address. Facilitated by a Private Service Connect Interface
Args:
ip_address: The IP address to ping
"""
ping_check(network_address=ip_address).set_caching_options(False)
return
- 新しいノートブックのセルでユーティリティ関数を実行し、パイプラインが完了するまで待ちます。
def wait_for_pipeline(
project_id: str,
region: str,
pipeline_job_resource_name: str,
timeout: int = 20 * 60, # Default timeout of 20 minutes (in seconds)
) -> bool:
"""
Waits for a Vertex AI pipeline to finish, with a timeout.
Args:
project_id (str): The Google Cloud project ID.
region (str): The region where the pipeline is running.
pipeline_job_resource_name (str): The resource name of the pipeline job.
timeout (int): The maximum time to wait for the pipeline to finish, in seconds.
Defaults to 20 minutes (1200 seconds).
Returns:
bool: True if the pipeline succeeded, False otherwise.
Raises:
TimeoutError: If the pipeline does not finish within the specified timeout.
"""
# Initialize the AIPlatform client
aiplatform.init(project=project_id, location=region)
# Get the pipeline job
pipeline_job = aiplatform.PipelineJob.get(resource_name=pipeline_job_resource_name)
logging.info(
f"Vertex AI Console Link: https://console.cloud.google.com/vertex-ai/pipelines/locations/{region}/runs/{pipeline_job.resource_name.split('/')[-1]}?project={project_id}"
)
start_time = time.time()
while True:
status = pipeline_job.state
logging.info(f"Pipeline Job status: {status.name}")
if status in [
pipeline_state.PipelineState.PIPELINE_STATE_SUCCEEDED,
pipeline_state.PipelineState.PIPELINE_STATE_FAILED,
pipeline_state.PipelineState.PIPELINE_STATE_CANCELLED,
]:
break # Exit the loop if the job is finished
if time.time() - start_time > timeout:
logging.error(f"Pipeline timed out after {timeout} seconds.")
raise TimeoutError(f"Pipeline timed out after {timeout} seconds.")
# Wait for a short time before checking again
time.sleep(10) # Adjust the wait time as needed
# Do something based on the final status
if status == pipeline_state.PipelineState.PIPELINE_STATE_SUCCEEDED:
logging.info("Pipeline succeeded")
return True
elif status == pipeline_state.PipelineState.PIPELINE_STATE_CANCELLED:
logging.error("Pipeline cancelled")
raise Exception("Pipeline cancelled")
elif status == pipeline_state.PipelineState.PIPELINE_STATE_FAILED:
logging.error("Pipeline failed")
raise Exception("Pipeline failed")
- 新しいノートブックのセルで、ユーティリティ関数を実行してパイプラインを実行します。
def run_job_with_psc_interface_config(
project_id: str,
region: str,
pipeline_root: str,
network_attachment_name: str,
ip_address: str,
local_pipeline_file: str = "pipeline.yaml",
):
"""
Compiles, submits, and monitors a Vertex AI pipeline.
"""
parameter_values = {"ip_address": ip_address}
pipeline_root = f"{pipeline_root}/{datetime.now().strftime('%Y%m%d%H%M%S')}"
logging.info("Compiling pipeline")
try:
with open(local_pipeline_file, "r") as stream:
pipeline_spec = yaml.safe_load(stream)
logging.info(f"Pipeline Spec: {pipeline_spec}")
except yaml.YAMLError as exc:
logging.error(f"Error loading pipeline yaml file: {exc}")
raise
logging.info(f"Will use pipeline root: {pipeline_root}")
# Initialize the Vertex SDK using PROJECT_ID and LOCATION
aiplatform.init(project=project_id, location=region)
# Create the API endpoint
client_options = {"api_endpoint": f"{region}-aiplatform.googleapis.com"}
# Initialize the PipelineServiceClient
client = aiplatform_v1beta1.PipelineServiceClient(client_options=client_options)
# Construct the request
request = aiplatform_v1beta1.CreatePipelineJobRequest(
parent=f"projects/{project_id}/locations/{region}",
pipeline_job=aiplatform_v1beta1.PipelineJob(
display_name="pipeline-with-psc-interface-config",
pipeline_spec=pipeline_spec,
runtime_config=aiplatform_v1beta1.PipelineJob.RuntimeConfig(
gcs_output_directory=pipeline_root, parameter_values=parameter_values
),
psc_interface_config=aiplatform_v1beta1.PscInterfaceConfig(
network_attachment=network_attachment_name
),
),
)
# Make the API call
response = client.create_pipeline_job(request=request)
# Print the response
logging.info(f"Pipeline job created: {response.name}")
return response.name
- 新しいノートブック セルでパイプラインをコンパイルする
from kfp import compiler
compiler.Compiler().compile(pipeline_func=pipeline, package_path='pipeline.yaml')
- 新しいノートブック セルで、TARGET_IP_ADDRESS を更新して、前の手順で取得した test-svc-1 の IP アドレスを反映し、パイプライン ジョブのステータスを確認します。
TARGET_IP_ADDRESS = "<your-test-svc-1-ip>"
try:
job_name = run_job_with_psc_interface_config(
project_id=PROJECT_ID,
region=REGION,
pipeline_root=PIPELINE_ROOT,
network_attachment_name=NETWORK_ATTACHMENT_URI,
ip_address=TARGET_IP_ADDRESS,
)
wait_for_pipeline(
project_id=PROJECT_ID,
region=REGION,
pipeline_job_resource_name=job_name,
)
except Exception as e:
logging.error(f"An error occurred: {e}")
例:
TARGET_IP_ADDRESS = "192.168.20.2"
try:
job_name = run_job_with_psc_interface_config(
project_id=PROJECT_ID,
region=REGION,
pipeline_root=PIPELINE_ROOT,
network_attachment_name=NETWORK_ATTACHMENT_URI,
ip_address=TARGET_IP_ADDRESS,
)
wait_for_pipeline(
project_id=PROJECT_ID,
region=REGION,
pipeline_job_resource_name=job_name,
)
except Exception as e:
logging.error(f"An error occurred: {e}")
ステップ 17 を実行すると、パイプラインが完了するまでに約 8 分かかります。
12. test-svc-1 への接続を検証します。
ステップ 17 の実行に使用したセルで、パイプライン ジョブのステータスが PIPELINE_STATE_PENDING から PIPELINE_STATE_RUNNING に移行し、最終的に PIPELINE_STATE_SUCCEEDED に移行することを確認します。これは、Vertex AI Pipelines からの ping が成功し、test-svc-1 からのレスポンスがあったことを示します。
Vertex AI Pipeline と test-svc-1 間の ICMP トラフィックを検証するには、test-svc-1 OS で実行された以前に生成された tcpdump セッションを表示します。これにより、双方向トラフィックを示すログが提供されます。
tcpdump の例では、Vertex AI Pipelines は 192.168.10.0/28 サブネットから IP アドレス 192.168.10.3 を取得し、192.168.20.2 は test-svc-1 の IP アドレスです。なお、環境によっては IP アドレスが異なる場合があります。
user@test-svc-1:~$ sudo tcpdump -i any icmp -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
18:57:54.737490 ens4 In IP 192.168.10.3 > 192.168.20.2: ICMP echo request, id 257, seq 0, length 64
18:57:54.737523 ens4 Out IP 192.168.20.2 > 192.168.10.3: ICMP echo reply, id 257, seq 0, length 64
13. Vertex AI Pipelines AI から test-svc-2 への接続
次のセクションでは、Vertex AI Pilelines サブネット(192.168.10.0/28)から test-svc-2 へのトラフィックを拒否する上り(内向き)ファイアウォール ルールを作成し、test-svc-2 の IP アドレスを反映するように Notebook を更新してから、パイプライン ジョブの実行を行います。
ノートブック セルで、パイプライン ジョブのステータスが「エラー - パイプラインが失敗しました」と表示されます。また、ファイアウォール ロギングには、接続の失敗に関する分析情報が表示されます。
上り(内向き)拒否ファイアウォール ルールを作成する
Vertex AI Pipelines から test-svc-2 への接続を拒否するには、PSC ネットワーク アタッチメントを送信元(192.168.10.0/28)として指定し、test-svc-2 の IP アドレスを宛先として指定する上り(内向き)ファイアウォール ルールを作成します。
Cloud Shell 内で、宛先範囲を test-svc-2 の IP アドレスと一致するように更新します。
gcloud compute --project=$projectid firewall-rules create deny-icmp-vertex-pipelines-to-test-svc2-vm --direction=INGRESS --priority=1000 --network=consumer-vpc --action=DENY --source-ranges=192.168.10.0/28 --rules=ALL --destination-ranges=<your-test-svc-2-vm-ip> --rules=icmp --enable-logging
例:
gcloud compute --project=$projectid firewall-rules create deny-icmp-vertex-pipelines-to-test-svc2-vm --direction=INGRESS --priority=1000 --network=consumer-vpc --action=DENY --source-ranges=192.168.10.0/28 --rules=ALL --destination-ranges=192.168.30.2 --enable-logging
ノートブック セルからパイプライン ジョブを実行する
新しいノートブック セルで、TARGET_IP_ADDRESS を更新して、前の手順で取得した test-svc-2 の IP アドレスを反映させ、パイプライン ジョブのステータスを確認します。
TARGET_IP_ADDRESS = "<your-test-svc-2-ip>"
try:
job_name = run_job_with_psc_interface_config(
project_id=PROJECT_ID,
region=REGION,
pipeline_root=PIPELINE_ROOT,
network_attachment_name=NETWORK_ATTACHMENT_URI,
ip_address=TARGET_IP_ADDRESS,
)
wait_for_pipeline(
project_id=PROJECT_ID,
region=REGION,
pipeline_job_resource_name=job_name,
)
except Exception as e:
logging.error(f"An error occurred: {e}")
例:
TARGET_IP_ADDRESS = "192.168.30.2"
try:
job_name = run_job_with_psc_interface_config(
project_id=PROJECT_ID,
region=REGION,
pipeline_root=PIPELINE_ROOT,
network_attachment_name=NETWORK_ATTACHMENT_URI,
ip_address=TARGET_IP_ADDRESS,
)
wait_for_pipeline(
project_id=PROJECT_ID,
region=REGION,
pipeline_job_resource_name=job_name,
)
except Exception as e:
logging.error(f"An error occurred: {e}")
実行されると、パイプライン ジョブが完了するまでに約 8 分かかります。
14. test-svc-2 への接続が失敗したことを検証します。
パイプライン ジョブの実行に使用したセルで、PIPELINE_STATE_PENDING から PIPELINE_STATE_FAILED へのステータス遷移を確認します。これは、Vertex AI Pipelines からの ping が成功せず、test-svc-2 からの応答がないことを示しています。
ログ エクスプローラを使用すると、Vertex AI Pipelines サブネット(192.168.10.0/28)と test-svc-2 IP アドレスで構成される上り(内向き)拒否ルールに一致するファイアウォール ロギング エントリを表示できます。
[クエリを表示] を選択し、以下のフィルタを挿入して、[過去 15 分間] を選択し、[クエリを実行] をクリックします。
jsonPayload.rule_details.reference:("network:consumer-vpc/firewall:deny-icmp-vertex-pipelines-to-test-svc2-vm")


ログエントリを選択し、ネストされたフィールドを展開して、拒否された上り(内向き)ファイアウォール ルールを検証する Vertex AI Pipelines と test-svc-2 IP アドレスで構成される情報要素を表示します。

15. クリーンアップ
Cloud Shell から、チュートリアルのコンポーネントを削除します。
gcloud compute instances delete test-svc-1 test-svc-2 --zone=us-central1-a --quiet
gcloud workbench instances delete workbench-tutorial --location=us-central1-a --quiet
gcloud compute firewall-rules delete deny-icmp-vertex-pipelines-to-test-svc2-vm allow-icmp-vertex-pipelines-to-test-svc1-vm ssh-iap-consumer --quiet
gcloud compute routers nats delete cloud-nat-us-central1 --router=cloud-router-us-central1 --region us-central1 --quiet
gcloud compute routers delete cloud-router-us-central1 --region=us-central1 --quiet
16. 完了
お疲れさまでした。上り(内向き)許可と拒否のファイアウォールを実装して、Private Service Connect インターフェースとコンシューマーとプロデューサーの接続を構成して検証することができました。
コンシューマー インフラストラクチャを作成し、Vertex AI Pipelines サービスが PSC インターフェース VM を作成してコンシューマーとプロデューサーの通信をブリッジできるようにするネットワーク アタッチメントを追加しました。コンシューマー VPC ネットワークで、コンシューマー ネットワーク内のインスタンスへの接続を許可または拒否するファイアウォール ルールを作成する方法を学習しました。
Cosmopup はチュートリアルが大好きです。
