Interfaccia Private Service Connect per le pipeline Vertex AI

1. Introduzione

Un'interfaccia Private Service Connect è una risorsa che consente a una rete Virtual Private Cloud (VPC) producer di avviare connessioni a varie destinazioni in una rete consumer. Le reti producer e consumer possono trovarsi in progetti e organizzazioni diversi.

Una connessione tra un collegamento di rete e un'interfaccia Private Service Connect è simile alla connessione tra un endpoint Private Service Connect e un collegamento al servizio, ma presenta due differenze fondamentali:

  • Un collegamento di rete consente a una rete producer di avviare connessioni a una rete consumer (uscita del servizio gestito), mentre un endpoint consente a una rete consumer di avviare connessioni a una rete producer (ingresso del servizio gestito).
  • Una connessione di interfaccia Private Service Connect è transitiva. Ciò significa che una rete producer può comunicare con altre reti connesse alla rete consumer.

Cosa creerai

Vertex AI Pipelines, di cui è stato eseguito il deployment in un progetto tenant gestito da Google, sfrutterà l'allegato di rete PSC per creare un'istanza multi-NIC tra la rete producer e consumer. Poiché il collegamento di rete PSC viene implementato con una scheda di rete multipla dalla rete consumer, Vertex AI Pipelines può raggiungere le route disponibili dalla rete consumer.

In questo tutorial, creerai un'architettura di interfaccia Private Service Connect (PSC) completa per Vertex AI Pipelines che utilizza le regole firewall Cloud per consentire o negare la connettività dal producer alle istanze di test del consumer, come illustrato nella Figura 1.

Figura 1

12714b6f0f8fa411.png

Creerai un singolo psc-network-attachment nel VPC consumer, il che comporterà i seguenti casi d'uso:

  1. Crea una regola firewall in entrata in consumer-vpc che consenta alla subnet di Vertex AI Pipeline (192.168.10.0/28) di accedere a test-svc-1. Conferma la generazione di PING riuscita dal job della pipeline a test-svc-1 utilizzando TCPDUMP
  2. Crea una regola firewall in entrata in consumer-vpc che nega alla subnet della pipeline Vertex AI (192.168.10.0/28) l'accesso a test-svc-2. Conferma l'errore PING in base ai log del firewall generati da Esplora log.

Cosa imparerai a fare

  • Come creare un collegamento di rete
  • In che modo Vertex AI Pipelines può utilizzare un collegamento di rete per creare un'interfaccia PSC
  • Come stabilire la comunicazione dal produttore al consumatore
  • Come consentire l'accesso da Vertex AI Pipelines alla VM consumer test-svc-1
  • Come negare l'accesso da Vertex AI Pipelines alla VM consumer, test-svc-2, utilizzando Cloud Firewall

Che cosa ti serve

2. Prima di iniziare

Questo tutorial utilizza le variabili $per facilitare l'implementazione della configurazione di gcloud in Cloud Shell.

In Cloud Shell, esegui le seguenti operazioni:

gcloud config list project
gcloud config set project [YOUR-PROJECT-NAME]
projectid=YOUR-PROJECT-NAME
echo $projectid

Aggiornare il progetto per supportare il tutorial

In Cloud Shell, esegui le seguenti operazioni:

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. Configurazione consumatore

Crea il VPC consumer

In Cloud Shell, esegui le seguenti operazioni:

gcloud compute networks create consumer-vpc --project=$projectid --subnet-mode=custom

Crea le subnet consumer

In Cloud Shell, esegui le seguenti operazioni:

gcloud compute networks subnets create test-subnet-1 --project=$projectid --range=192.168.20.0/28 --network=consumer-vpc --region=us-central1

In Cloud Shell, esegui le seguenti operazioni:

gcloud compute networks subnets create test-subnet-2 --project=$projectid --range=192.168.30.0/28 --network=consumer-vpc --region=us-central1

In Cloud Shell, esegui le seguenti operazioni:

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

Configurazione di Cloud Router e NAT

