1. 소개
Private Service Connect 인터페이스는 프로듀서 가상 프라이빗 클라우드 (VPC) 네트워크가 소비자 VPC 네트워크의 다양한 대상에 연결을 시작할 수 있게 해주는 리소스입니다. 프로듀서 및 소비자 네트워크는 다른 프로젝트 및 조직에 포함될 수 있습니다.
네트워크 연결이 Private Service Connect 인터페이스의 연결을 수락하면 Google Cloud는 네트워크 연결에 지정된 소비자 서브넷의 IP 주소를 인터페이스에 할당합니다. 소비자 및 프로듀서 네트워크는 내부 IP 주소를 사용하여 연결되고 통신할 수 있습니다.
네트워크 연결과 Private Service Connect 인터페이스 간의 연결은 Private Service Connect 엔드포인트와 서비스 연결 간의 연결과 유사하지만 여기에는 두 가지 주요 차이점이 있습니다.
- 네트워크 연결을 사용하면 프로듀서 네트워크가 소비자 네트워크 (관리형 서비스 이그레스)로의 연결을 시작할 수 있고, 엔드포인트를 사용하면 소비자 네트워크가 프로듀서 네트워크 (관리형 서비스 인그레스)에 대한 연결을 시작할 수 있습니다.
- Private Service Connect 인터페이스 연결은 전환됩니다. 즉, 프로듀서 네트워크는 소비자 네트워크에 연결된 다른 네트워크와 통신할 수 있습니다.
Vertex AI PSC 인터페이스 도달 가능성 고려사항
- PSC 인터페이스는 RFC1918 주소 블록 내의 VPC 또는 온프레미스 기반 대상으로 트래픽을 라우팅할 수 있습니다.
- 비 rfc-1918 주소 블록을 타겟팅하는 PSC 인터페이스에는 rfc-1918 주소가 있는 소비자의 VPC에 명시적 프록시가 배포되어야 합니다. Vertex AI 배포 내에서 프록시는 대상 엔드포인트의 FQDN과 함께 정의되어야 합니다. 다음 비 rfc-1918 CIDR로의 라우팅을 용이하게 하기 위해 고객 VPC에 구성된 명시적 프록시를 나타내는 그림 1을 참고하세요.
[1] 240.0.0.0/4
[2] 203.0.113.0/2
[3]10.10.20.0/28 프록시가 필요하지 않으며 rfc1918 범위에 속합니다.
- PSC 인터페이스만 사용하여 배포를 구성하면 기본 인터넷 액세스가 유지됩니다. 이 아웃바운드 트래픽은 안전한 Google 관리 테넌트 네트워크에서 직접 이그레스됩니다.
Vertex AI PSC 인터페이스 VPC-SC 고려사항
- 프로젝트가 VPC 서비스 제어 경계에 속하는 경우 데이터 무단 반출을 방지하기 위해 Google 관리 테넌트의 기본 인터넷 액세스가 경계에 의해 차단됩니다.
- 이 시나리오에서 배포가 공용 인터넷에 액세스하도록 허용하려면 VPC를 통해 트래픽을 라우팅하는 보안 이그레스 경로를 명시적으로 구성해야 합니다. 이를 달성하는 데 권장되는 방법은 RFC1918 주소로 VPC 경계 내에 프록시 서버를 설정하고 프록시 VM이 인터넷에 액세스할 수 있도록 Cloud NAT 게이트웨이를 만드는 것입니다.
자세한 내용은 다음 리소스를 참고하세요.
Vertex AI 리소스에 대한 Private Service Connect 인터페이스 설정 | Google Cloud
빌드할 항목
이 튜토리얼에서는 Private Service Connect(PSC) 인터페이스를 사용하여 포괄적인 Vertex AI Pipelines 배포를 빌드하여 그림 1에 표시된 대로 생산자에서 소비자의 컴퓨팅으로 연결할 수 있도록 합니다(rfc-1928이 아닌 엔드포인트 타겟팅).
그림 2
DNS 피어링을 활용하여 Vertex AI Training을 호스팅하는 테넌트 프로젝트에서 소비자 VM을 확인하는 소비자 VPC에 단일 psc-network-attachment를 만들어 다음과 같은 사용 사례를 만듭니다.
- Vertex AI Pipelines를 배포하고 명시적 프록시 역할을 하는 프록시 VM을 구성하여 클래스 E 서브넷의 VM에 대해 wget을 실행할 수 있습니다.
학습할 내용
- 네트워크 연결을 만드는 방법
- 생산자가 네트워크 연결을 사용하여 PSC 인터페이스를 만드는 방법
- DNS 피어링을 사용하여 공급자에서 소비자로 통신을 설정하는 방법
- Vertex AI Pipelines에서 비 rfc1918 IP 주소 공간으로 통신을 설정하는 방법
필요한 항목
Google Cloud 프로젝트
IAM 권한
- Compute 네트워크 관리자 (roles/compute.networkAdmin)
- Compute 인스턴스 관리자 (roles/compute.instanceAdmin)
- Compute 보안 관리자 (roles/compute.securityAdmin)
- DNS 관리자 (roles/dns.admin)
- IAP 보안 터널 사용자 (roles/iap.tunnelResourceAccessor)
- 로깅 관리자 (roles/logging.admin)
- Notebooks 관리자 (roles/notebooks.admin)
- 프로젝트 IAM 관리자 (roles/resourcemanager.projectIamAdmin)
- 서비스 계정 관리자 (roles/iam.serviceAccountAdmin)
- 서비스 사용량 관리자 (roles/serviceusage.serviceUsageAdmin)
2. 시작하기 전에
튜토리얼을 지원하도록 프로젝트 업데이트
이 튜토리얼에서는 Cloud Shell에서 gcloud 구성 구현을 지원하기 위해 $variables를 사용합니다.
Cloud Shell 내에서 다음을 실행합니다.
gcloud config list project
gcloud config set project [YOUR-PROJECT-NAME]
projectid=YOUR-PROJECT-NAME
echo $projectid
API 사용 설정
Cloud Shell 내에서 다음을 실행합니다.
gcloud services enable "compute.googleapis.com"
gcloud services enable "aiplatform.googleapis.com"
gcloud services enable "dns.googleapis.com"
gcloud services enable "notebooks.googleapis.com"
gcloud services enable "storage.googleapis.com"
gcloud services enable "cloudresourcemanager.googleapis.com"
gcloud services enable "artifactregistry.googleapis.com"
gcloud services enable "cloudbuild.googleapis.com"
3. 소비자 설정
소비자 VPC 만들기
Cloud Shell 내에서 다음을 실행합니다.
gcloud compute networks create consumer-vpc --project=$projectid --subnet-mode=custom
소비자 서브넷 만들기
Cloud Shell 내에서 다음을 실행합니다.
gcloud compute networks subnets create class-e-subnet --project=$projectid --range=240.0.0.0/4 --network=consumer-vpc --region=us-central1
Cloud Shell 내에서 다음을 실행합니다.
gcloud compute networks subnets create rfc1918-subnet1 --project=$projectid --range=10.10.10.0/28 --network=consumer-vpc --region=us-central1
Private Service Connect 네트워크 연결 서브넷 만들기
Cloud Shell 내에서 다음을 실행합니다.
gcloud compute networks subnets create intf-subnet --project=$projectid --range=192.168.10.0/28 --network=consumer-vpc --region=us-central1
Cloud Router 및 NAT 구성
이 튜토리얼에서는 공개 IP 주소가 없는 프록시 VM에 인터넷 액세스를 제공하기 위해 Cloud NAT를 사용합니다. Cloud NAT를 사용하면 비공개 IP 주소만 있는 VM이 인터넷에 연결하여 소프트웨어 패키지 설치와 같은 작업을 실행할 수 있습니다.
Cloud Shell 내에서 클라우드 라우터를 만듭니다.
gcloud compute routers create cloud-router-for-nat --network consumer-vpc --region us-central1
Cloud Shell 내에서 NAT 게이트웨이를 만듭니다.
gcloud compute routers nats create cloud-nat-us-central1 --router=cloud-router-for-nat --auto-allocate-nat-external-ips --nat-all-subnet-ip-ranges --region us-central1 --enable-logging --log-filter=ALL
4. 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 인스턴스인 class-e-vm을 만듭니다.
gcloud compute instances create class-e-vm \
--project=$projectid \
--machine-type=e2-micro \
--image-family debian-11 \
--no-address \
--shielded-secure-boot \
--image-project debian-cloud \
--zone us-central1-a \
--subnet=class-e-subnet \
--metadata startup-script="#! /bin/bash
sudo apt-get update
sudo apt-get install tcpdump
sudo apt-get install apache2 -y
sudo service apache2 restart
echo 'Class-e server !!' | tee /var/www/html/index.html
EOF"
Cloud Shell 내에서 Vertex AI Pipelines의 명시적 프록시 역할을 하는 소비자 VM 인스턴스인 proxy-vm을 만듭니다. HTTPS도 지원되지만 HTTP 트래픽을 프록시하는 애플리케이션으로 tinyproxy를 사용합니다.
gcloud compute instances create proxy-vm \
--project=$projectid \
--machine-type=e2-micro \
--image-family debian-11 \
--no-address \
--can-ip-forward \
--shielded-secure-boot \
--image-project debian-cloud \
--zone us-central1-a \
--subnet=rfc1918-subnet1 \
--metadata startup-script="#! /bin/bash
sudo apt-get update
sudo apt-get install tcpdump
sudo apt-get install tinyproxy -y
sudo apt-get install apache2 -y
sudo service apache2 restart
echo 'proxy server !!' | tee /var/www/html/index.html
EOF"
6. Private Service Connect 네트워크 연결
네트워크 연결은 Private Service Connect 인터페이스의 소비자 측을 나타내는 리전별 리소스입니다. 단일 서브넷을 네트워크 연결과 연결하면 프로듀서가 해당 서브넷에서 Private Service Connect 인터페이스에 IP를 할당합니다. 서브넷은 네트워크 연결과 동일한 리전에 있어야 합니다. 네트워크 연결은 프로듀서 서비스와 동일한 리전에 있어야 합니다.
네트워크 연결 만들기
Cloud Shell 내에서 네트워크 연결을 만듭니다.
gcloud compute network-attachments create psc-network-attachment \
--region=us-central1 \
--connection-preference=ACCEPT_AUTOMATIC \
--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 이름(psc-network-attachment)을 기록해 둡니다.
Cloud 콘솔에서 PSC 네트워크 연결 URL을 보려면 다음으로 이동하세요.
네트워크 서비스 → Private Service Connect → 네트워크 연결 → psc-network-attachment
7. 비공개 DNS 영역
demo.com의 Cloud DNS 영역을 만들고 VM의 IP 주소를 가리키는 A 레코드로 채웁니다. 나중에 DNS 피어링이 Vertex AI Pipelines 작업에 배포되어 소비자의 DNS 레코드에 액세스할 수 있습니다.
Cloud Shell 내에서 다음을 실행합니다.
gcloud dns --project=$projectid managed-zones create private-dns-codelab --description="" --dns-name="demo.com." --visibility="private" --networks="https://compute.googleapis.com/compute/v1/projects/$projectid/global/networks/consumer-vpc"
Cloud Shell 내에서 VM 인스턴스에 대해 describe를 실행하여 각 IP 주소를 가져옵니다.
gcloud compute instances describe class-e-vm --zone=us-central1-a | grep networkIP:
gcloud compute instances describe proxy-vm --zone=us-central1-a | grep networkIP:
Cloud Shell 내에서 VM(class-e-vm)의 레코드 세트를 만들고 환경의 출력에 따라 IP 주소를 업데이트해야 합니다.
gcloud dns --project=$projectid record-sets create class-e-vm.demo.com. --zone="private-dns-codelab" --type="A" --ttl="300" --rrdatas="240.0.0.2"
Cloud Shell 내에서 VM, proxy-vm의 레코드 세트를 만들고 환경의 출력에 따라 IP 주소를 업데이트해야 합니다.
gcloud dns --project=$projectid record-sets create proxy-vm.demo.com. --zone="private-dns-codelab" --type="A" --ttl="300" --rrdatas="10.10.10.2"
PSC 인터페이스에서 액세스를 허용하는 Cloud 방화벽 규칙 만들기
다음 섹션에서는 PSC 네트워크 연결이 소비자 VPC의 RFC1918 컴퓨팅 리소스에 액세스할 수 있도록 하는 방화벽 규칙을 만듭니다.
Cloud Shell에서 PSC 네트워크 연결 서브넷에서 프록시 VM으로의 액세스를 허용하는 인그레스 방화벽 규칙을 만듭니다.
gcloud compute firewall-rules create allow-access-to-proxy \
--network=consumer-vpc \
--action=ALLOW \
--rules=ALL \
--direction=INGRESS \
--priority=1000 \
--source-ranges="192.168.10.0/28" \
--destination-ranges="10.10.0.0/19" \
--enable-logging
Cloud Shell에서 프록시-vm 서브넷에서 class-e 서브넷으로의 액세스를 허용하는 인그레스 방화벽 규칙을 만듭니다.
gcloud compute firewall-rules create allow-access-to-class-e \
--network=consumer-vpc \
--action=ALLOW \
--rules=ALL \
--direction=INGRESS \
--priority=1000 \
--source-ranges="10.10.10.0/28" \
--destination-ranges="240.0.0.0/4" \
--enable-logging
8. 명시적 프록시 업데이트
다음 섹션에서는 명시적 프록시에 SSH로 연결하고 tinyproxy.conf 구성 파일을 업데이트한 후 재설정을 실행해야 합니다.
Cloud Shell 사용
gcloud compute ssh --zone us-central1-a "proxy-vm" --tunnel-through-iap --project $projectid
tinyproxy 구성 파일을 열고 원하는 편집기를 사용하여 업데이트합니다. 다음은 VIM을 사용하는 예입니다.
sudo vim /etc/tinyproxy/tinyproxy.conf
# Locate the "Listen" configuration line to restrict listening to only its private IP address of the Proxy-VM, rather than all interfaces.
Listen 10.10.10.2
# Locate the "Allow" configuration line to allow requests ONLY from the PSC Network Attachment Subnet
Allow 192.168.10.0/24
Save the configs by the following steps:
1. Press the `ESC` key to enter Command Mode.
2. Type `:wq` to save (w) and quit (q).
3. Press `Enter`
Restart the tinyproxy service to apply the changes:
sudo systemctl restart tinyproxy
Validate the tinyproxy service is running:
sudo systemctl status tinyproxy
Perform an exit returning to cloud shell
exit
9. Jupyter 노트북 만들기
다음 섹션에서는 Jupyter 노트북을 만드는 방법을 안내합니다. 이 노트북은 Vertex AI Pipelines에서 테스트 인스턴스로 wget을 전송하는 Vertex AI 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에서 Cloud Build 편집자 역할이 있는 서비스 계정을 업데이트합니다.
gcloud projects add-iam-policy-binding $projectid --member="serviceAccount:notebook-sa@$projectid.iam.gserviceaccount.com" --role="roles/cloudbuild.builds.editor"
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"
10. Vertex AI Workbench 인스턴스 만들기
다음 섹션에서는 이전에 만든 서비스 계정(notebook-sa)을 통합하는 Vertex AI Workbench 인스턴스를 만듭니다.
Cloud Shell 내에서 private-client 인스턴스를 만듭니다.
gcloud workbench instances create workbench-tutorial --vm-image-project=cloud-notebooks-managed --vm-image-family=workbench-instances --machine-type=n1-standard-4 --location=us-central1-a --subnet-region=us-central1 --subnet=rfc1918-subnet1 --disable-public-ip --shielded-secure-boot=true --shielded-integrity-monitoring=true --shielded-vtpm=true --service-account-email=notebook-sa@$projectid.iam.gserviceaccount.com
11. Vertex AI 서비스 에이전트 업데이트
Vertex AI는 PSC 인터페이스를 만드는 데 사용되는 PSC 네트워크 연결 서브넷에서 IP 주소를 가져오는 등의 작업을 대신 수행합니다. 이를 위해 Vertex AI는 네트워크 관리자 권한이 필요한 서비스 에이전트 (아래에 나열됨)를 사용합니다.
service-$projectnumber@gcp-sa-aiplatform.iam.gserviceaccount.com
Cloud Shell 내에서 프로젝트 번호를 가져옵니다.
gcloud projects describe $projectid | grep projectNumber
Cloud Shell 내에서 프로젝트 번호를 가져옵니다.
gcloud projects describe $projectid | grep projectNumber
projectNumber: '234086459238'
Cloud Shell 내에서 프로젝트 번호를 설정합니다.
projectnumber=YOUR-PROJECT-Number
Cloud Shell 내에서 AI Platform용 서비스 계정을 만듭니다. 프로젝트에 기존 서비스 계정이 있으면 이 단계를 건너뜁니다.
gcloud beta services identity create --service=aiplatform.googleapis.com --project=$projectnumber
Cloud Shell 내에서 compute.networkAdmin 역할이 있는 서비스 에이전트 계정을 업데이트합니다.
gcloud projects add-iam-policy-binding $projectid --member="serviceAccount:service-$projectnumber@gcp-sa-aiplatform.iam.gserviceaccount.com" --role="roles/compute.networkAdmin"
Cloud Shell 내에서 dns.peer 역할로 서비스 에이전트 계정을 업데이트합니다.
gcloud projects add-iam-policy-binding $projectid --member="serviceAccount:service-$projectnumber@gcp-sa-aiplatform.iam.gserviceaccount.com" --role="roles/dns.peer"
기본 서비스 계정 업데이트
Compute Engine API를 사용 설정하고 기본 서비스 계정에 Vertex AI 액세스 권한을 부여합니다. 액세스 변경사항이 전파되는 데 다소 시간이 걸릴 수 있습니다.
Cloud Shell 내에서 기본 서비스 계정을 aiplatform.user 역할로 업데이트합니다.
gcloud projects add-iam-policy-binding $projectid \
--member="serviceAccount:$projectnumber-compute@developer.gserviceaccount.com" \
--role="roles/aiplatform.user"
Cloud Shell 내에서 storage.admin 역할로 기본 서비스 계정을 업데이트합니다.
gcloud projects add-iam-policy-binding $projectid \
--member="serviceAccount:$projectnumber-compute@developer.gserviceaccount.com" \
--role="roles/storage.admin"
Cloud Shell 내에서 storage.admin 역할로 기본 서비스 계정을 업데이트합니다.
gcloud projects add-iam-policy-binding $projectid \
--member="serviceAccount:$projectnumber-compute@developer.gserviceaccount.com" \
--role="roles/artifactregistry.admin"
12. Tcpdump 사용 설정
Vertex AI Pipelines에서 IP 연결을 검증하려면 TCPDUMP를 사용하면 됩니다. 이렇게 하면 Vertex AI Pipelines에서 vm, class-e-vm.demo.com(240.0.0.0/4)으로 get 요청을 호출할 때 PSC 네트워크 연결 서브넷(192.168.10.0/28)에서 시작되는 통신을 관찰할 수 있습니다.
Cloud Shell에서 프록시 VM으로 SSH합니다.
gcloud compute ssh --zone us-central1-a "proxy-vm" --tunnel-through-iap --project $projectid
프록시 VM OS에서 class-e-vm 및 PSC 네트워크 연결 서브넷에 대해 tcpdump 필터링을 실행합니다.
sudo tcpdump -i any net 240.0.0.0/4 or 192.168.10.0/28 -nn
새 Cloud Shell 탭을 열고 프로젝트 변수를 업데이트하고 class-e-vm에 SSH로 연결합니다.
gcloud compute ssh --zone us-central1-a "class-e-vm" --tunnel-through-iap --project $projectid
class-e-vm OS에서 proxy-vm 서브넷에 대해 필터링된 tcpdump를 실행합니다.
sudo tcpdump -i any net 10.10.10.0/28 -nn
13. Vertex AI Pipelines 작업 배포
다음 섹션에서는 Vertex AI Pipelines에서 명시적 프록시로 wget을 성공적으로 실행하는 노트북을 만듭니다. 이를 통해 class-e-vm과 같은 비RFC 1918 VM에 도달할 수 있습니다. 대상은 RFC 1918 IP 주소이므로 Vertex AI Pipelines가 rfc1918-vm에 액세스하는 데 명시적 프록시가 필요하지 않습니다.
Vertex AI Workbench 인스턴스에서 학습 작업을 실행합니다.
- Google Cloud 콘솔의 Vertex AI Workbench 페이지에서 인스턴스 탭으로 이동합니다.
- Vertex AI Workbench 인스턴스 이름 (workbench-tutorial) 옆에 있는 JupyterLab 열기를 클릭합니다. Vertex AI Workbench 인스턴스가 JupyterLab을 엽니다.
- 파일 > 새로 만들기 > 노트북을 선택합니다.
- 커널 > Python 3 선택
JupyterLab 노트북에서 새 셀을 만들고 다음을 실행합니다.
# Install gcloud
!pip install google-cloud
# Install the pipeline required packages
!pip install --upgrade google-cloud-aiplatform \
google-cloud-storage \
kfp \
google-cloud-pipeline-components
# Import libraries
from time import gmtime, strftime
import json
import requests
JupyterLab 노트북에서 새 셀을 만들고 다음을 업데이트하여 실행합니다. 환경의 세부정보로 PROJECT_ID를 업데이트해야 합니다.
import json
import requests
import pprint
PROJECT_ID = 'YOUR-PROJECT-ID' #Enter your project ID
PROJECT_NUMBER=!gcloud projects list --filter="project_id:$PROJECT_ID" --format="value(PROJECT_NUMBER)"
PROJECT_NUMBER=str(PROJECT_NUMBER).strip('[').strip(']').strip("'")
print(PROJECT_NUMBER)
JupyterLab 노트북에서 새 셀을 만들고 다음을 실행합니다.
# us-central1 is used for the codelab
REGION = "us-central1" #@param {type:"string"}
SERVICE_NAME = "aiplatform" #@param {type:"string"}
SERVICE ="{}.googleapis.com".format(SERVICE_NAME)
ENDPOINT="{}-{}.googleapis.com".format(REGION, SERVICE_NAME)
API_VERSION = "v1" # @param {type: "string"}
LOCATION = REGION
JupyterLab 노트북에서 새 셀을 만들고 아래 구성을 실행합니다. 다음 사항에 유의하세요.
- proxy_server = "http://proxy-vm.demo.com:8888" FQDN은 소비자 VPC에 배포된 프록시 VM과 연결됩니다. 이후 단계에서 DNS 피어링을 사용하여 FQDN을 확인합니다.
%%writefile main.py
import logging
import socket
import sys
import os
def make_api_request(url: str, proxy_vm_ip: str, proxy_vm_port: str):
"""
Makes a GET request to a non-rfc1918 API and saves the response.
Args:
url: The URL of the API to send the request to.
"""
import requests
try:
# response = requests.get(url)
proxy_server = f"http://proxy-vm.demo.com:8888" # replace with you VM's IP and proxy port.
proxies = {
"http": proxy_server,
"https": proxy_server,
}
response = requests.get(url, proxies=proxies)
logging.info(response.text)
response.raise_for_status() # Raise an exception for bad status codes
logging.info(f"Successfully fetched data from {url}")
except requests.exceptions.RequestException as e:
logging.error(f"An error occurred: {e}")
raise e
if __name__ == '__main__':
# Configure logging to print clearly to the console
logging.basicConfig(
level=logging.INFO,
format='%(levelname)s: %(message)s',
stream=sys.stdout
)
url_to_test = os.environ['NONRFC_URL']
proxy_vm_ip = os.environ['PROXY_VM_IP']
proxy_vm_port = os.environ['PROXY_VM_PORT']
logging.info(f"url_to_test: {url_to_test}")
logging.info(f"proxy_vm_ip: {proxy_vm_ip}")
logging.info(f"proxy_vm_port: {proxy_vm_port}")
make_api_request(url_to_test, proxy_vm_ip, proxy_vm_port)
JupyterLab 노트북에서 새 셀을 만들고 다음을 실행합니다.
%%writefile Dockerfile
FROM python:3.9-slim
RUN apt-get update && \
apt-get install -y iputils-ping && \
apt-get install -y wget
RUN pip install cloudml-hypertune requests kfp
COPY main.py /main.py
ENTRYPOINT ["python3", "/main.py"]
JupyterLab 노트북에서 새 셀을 만들고 다음을 실행합니다.
!gcloud artifacts repositories create pipelines-test-repo-psc --repository-format=docker --location=us-central1
JupyterLab 노트북에서 새 셀을 만들고 다음을 실행합니다.
IMAGE_PROJECT = PROJECT_ID
IMAGE_REPO = 'pipelines-test-repo-psc'
IMAGE_NAME = 'nonrfc-ip-call'
TAG = 'v1'
IMAGE_URI= f'us-central1-docker.pkg.dev/{IMAGE_PROJECT}/{IMAGE_REPO}/{IMAGE_NAME}:{TAG}'
IMAGE_URI
JupyterLab 노트북에서 새 셀을 만들고 다음을 실행합니다.
!gcloud auth configure-docker us-docker.pkg.dev --quiet
JupyterLab 노트북에서 새 셀을 만들고 다음을 실행합니다. 오류 (gcloud.builds.submit)가 있는 경우 무시합니다.
!gcloud builds submit --tag {IMAGE_URI} --region=us-central1
JupyterLab 노트북에서 아래 셀을 만들고 실행합니다. 다음 사항에 유의하세요.
- 소비자 VPC에 대한 DNS 피어링은 도메인 이름 demo.com에 대해 dnsPeeringConfigs (dnsPeeringConfigs)를 사용하여 구성됩니다.
- 변수 PROXY_VM_IP로 정의된 명시적 프록시는 proxy-vm.demo.com입니다. 확인은 소비자의 VPC 내에서 DNS 피어링을 통해 처리됩니다.
- 포트 8888은 tinyproxy에 구성된 수신 대기 포트 (기본값)입니다.
- class-e-vm-demo.com에 대한 Wget은 DNS 피어링을 통해 확인됩니다.
- 이 코드는 Vertex의 'psc-network-attachment'를 지정하여 네트워크 연결 서브넷을 활용하여 두 개의 PSC 인터페이스 인스턴스를 배포할 수 있도록 합니다.
import json
from datetime import datetime
JOB_ID_PREFIX='test_psci-nonRFC' #@param {type:"string"}
JOB_ID = '{}_{}'.format(JOB_ID_PREFIX, datetime.now().strftime("%Y%m%d%H%M%S"))
# PSC-I configs
PRODUCER_PROJECT_ID = PROJECT_ID
DNS_DOMAIN = 'class-e-vm.demo.com' #@param {type:"string"}
NON_RFC_URL = f"http://{DNS_DOMAIN}"
PROXY_VM_IP = "proxy-vm.demo.com" #@param {type:"string"}
PROXY_VM_PORT = "8888" #@param {type:"string"}
CUSTOM_JOB = {
"display_name": JOB_ID,
"job_spec": {
"worker_pool_specs": [
{
"machine_spec": {
"machine_type": "n1-standard-4",
},
"replica_count": 1,
"container_spec": {
"image_uri": IMAGE_URI,
"env": [{
"name": "NONRFC_URL",
"value": NON_RFC_URL
},
{
"name": "PROXY_VM_IP",
"value": PROXY_VM_IP
},
{
"name": "PROXY_VM_PORT",
"value": PROXY_VM_PORT
}]
},
},
],
"enable_web_access": True,
"psc_interface_config": {
"network_attachment": "psc-network-attachment",
"dns_peering_configs": [
{
"domain": "demo.com.",
"target_project": PROJECT_ID,
"target_network": "consumer-vpc"
},
]
},
}
}
print(json.dumps(CUSTOM_JOB, indent=2))
JupyterLab 노트북에서 새 셀을 만들고 다음을 실행합니다.
import requests
bearer_token = !gcloud auth application-default print-access-token
headers = {
'Content-Type': 'application/json',
'Authorization': 'Bearer {}'.format(bearer_token[0]),
}
request_uri = f"https://{REGION}-aiplatform.googleapis.com/{API_VERSION}/projects/{PROJECT_NUMBER}/locations/{REGION}/customJobs/"
print("request_uri: ", request_uri)
JupyterLab 노트북에서 새 셀을 만들고 다음을 실행합니다.
response_autopush = requests.post(request_uri, json=CUSTOM_JOB, headers=headers)
response = response_autopush
print("response:", response)
if response.reason == 'OK':
job_name = response.json()['name']
job_id = job_name.split('/')[-1]
print("Created Job: ", response.json()['name'])
else:
print(response.text)
JupyterLab 노트북에서 새 셀을 만들고 다음을 실행합니다.
# Print KFP SDK version (should be >= 1.6)
! python3 -c "import kfp; print('KFP SDK version: {}'.format(kfp.__version__))"
# Print AI Platform version
! python3 -c "from google.cloud import aiplatform; print('AI Platform version: {}'.format(aiplatform.__version__))"
JupyterLab 노트북에서 새 셀을 만들고 다음을 실행합니다.
BUCKET_URI = "your-unique-bucket" # Provide a globally unique bucket name
JupyterLab 노트북에서 새 셀을 만들고 다음을 실행합니다.
!gcloud storage buckets create gs://{BUCKET_URI}
JupyterLab 노트북에서 새 셀을 만들고 다음을 실행합니다.
# pipeline parameters
CACHE_PIPELINE = False # @param {type: "string"}
_DEFAULT_IMAGE = IMAGE_URI
BUCKET_URI = "gs://{BUCKET_URI}" # @param {type: "string"}
PIPELINE_ROOT = f"{BUCKET_URI}/pipeline_root/intro"
PIPELINE_DISPLAY_NAME = "pipeline_nonRFCIP" # @param {type: "string"}
JupyterLab 노트북에서 새 셀을 만들고 다음을 실행합니다.
from re import S
import kfp
from kfp import dsl
from kfp.dsl import container_component, ContainerSpec
from kfp import compiler
from google.cloud import aiplatform
# ==== Component with env variable ====
@container_component
def dns_peering_test_op(dns_domain: str, proxy_vm_ip:str, proxy_vm_port:str):
return ContainerSpec(
image=_DEFAULT_IMAGE,
command=["bash", "-c"],
args=[
"""
apt-get update && apt-get install inetutils-traceroute inetutils-ping netcat-openbsd curl -y
echo "Local IP(s): $(hostname -I)"
echo "Attempting to trace route to %s"
traceroute -w 1 -m 7 "%s"
echo "Sending curl requests to http://%s via proxy %s:%s and recording trace..."
if curl -L -v --trace-ascii /dev/stdout -x http://%s:%s "http://%s"; then
echo "Curl request succeeded!"
else
echo "Curl request failed!"
exit 1
fi
""" % (dns_domain, dns_domain, dns_domain, proxy_vm_ip, proxy_vm_port, proxy_vm_ip, proxy_vm_port, dns_domain)
]
)
# ==== Pipeline ====
@dsl.pipeline(
name="dns-peering-test-pipeline",
description="Test DNS Peering using env variable",
pipeline_root=PIPELINE_ROOT,
)
def dns_peering_test_pipeline(dns_domain: str, proxy_vm_ip:str, proxy_vm_port:str):
dns_test_task = dns_peering_test_op(dns_domain=dns_domain, proxy_vm_ip=proxy_vm_ip, proxy_vm_port=proxy_vm_port)
dns_test_task.set_caching_options(enable_caching=CACHE_PIPELINE)
# ==== Compile pipeline ====
if __name__ == "__main__":
aiplatform.init(project=PROJECT_ID, location=LOCATION)
compiler.Compiler().compile(
pipeline_func=dns_peering_test_pipeline,
package_path="dns_peering_test_pipeline.yaml",
)
print("✅ Pipeline compiled to dns_peering_test_pipeline.yaml")
JupyterLab 노트북에서 새 셀을 만들고 다음을 실행합니다.
# Define the PipelineJob body; see API Reference https://cloud.google.com/vertex-ai/docs/reference/rest/v1/projects.locations.pipelineJobs/create
import requests, json
import datetime
bearer_token = !gcloud auth application-default print-access-token
headers = {
'Content-Type': 'application/json',
'Authorization': 'Bearer {}'.format(bearer_token[0]),
}
request_uri = f"https://{REGION}-aiplatform.googleapis.com/{API_VERSION}/projects/{PROJECT_NUMBER}/locations/{REGION}/pipelineJobs/"
print("request_uri: ", request_uri)
14. PSC 인터페이스 유효성 검사
다음으로 이동하여 Vertex AI Pipelines에서 사용되는 네트워크 연결 IP를 확인할 수도 있습니다.
네트워크 서비스 → Private Service Connect → 네트워크 연결 → psc-network-attachment
테넌트 프로젝트(-tp로 끝나는 프로젝트 이름)를 선택합니다.
강조 표시된 필드는 PSC 네트워크 연결에서 Vertex AI Pipelines가 사용하는 IP 주소를 나타냅니다.
15. Cloud Logging 유효성 검사
Vertex AI Pipelines 작업은 처음 실행하는 데 약 14분이 걸리며, 이후 실행은 훨씬 짧습니다. 성공적인 결과를 검증하려면 다음을 실행하세요.
Vertex AI → 학습 → 커스텀 작업으로 이동합니다.
실행된 맞춤 작업 선택
로그 보기를 선택합니다.
Cloud Logging을 사용할 수 있게 되면 아래에 강조 표시된 선택 항목을 생성하는 쿼리를 실행하여 Vertex AI Pipelines에서 class-e-vm으로의 wget이 성공했는지 확인합니다.
16. TCPDump 검증
컴퓨팅 인스턴스에 대한 연결을 추가로 검증하는 TCPDUMP 출력을 검토해 보겠습니다.
프록시 VM에서 HTTP GET 및 200 OK를 관찰합니다.
03:05:34.778574 ens4 Out IP 10.10.10.2.40326 > 240.0.0.2.80: Flags [P.], seq 1:63, ack 1, win 511, options [nop,nop,TS val 1435446009 ecr 2475360885], length 62: HTTP: GET / HTTP/1.0 03:05:34.778946 ens4 In IP 240.0.0.2.80 > 10.10.10.2.40326: Flags [.], ack 63, win 506, options [nop,nop,TS val 2475360889 ecr 1435446009], length 0 03:05:34.778974 ens4 Out IP 10.10.10.2.40326 > 240.0.0.2.80: Flags [P.], seq 63:185, ack 1, win 511, options [nop,nop,TS val 1435446010 ecr 2475360889], length 122: HTTP 03:05:34.781999 ens4 In IP 240.0.0.2.80 > 10.10.10.2.40326: Flags [.], ack 185, win 506, options [nop,nop,TS val 2475360892 ecr 1435446010], length 0 03:05:34.906678 ens4 In IP 240.0.0.2.80 > 10.10.10.2.40326: Flags [P.], seq 1:265, ack 185, win 506, options [nop,nop,TS val 2475361016 ecr 1435446010], length 264: HTTP: HTTP/1.1 200 OK
class-e-vm에서 HTTP GET 및 200 OK를 관찰합니다.
03:05:34.778768 ens4 In IP 10.10.10.2.40326 > 240.0.0.2.80: Flags [P.], seq 1:63, ack 1, win 511, options [nop,nop,TS val 1435446009 ecr 2475360885], length 62: HTTP: GET / HTTP/1.0 03:05:34.778819 ens4 Out IP 240.0.0.2.80 > 10.10.10.2.40326: Flags [.], ack 63, win 506, options [nop,nop,TS val 2475360889 ecr 1435446009], length 0 03:05:34.781815 ens4 In IP 10.10.10.2.40326 > 240.0.0.2.80: Flags [P.], seq 63:185, ack 1, win 511, options [nop,nop,TS val 1435446010 ecr 2475360889], length 122: HTTP 03:05:34.781856 ens4 Out IP 240.0.0.2.80 > 10.10.10.2.40326: Flags [.], ack 185, win 506, options [nop,nop,TS val 2475360892 ecr 1435446010], length 0 03:05:34.906503 ens4 Out IP 240.0.0.2.80 > 10.10.10.2.40326: Flags [P.], seq 1:265, ack 185, win 506, options [nop,nop,TS val 2475361016 ecr 1435446010], length 264: HTTP: HTTP/1.1 200 OK
17. 삭제
Cloud Shell에서 튜토리얼 구성요소를 삭제합니다.
gcloud compute instances delete proxy-vm --zone=us-central1-a --quiet
gcloud compute instances delete workbench-tutorial --zone=us-central1-a --quiet
gcloud compute routers delete cloud-router-for-nat --region=us-central1 --quiet
gcloud compute network-attachments delete psc-network-attachment --region=us-central1 --quiet
gcloud compute networks subnets delete intf-subnet rfc1918-subnet1 --region=us-central1 --quiet
gcloud dns record-sets delete class-e-vm.demo.com --zone=private-dns-codelab --type=A
gcloud dns record-sets delete proxy-vm.demo.com --zone=private-dns-codelab --type=A
gcloud dns managed-zones delete private-dns-codelab
gcloud compute networks delete consumer-vpc --quiet
18. 축하합니다
축하합니다. Vertex AI Pipelines를 사용하여 Private Service Connect 인터페이스를 구성하고 검증했습니다.
소비자 인프라를 만들고 프로듀서가 소비자 및 프로듀서 통신을 연결하는 다중 NIC VM을 만들 수 있도록 네트워크 연결을 추가했습니다. Vertex에서 직접 라우팅할 수 없는 class-e-vm 인스턴스에 연결할 수 있는 소비자 VPC 네트워크에 명시적 프록시를 배포하는 동안 DNS 피어링을 만드는 방법을 배웠습니다.
Cosmopup은 튜토리얼이 멋지다고 생각합니다.