Private Service Connect 인터페이스 Vertex AI Pipelines

1. 소개

Private Service Connect 인터페이스는 프로듀서 Virtual Private Cloud (VPC) 네트워크가 소비자 네트워크의 다양한 대상에 연결을 시작할 수 있게 해주는 리소스입니다. 프로듀서 및 소비자 네트워크는 다른 프로젝트 및 조직에 포함될 수 있습니다.

네트워크 연결과 Private Service Connect 인터페이스 간의 연결은 Private Service Connect 엔드포인트와 서비스 연결 간의 연결과 유사하지만 두 가지 주요 차이점이 있습니다.

  • 네트워크 연결을 사용하면 프로듀서 네트워크가 소비자 네트워크 (관리형 서비스 이그레스)로의 연결을 시작할 수 있고, 엔드포인트를 사용하면 소비자 네트워크가 프로듀서 네트워크 (관리형 서비스 인그레스)에 대한 연결을 시작할 수 있습니다.
  • Private Service Connect 인터페이스 연결은 전환됩니다. 즉, 프로듀서 네트워크는 소비자 네트워크에 연결된 다른 네트워크와 통신할 수 있습니다.

빌드할 항목

Google 관리 테넌트 프로젝트에 배포된 Vertex AI Pipelines는 PSC 네트워크 연결을 활용하여 제작자 네트워크와 소비자 네트워크 간에 멀티 닉 인스턴스를 만듭니다. PSC 네트워크 연결은 소비자 네트워크의 멀티 닉으로 배포되므로 Vertex AI Pipelines는 소비자 네트워크에서 사용 가능한 경로에 도달할 수 있습니다.

이 튜토리얼에서는 Cloud 방화벽 규칙을 활용하여 그림 1과 같이 생산자에서 소비자의 테스트 인스턴스로의 연결을 허용하거나 거부하는 Vertex AI Pipelines용 포괄적인 Private Service Connect (PSC) 인터페이스 아키텍처를 빌드합니다.

그림 1

12714b6f0f8fa411.png

소비자 VPC에 단일 psc-network-attachment를 만들어 다음과 같은 사용 사례를 만듭니다.

  1. consumer-vpc에서 Vertex AI 파이프라인 서브넷 (192.168.10.0/28)이 test-svc-1에 액세스할 수 있도록 허용하는 인그레스 방화벽 규칙을 만듭니다. TCPDUMP를 사용하여 파이프라인 작업에서 test-svc-1로 생성된 PING이 성공적으로 실행되었는지 확인
  2. consumer-vpc에서 Vertex AI Pipelines 서브넷 (192.168.10.0/28)이 test-svc-2에 액세스하는 것을 거부하는 인그레스 방화벽 규칙을 만듭니다. 로그 탐색기에서 생성된 방화벽 로그를 기반으로 핑 실패를 확인합니다.

학습할 내용

  • 네트워크 연결을 만드는 방법
  • Vertex AI Pipelines에서 네트워크 첨부파일을 사용하여 PSC 인터페이스를 만드는 방법
  • 생산자에서 소비자로 커뮤니케이션을 설정하는 방법
  • Vertex AI Pipelines에서 소비자 VM test-svc-1에 대한 액세스를 허용하는 방법
  • Cloud 방화벽을 사용하여 Vertex AI Pipelines의 소비자 VM인 test-svc-2에 대한 액세스를 거부하는 방법

필요한 항목

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에서 리전 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. IAP (Identity-Aware Proxy) 사용 설정

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 파이프라인)가 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 노트북을 만드는 방법을 안내합니다. 이 노트북은 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 Admin 역할이 있는 서비스 계정을 업데이트합니다.

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 to 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 파이프라인에서 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 인스턴스에서 학습 작업을 실행합니다.

  1. Google Cloud 콘솔에서 Vertex AI Workbench 페이지의 인스턴스 탭으로 이동합니다.
  2. Vertex AI Workbench 인스턴스 이름 (workbench-tutorial) 옆에 있는 JupyterLab 열기를 클릭합니다. Vertex AI Workbench 인스턴스가 JupyterLab을 엽니다.
  3. 파일 > 새 항목 > 노트북을 선택합니다.
  4. 커널 선택 > Python 3
  5. 새 노트북 셀에서 다음 명령어를 실행하여 pip의 최신 버전을 실행하고 있는지 확인합니다.