Cloud Network Address Translation (NAT) viene utilizzato nel tutorial per i download dei pacchetti software del notebook, poiché l'istanza del notebook non ha un indirizzo IP esterno. Cloud NAT offre funzionalità NAT in uscita, il che significa che gli host internet non sono autorizzati ad avviare la comunicazione con un notebook gestito dall'utente, rendendolo più sicuro.

In Cloud Shell, crea il router cloud regionale.

gcloud compute routers create cloud-router-us-central1 --network consumer-vpc --region us-central1

In Cloud Shell, crea il gateway Cloud NAT regionale.

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

Crea la subnet del collegamento di rete Private Service Connect

In Cloud Shell, crea la subnet Network Attachment utilizzata da 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. Abilitare Identity-Aware Proxy (IAP)

Per consentire a IAP di connettersi alle tue istanze VM, crea una regola firewall che:

  • Si applichi a tutte le istanze VM a cui vuoi accedere tramite IAP.
  • Consente il traffico in entrata dall'intervallo IP 35.235.240.0/20. Questo intervallo contiene tutti gli indirizzi IP che utilizzati da IAP per l'inoltro TCP.

In Cloud Shell, crea la regola firewall IAP.

gcloud compute firewall-rules create ssh-iap-consumer \
    --network consumer-vpc \
    --allow tcp:22 \
    --source-ranges=35.235.240.0/20

5. Crea istanze VM consumer

In Cloud Shell, crea l'istanza VM consumer, 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

In Cloud Shell, crea l'istanza VM consumer, 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

Ottieni e archivia gli indirizzi IP delle istanze:

In Cloud Shell, esegui un comando describe sulle istanze VM di test.

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:

Esempio:

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. Collegamento di rete Private Service Connect

I collegamenti di rete sono risorse regionali che rappresentano il lato consumer di un'interfaccia Private Service Connect. Associ una singola subnet a un collegamento di rete e il producer (Vertex AI Pipelines) assegna gli IP all'interfaccia Private Service Connect.

Crea il collegamento di rete

In Cloud Shell, crea il collegamento di rete.

gcloud compute network-attachments create psc-network-attachment \
    --region=us-central1 \
    --connection-preference=ACCEPT_MANUAL \
    --subnets=intf-subnet

Elenca i collegamenti di rete

In Cloud Shell, elenca il collegamento di rete.

gcloud compute network-attachments list

Descrivi i collegamenti di rete

In Cloud Shell, descrivi il collegamento di rete.

gcloud compute network-attachments describe psc-network-attachment --region=us-central1

Prendi nota dell'URI psc-network-attachment che verrà utilizzato dal producer durante la creazione dell'interfaccia Private Service Connect.

Nell'esempio riportato di seguito, l'URI del collegamento di rete PSC è il seguente:

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. Configurazione di Vertex AI Workbench

La sezione seguente ti guida nella creazione di un blocco note Jupyter. Questo notebook verrà utilizzato per eseguire il deployment di un job Pipelines che invia un PING da Vertex AI Pipelines alle istanze di test. Il percorso dati tra Vertex AI Pipelines e la rete consumer contenente le istanze utilizza un'interfaccia di rete Private Service Connect.

Crea un service account gestito dall'utente

Nella sezione seguente creerai un service account che verrà associato all'istanza di Vertex AI Workbench utilizzata nel tutorial.

Nel tutorial, al service account verranno applicati i seguenti ruoli:

In Cloud Shell, crea il service account.

gcloud iam service-accounts create notebook-sa \
    --display-name="notebook-sa"

In Cloud Shell, aggiorna il service account con il ruolo Storage Admin.

gcloud projects add-iam-policy-binding $projectid --member="serviceAccount:notebook-sa@$projectid.iam.gserviceaccount.com" --role="roles/storage.admin"

In Cloud Shell, aggiorna il service account con il ruolo Utente Vertex AI.

gcloud projects add-iam-policy-binding $projectid --member="serviceAccount:notebook-sa@$projectid.iam.gserviceaccount.com" --role="roles/aiplatform.user"

