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 ファイアウォール ルールを使用してプロデューサーからコンシューマーのテスト インスタンスへの接続を許可または拒否する、Vertex AI Pipelines 用の包括的な Private Service Connect(PSC)インターフェース アーキテクチャを構築します。
図 1

コンシューマー VPC に単一の psc-network-attachment を作成すると、次のユースケースが実現します。
- コンシューマー VPC に上り(内向き)ファイアウォール ルールを作成し、Vertex AI Pipelines サブネット(192.168.10.0/28)が test-svc-1 にアクセスできるようにします。TCPDUMP を使用して、パイプライン ジョブから test-svc-1 への PING が正常に生成されたことを確認します。
- コンシューマー VPC に上り(内向き)ファイアウォール ルールを作成し、Vertex AI Pipelines サブネット(192.168.10.0/28)が test-svc-2 にアクセスできないようにします。ログ エクスプローラで生成されたファイアウォール ログに基づいて、PING が失敗することを確認します。
学習内容
- ネットワーク アタッチメントを作成する方法
- Vertex AI Pipelines がネットワーク アタッチメントを使用して PSC インターフェースを作成する方法
- プロデューサーからコンシューマーへの通信を確立する方法
- Verex AI Pipelines からコンシューマー VM test-svc-1 へのアクセスを許可する方法
- Cloud ファイアウォールを使用して、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 には Egress NAT 機能があります。つまり、インターネット ホストはユーザー管理のノートブックとの通信を開始できないため、セキュリティが強化されます。
Cloud Shell で、リージョン Cloud Router を作成します。
gcloud compute routers create cloud-router-us-central1 --network consumer-vpc --region us-central1
Cloud Shell で、リージョン Cloud 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 インスタンスに対して describe を実行します。
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 Pipelines と 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 インスタンスが開きます。
- [File] > [New] > [Notebook] を選択します。
- [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"
- 新しいノートブックのセルで、グローバルに一意の bucketname を変数として定義します。
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 Pipelines と 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 Pipelines サブネット(192.168.10.0/28)から test-svc-2 へのトラフィックを拒否する上り(内向き)ファイアウォール ルールを作成し、test-svc-2 IP アドレスを反映するようにノートブックを更新してから、パイプライン ジョブを実行します。
ノートブック セルでは、パイプライン ジョブのステータスに [Error - Pipeline Failed] が表示されます。また、ファイアウォール ロギングには、接続の失敗に関する情報が表示されます。
上り(内向き)拒否ファイアウォール ルールを作成する
Vertex AI Pipelines から test-svc-2 への接続を拒否するには、ソースとして PSC ネットワーク アタッチメント(192.168.10.0/28)、宛先として test-svc-2 IP アドレスを指定する上り(内向き)ファイアウォール ルールを作成します。
Cloud Shell で、test-svc-2 IP アドレスと一致するように destination-range を更新します。
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 = &<quot;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 はチュートリアルが大好きです。