! pip3 install --upgrade --quiet google-cloud-aiplatform \
  kfp \
  google-cloud-pipeline-components
  1. 새 노트북 셀에서 프로젝트 변수 설정
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"
  1. 새 노트북 셀에서 전역적으로 고유한 bucketname을 변수로 정의
BUCKET_URI = f"gs://<your-bucket-name>"

예:

BUCKET_URI = f"gs://psc-vertex-bucket"
  1. 새 노트북 셀에서 버킷을 만듭니다.
! 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}")

실행이 완료되었음을 확인하기 위해 서비스 계정 및 프로젝트 번호가 출력됩니다.

  1. 새 노트북 셀에서 서비스 계정에 이전 단계에서 만든 버킷의 파이프라인 아티팩트를 읽고 쓸 수 있는 권한을 부여합니다.
! gsutil iam ch serviceAccount:{SERVICE_ACCOUNT}:roles/storage.objectCreator {BUCKET_URI}

! gsutil iam ch serviceAccount:{SERVICE_ACCOUNT}:roles/storage.objectViewer {BUCKET_URI}
  1. 새 노트북 셀에서 파이프라인 매개변수를 정의합니다. 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}"
  1. 새 노트북 셀에서 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')
  1. 새 노트북 셀에서 테스트 구성요소 정의
@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
            """
        ],
    )
  1. 새 노트북 셀에서 파이프라인 정의
@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
  1. 새 노트북 셀에서 유틸리티 함수를 실행하고 파이프라인이 완료될 때까지 기다립니다.
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")
  1. 새 노트북 셀에서 유틸리티 함수를 실행하여 파이프라인을 실행합니다.
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
  1. 새 노트북 셀에서 파이프라인을 컴파일합니다.
from kfp import compiler
compiler.Compiler().compile(pipeline_func=pipeline, package_path='pipeline.yaml')
  1. 새 노트북 셀에서 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의 핑과 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 to test-svc-2 연결

다음 섹션에서는 Vertex AI 파이프라인 서브넷 (192.168.10.0/28)에서 test-svc-2로의 트래픽을 거부하는 인그레스 방화벽 규칙을 만든 후 test-svc-2 IP 주소를 반영하도록 노트북을 업데이트한 다음 마지막으로 파이프라인 작업 실행을 실행합니다.

노트북 셀에서 파이프라인 작업 상태는 오류 - 파이프라인 실패를 나타내고 방화벽 로깅은 연결 실패에 대한 통계를 제공합니다.

인그레스 방화벽 규칙 거부 만들기

Vertex AI 파이프라인에서 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 = "<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 작업을 실행하는 데 사용된 셀에서 Vertex AI Pipelines의 핑 실패와 test-svc-2의 응답을 나타내는 PIPELINE_STATE_PENDING에서 PIPELINE_STATE_FAILED로의 상태 전환을 확인합니다.

로그 탐색기를 사용하면 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")

20e072f26d9a113b.png

5fb3d2de0a85e3c6.png

로그 항목을 선택한 다음 중첩된 필드를 펼쳐 Vertex AI Pipelines 및 거부된 인그레스 방화벽 규칙을 확인하는 test-svc-2 IP 주소로 구성된 정보 요소를 표시합니다.

903aaf2c10d07460.png

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은 튜토리얼이 정말 좋다고 생각합니다.

c911c127bffdee57.jpeg

다음 단계

추가 리소스 및 동영상

참조 문서