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 に単一の psc-network-attachment を作成すると、次のユースケースが実現されます。
- Vertex AI Pipeline サブネット(192.168.10.0/28)が test-svc-1 にアクセスできるように、consumer-vpc に上り(内向き)ファイアウォール ルールを作成します。TCPDUMP を使用して、Pipeline Job から test-svc-1 に生成された PING が正常に実行されたことを確認する
- Vertex AI Pipeline サブネット(192.168.10.0/28)から test-svc-2 へのアクセスを拒否する上り(内向き)ファイアウォール ルールを consumer-vpc に作成します。ログ エクスプローラによって生成されたファイアウォール ログに基づいて、PING の失敗を確認します。
学習内容
- ネットワーク アタッチメントを作成する方法
- Vertex AI Pipelines でネットワーク アタッチメントを使用して PSC インターフェースを作成する方法
- プロデューサーからコンシューマーへの通信を確立する方法
- Vertex AI Pipelines からコンシューマ VM(test-svc-1)へのアクセスを許可する方法
- Cloud Firewall を使用して Vertex 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 で、リージョン クラウド ルーターを作成します。
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 Job をデプロイするために使用します。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 のデフォルトのサービス アカウントを使用して Pipeline Job をインスタンス化できるようにします。
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 で、限定公開クライアント インスタンスを作成します。
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 で、destination-range を更新して、test-svc-1 の IP アドレスと一致させます。
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 インスタンスが開きます。
- [ファイル] > [新規] > [ノートブック] を選択します。
- [Select 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 Pipelines サブネット(192.168.10.0/28)から test-svc-2 へのトラフィックを拒否する上り(内向き)ファイアウォール ルールを作成し、次に Notebook を更新して test-svc-2 IP アドレスを反映させ、最後に Pipelines Jobs の実行を実行します。
ノートブックのセルのパイプラインのジョブステータスは「Error - Pipeline Failed」になります。また、ファイアウォール ロギングに接続エラーに関する分析情報が表示されます。
上り(内向き)拒否ファイアウォール ルールを作成する
Vertex AI Pipelines から test-svc-2 への接続を拒否するには、PSC ネットワーク アタッチメントを送信元(192.168.10.0/28)として、test-svc-2 IP アドレスを宛先として指定する上り(内向き)ファイアウォール ルールを作成します。
Cloud Shell で、destination-range を更新して、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 への接続が失敗したことを確認します。
Pipelines Job の実行に使用したセルで、Vertex AI Pipelines からの ping と test-svc-2 からのレスポンスが失敗したことを示す、ステータスが PIPELINE_STATE_PENDING から PIPELINE_STATE_FAILED に移行したことを確認します。
Log Explorer を使用すると、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 はチュートリアルが大好きです。