In Cloud Shell, aggiorna il service account con il ruolo Amministratore di Artifact Registry.

gcloud projects add-iam-policy-binding $projectid --member="serviceAccount:notebook-sa@$projectid.iam.gserviceaccount.com" --role="roles/artifactregistry.admin"

In Cloud Shell, consenti al service account del notebook di utilizzare il service account predefinito di Compute Engine per creare un'istanza del job della pipeline.

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"

Crea un'istanza di Vertex AI Workbench

Nella sezione seguente, crea un'istanza di Vertex AI Workbench che incorpori il service account creato in precedenza, notebook-sa.

In Cloud Shell, crea l'istanza 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 per testare la connettività di test-svc-1

Apri una nuova scheda di Cloud Shell e aggiorna le impostazioni del progetto.

In Cloud Shell, esegui le seguenti operazioni:

gcloud config list project
gcloud config set project [YOUR-PROJECT-NAME]
projectid=YOUR-PROJECT-NAME
echo $projectid

Per consentire la connettività da Vertex AI Pipelines a test-svc-1, crea una regola firewall in entrata che specifichi l'allegato di rete PSC come origine (192.168.10.0/28) e l'indirizzo IP di test-svc-1 come destinazione.

In Cloud Shell, aggiorna destination-range in modo che corrisponda all'indirizzo IP di test-svc-1.

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

Esempio:

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

Accedi all'istanza test-svc-1 utilizzando IAP in Cloud Shell.

gcloud compute ssh test-svc-1 --project=$projectid --zone=us-central1-a --tunnel-through-iap

Nel sistema operativo, esegui tcpdump per acquisire il traffico ICMP. Questa sessione del sistema operativo verrà utilizzata per convalidare la comunicazione tra Vertex AI Pipeline e la VM.

sudo tcpdump -i any icmp -nn

9. Aggiornamento di Vertex AI Service Agent

Vertex AI Pipelines agisce per tuo conto per eseguire operazioni come l'ottenimento di un indirizzo IP dalla subnet di collegamento di rete PSC utilizzata per creare l'interfaccia PSC. A questo scopo, Vertex AI Pipelines utilizza un service agent (elencato di seguito) che richiede l'autorizzazione Network Admin.

service-$projectnumber@gcp-sa-aiplatform.iam.gserviceaccount.com

In Cloud Shell, ottieni il numero del progetto.

gcloud projects describe $projectid | grep projectNumber

Esempio:

gcloud projects describe $projectid | grep projectNumber:
projectNumber: '795057945528'

In Cloud Shell, aggiorna l'account service agent con il ruolo compute.networkAdmin.

gcloud projects add-iam-policy-binding $projectid --member="serviceAccount:service-<your-projectnumber>@gcp-sa-aiplatform.iam.gserviceaccount.com" --role="roles/compute.networkAdmin"

Esempio:

gcloud projects add-iam-policy-binding $projectid --member="serviceAccount:service-795057945528@gcp-sa-aiplatform.iam.gserviceaccount.com" --role="roles/compute.networkAdmin"

10. Aggiornamento del service account predefinito

Abilita l'API Compute Engine e concedi al service account predefinito l'accesso a Vertex AI. Tieni presente che la propagazione della modifica dell'accesso potrebbe richiedere un po' di tempo.

In Cloud Shell, aggiorna il service account predefinito con il ruolo aiplatform.user

gcloud projects add-iam-policy-binding $projectid \
  --member="serviceAccount:<your-projectnumber>-compute@developer.gserviceaccount.com" \
    --role="roles/aiplatform.user"

Esempio:

gcloud projects add-iam-policy-binding $projectid \
  --member="serviceAccount:795057945528-compute@developer.gserviceaccount.com" \
    --role="roles/aiplatform.user"

11. Esegui il deployment del job pipeline Vertex AI

Nella sezione seguente, creerai un blocco note per eseguire un PING riuscito all'istanza test-svc-1 del consumatore.

Esegui il job di addestramento nell'istanza di Vertex AI Workbench.

  1. Nella console Google Cloud, vai alla scheda delle istanze nella pagina Vertex AI Workbench.
  2. Accanto al nome dell'istanza di Vertex AI Workbench (workbench-tutorial), fai clic su Apri JupyterLab. L'istanza di Vertex AI Workbench si apre in JupyterLab.
  3. Seleziona File > Nuovo > Notebook.
  4. Seleziona Kernel > Python 3.
  5. In una nuova cella del notebook, esegui questo comando per assicurarti di avere l'ultima versione di pip:
! pip3 install --upgrade --quiet google-cloud-aiplatform \
  kfp \
  google-cloud-pipeline-components
  1. Imposta le variabili del progetto nella nuova cella del notebook
PROJECT_ID = "<your-projectid>" 
REGION = "<your-region>"  
NETWORK_ATTACHMENT_NAME = "psc-network-attachment"

Esempio:

PROJECT_ID = "psc-vertex" 
REGION = "us-central1"  
NETWORK_ATTACHMENT_NAME = "psc-network-attachment"
  1. Definisci un nome del bucket univoco a livello globale come variabile in una nuova cella del notebook
BUCKET_URI = f"gs://<your-bucket-name>"

Esempio:

BUCKET_URI = f"gs://psc-vertex-bucket"
  1. In una nuova cella del notebook, crea il bucket
! gsutil mb -l {REGION} -p {PROJECT_ID} {BUCKET_URI}

Nella sezione seguente, determinerai il service account Compute Engine predefinito da utilizzare per eseguire il job della pipeline e gli concederai le autorizzazioni corrette.

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}")

Per confermare l'esecuzione corretta, vengono stampati il service account e il numero di progetto

  1. In una nuova cella del blocco note, concedi al service account l'autorizzazione a leggere e scrivere gli artefatti della pipeline nel bucket creato nel passaggio precedente.
! gsutil iam ch serviceAccount:{SERVICE_ACCOUNT}:roles/storage.objectCreator {BUCKET_URI}

! gsutil iam ch serviceAccount:{SERVICE_ACCOUNT}:roles/storage.objectViewer {BUCKET_URI}
  1. In una nuova cella del notebook, definisci i parametri della pipeline. Tieni presente che NETWORK_ATTACHMENT_NAME è il collegamento di rete PSC, pertanto deve corrispondere.
PIPELINE_ROOT = f"{BUCKET_URI}/pipeline_root/psc_test"
NETWORK_ATTACHMENT_URI = f"projects/{PROJECT_NUMBER}/regions/{REGION}/networkAttachments/{NETWORK_ATTACHMENT_NAME}"
  1. In una nuova cella del notebook, inizializza l'SDK Vertex AI
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. In una nuova cella del notebook, definisci il componente di test.
@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. In una nuova cella del notebook, definisci la pipeline
@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. In una nuova cella del blocco note, esegui la funzione di utilità e attendi il completamento della pipeline.
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. In una nuova cella del notebook, esegui la funzione di utilità per eseguire la pipeline
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. In una nuova cella del notebook, compila la pipeline
from kfp import compiler
compiler.Compiler().compile(pipeline_func=pipeline, package_path='pipeline.yaml')
  1. In una nuova cella del blocco note, aggiorna TARGET_IP_ADDRESS in modo che rifletta l'indirizzo IP ottenuto nel passaggio precedente per test-svc-1 e osserva lo stato del job della pipeline
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}")

Esempio:

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}")

Una volta eseguito il passaggio 17, il completamento della pipeline richiederà circa 8 minuti.

12. Convalida la connettività a test-svc-1

Nella cella utilizzata per eseguire il passaggio 17, osserva la transizione dello stato del job della pipeline da PIPELINE_STATE_PENDING a PIPELINE_STATE_RUNNING e infine a PIPELINE_STATE_SUCCEEDED, che indica un ping riuscito da Vertex AI Pipelines e una risposta da test-svc-1.

Per convalidare il traffico ICMP tra Vertex AI Pipeline e test-svc-1, visualizza la sessione tcpdump generata in precedenza eseguita nel sistema operativo test-svc-1 che fornisce log che indicano il traffico bidirezionale.

Nell'esempio tcpdump, Vertex AI Pipelines ha ottenuto l'indirizzo IP 192.168.10.3 dalla subnet 192.168.10.0/28, mentre 192.168.20.2 è l'indirizzo IP di test-svc-1. Tieni presente che nel tuo ambiente gli indirizzi IP potrebbero essere diversi.

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. Connettività di Vertex AI Pipelines AI a test-svc-2

Nella sezione seguente, creerai una regola firewall in entrata per negare il traffico dalla subnet di Vertex AI Pipelines (192.168.10.0/28) a test-svc-2, quindi aggiornerai il notebook in modo che rifletta l'indirizzo IP di test-svc-2 e infine eseguirai l'esecuzione dei job di pipeline.

Nella cella del notebook, lo stato del job della pipeline indicherà Errore - Pipeline non riuscita. Inoltre, i log del firewall forniranno informazioni sulla connessione non riuscita.

Crea una regola firewall in entrata di tipo Nega

Per negare la connettività da Vertex AI Pipelines a test-svc-2, crea una regola firewall in entrata che specifichi il collegamento di rete PSC come origine (192.168.10.0/28) e l'indirizzo IP di test-svc-2 come destinazione.

In Cloud Shell, aggiorna destination-range in modo che corrisponda all'indirizzo IP di test-svc-2.

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

Esempio:

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

Esegui il job della pipeline dalla cella del notebook

In una nuova cella del blocco note, aggiorna TARGET_IP_ADDRESS in modo che rifletta l'indirizzo IP ottenuto nel passaggio precedente per test-svc-2 e osserva lo stato del job Pipelines.

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}")

Esempio:

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}")

Una volta eseguito, il job della pipeline richiederà circa 8 minuti.

14. Convalida della connettività non riuscita a test-svc-2

Nella cella utilizzata per eseguire il job Pipelines, nota la transizione di stato da PIPELINE_STATE_PENDING a PIPELINE_STATE_FAILED, che indica un ping senza esito positivo da Vertex AI Pipelines e una risposta da test-svc-2.

Utilizzando Esplora log, puoi visualizzare le voci di logging del firewall corrispondenti alla regola Ingress Deny costituita dalla subnet di Vertex AI Pipelines (192.168.10.0/28) e dall'indirizzo IP test-svc-2.

Seleziona Mostra query e inserisci il filtro riportato di seguito, ultimi 15 minuti, quindi Esegui query.

jsonPayload.rule_details.reference:("network:consumer-vpc/firewall:deny-icmp-vertex-pipelines-to-test-svc2-vm")

20e072f26d9a113b.png

5fb3d2de0a85e3c6.png

Seleziona una voce di log, quindi espandi i campi nidificati per visualizzare gli elementi informativi costituiti dall'indirizzo IP di Vertex AI Pipelines e test-svc-2 che convalida la regola firewall in entrata negata.

903aaf2c10d07460.png

15. Esegui la pulizia

Da Cloud Shell, elimina i componenti del tutorial.

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. Complimenti

Congratulazioni, hai configurato e convalidato correttamente un'interfaccia Private Service Connect e la connettività consumer e producer implementando il firewall di autorizzazione e negazione in entrata.

Hai creato l'infrastruttura consumer e hai aggiunto un collegamento di rete che ha consentito al servizio Vertex AI Pipelines di creare una VM di interfaccia PSC per collegare la comunicazione tra consumer e producer. Hai imparato a creare regole firewall nella rete VPC consumer che consentivano e negavano la connettività alle istanze nella rete consumer.

Cosmopup pensa che i tutorial siano fantastici.

c911c127bffdee57.jpeg

Passaggi successivi

Ulteriori letture e video

Documentazione di riferimento