رابط PSC مربوط به Vertex AI Pipelines SWP

۱. مقدمه

رابط اتصال سرویس خصوصی منبعی است که به یک شبکه ابر خصوصی مجازی (VPC) تولیدکننده اجازه می‌دهد تا اتصالاتی را به مقاصد مختلف در یک شبکه VPC مصرف‌کننده آغاز کند. شبکه‌های تولیدکننده و مصرف‌کننده می‌توانند در پروژه‌ها و سازمان‌های مختلف باشند.

اگر یک اتصال شبکه، اتصالی را از رابط Private Service Connect بپذیرد، Google Cloud یک آدرس IP از زیرشبکه مصرف‌کننده که توسط اتصال شبکه مشخص شده است، به رابط اختصاص می‌دهد. شبکه‌های مصرف‌کننده و تولیدکننده به هم متصل هستند و می‌توانند با استفاده از آدرس‌های IP داخلی ارتباط برقرار کنند.

اتصال بین یک اتصال شبکه و یک رابط Private Service Connect مشابه اتصال بین یک نقطه پایانی Private Service Connect و یک اتصال سرویس است، اما دو تفاوت کلیدی دارد:

  • یک اتصال شبکه به شبکه تولیدکننده اجازه می‌دهد تا اتصالاتی را به شبکه مصرف‌کننده آغاز کند (خروجی سرویس مدیریت‌شده)، در حالی که یک نقطه پایانی به شبکه مصرف‌کننده اجازه می‌دهد تا اتصالاتی را به شبکه تولیدکننده آغاز کند (ورودی سرویس مدیریت‌شده).
  • اتصال رابط Private Service Connect از نوع انتقالی است. این بدان معناست که یک شبکه تولیدکننده می‌تواند با شبکه‌های دیگری که به شبکه مصرف‌کننده متصل هستند، ارتباط برقرار کند.

d7dc28d6567e6283.png شکل: ۱

ملاحظات دسترسی‌پذیری رابط کاربری PSC در Vertex AI

  • رابط کاربری Vertex AI PSC قادر به مسیریابی ترافیک به مقاصدی در یک VPC یا در محل، در بلوک آدرس RFC1918 است.
  • رابط PSC که بلوک‌های آدرس غیر RFC-1918 را هدف قرار می‌دهد، نیاز به یک پروکسی صریح مستقر در VPC مصرف‌کننده با آدرس RFC-1918 دارد. در استقرار Vertex AI، پروکسی باید همراه با FQDN از نقطه پایانی هدف تعریف شود. به شکل 1 مراجعه کنید که حالت پروکسی صریح پروکسی وب امن (SWP) را که در VPC مصرف‌کننده پیکربندی شده است، نشان می‌دهد تا مسیریابی به CIDR های غیر RFC-1918 زیر را تسهیل کند:
  1. ۲۴۰.۰.۰.۰/۴
  2. ۲۰۳.۰.۱۱۳.۰/۲۴
  3. ‎10.10.20.0/28 بدون نیاز به پروکسی، در محدوده RFC-1918 قرار می‌گیرد.
  4. خروج اینترنتی

اتصال به اینترنت برای شبکه مستاجر مدیریت‌شده گوگل:

رابط کاربری Vertex AI PSC بدون VPC-SC

  • وقتی که شما سیستم خود را فقط با رابط PSC پیکربندی می‌کنید، دسترسی پیش‌فرض به اینترنت حفظ می‌شود. این ترافیک خروجی مستقیماً از شبکه مستاجر تحت مدیریت گوگل خارج می‌شود.

رابط کاربری Vertex AI PSC با VPC-SC

  • وقتی پروژه شما بخشی از محیط VPC Service Controls است، دسترسی پیش‌فرض مستأجر تحت مدیریت گوگل به اینترنت توسط محیط مسدود می‌شود تا از نشت داده‌ها جلوگیری شود.
  • برای اینکه در این سناریو به استقرار اجازه دسترسی به اینترنت عمومی داده شود، باید صریحاً یک مسیر خروجی امن پیکربندی کنید که ترافیک را از طریق VPC شما که به Vertex AI متصل است، هدایت کند. استقرار یک سرور پروکسی در داخل شبکه VPC با آدرس RFC 1918، همراه با یک دروازه Cloud NAT، یکی از راه‌های دستیابی به این هدف است. توجه داشته باشید که می‌توانید از پروکسی Secure Web نیز برای ارسال ترافیک به اینترنت استفاده کنید. ایجاد پروکسی Secure Web، به طور خودکار یک دروازه Cloud NAT ایجاد می‌کند.

برای اطلاعات تکمیلی، به منابع زیر مراجعه کنید:

راه‌اندازی رابط سرویس خصوصی برای منابع هوش مصنوعی Vertex | گوگل کلود

آنچه خواهید ساخت

در این آموزش، شما قصد دارید یک پیاده‌سازی جامع از Vertex AI Pipelines با رابط Private Service Connect (PSC) ایجاد کنید تا امکان اتصال از تولیدکننده به رایانه مصرف‌کننده را فراهم کند، همانطور که در شکل 1 نشان داده شده است و نقطه پایانی غیر RFC 1918 را در class-e-subnet هدف قرار می‌دهد.

2d095dc2f4de6b4b.png شکل ۲

شما یک psc-network-attachment واحد در VPC مصرف‌کننده ایجاد خواهید کرد که از DNS peering برای حل مشکلات ماشین‌های مجازی مصرف‌کننده در پروژه مستاجر میزبان Vertex AI Training استفاده می‌کند و موارد استفاده زیر را به همراه خواهد داشت:

Vertex AI Pipelines را مستقر کرده و Secure Web Proxy را در حالت پروکسی صریح پیکربندی کنید، که به آن اجازه می‌دهد wget در برابر یک ماشین مجازی در زیرشبکه کلاس E انجام دهد.

آنچه یاد خواهید گرفت

  • نحوه ایجاد پیوست شبکه
  • چگونه یک تولیدکننده می‌تواند از یک اتصال شبکه برای ایجاد رابط PSC استفاده کند
  • نحوه ایجاد DNS Peering برای حل و فصل دامنه‌های خصوصی پیکربندی شده در Consumer VPC Network از Google Managed VPC Networks
  • نحوه انتقال ترافیک از رابط کاربری Vertex AI PSC به پروکسی وب امن
  • نحوه برقراری ارتباط با فضای آدرس IP غیر RFC-1918 از Vertex AI Pipelines

آنچه نیاز دارید

پروژه ابری گوگل

مجوزهای IAM

۲. قبل از شروع

پروژه را برای پشتیبانی از آموزش به‌روزرسانی کنید

این آموزش از متغیرها (variables) برای کمک به پیاده‌سازی پیکربندی gcloud در Cloud Shell استفاده می‌کند.

درون Cloud Shell، موارد زیر را انجام دهید:

gcloud config list project
gcloud config set project [YOUR-PROJECT-ID]
projectid=YOUR-PROJECT-ID
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"
gcloud services enable "networkservices.googleapis.com"
gcloud services enable "networksecurity.googleapis.com"
gcloud services enable "certificatemanager.googleapis.com"

۳. تنظیمات مصرف‌کننده

ایجاد 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 --enable-private-ip-google-access

زیرشبکه فقط پروکسی ایجاد کنید

gcloud compute networks subnets create proxy-only-uscentral1 \
    --purpose=REGIONAL_MANAGED_PROXY \
    --role=ACTIVE \
    --region=us-central1 \
    --network=consumer-vpc \
    --range=10.10.100.0/26

زیرشبکه اتصال شبکه خصوصی (Private Service Connect Network Attachment subnet) را ایجاد کنید.

درون Cloud Shell، موارد زیر را انجام دهید:

gcloud compute networks subnets create intf-subnet \
--project=$projectid \
--range=192.168.10.0/28 \
--network=consumer-vpc \
--region=us-central1 \
--enable-private-ip-google-access

پیکربندی روتر ابری و NAT

Google Cloud Secure Web Proxy به طور خودکار یک دروازه Cloud NAT و یک روتر Cloud مرتبط را در منطقه‌ای که در آن مستقر شده است، تهیه و مدیریت می‌کند.

۴. فعال کردن پرداخت درون برنامه‌ای (IAP)

برای اینکه به IAP (پروکسی آگاه از هویت) اجازه اتصال به ماشین‌های مجازی خود را بدهید، یک قانون فایروال ایجاد کنید که:

  • برای تمام نمونه‌های ماشین مجازی که می‌خواهید با استفاده از IAP به آنها دسترسی داشته باشید، اعمال می‌شود.
  • اجازه ورود ترافیک از محدوده IP 35.235.240.0/20 را می‌دهد. این محدوده شامل تمام آدرس‌های IP است که IAP برای ارسال TCP استفاده می‌کند.

در داخل Cloud Shell، قانون فایروال IAP را ایجاد کنید.

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

۵. ایجاد نمونه‌های ماشین مجازی مصرف‌کننده

درون Cloud Shell، نمونه ماشین مجازی مصرف‌کننده، 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 \ 
    --private-network-ip=240.0.0.2

۶. پروکسی وب امن

حالت صریح پروکسی وب امن (یا حالت مسیریابی پروکسی صریح) یک روش استقرار است که در آن بارهای کاری کلاینت باید به صراحت پیکربندی شوند تا از آدرس IP داخلی SWP یا نام دامنه کاملاً واجد شرایط و پورت به عنوان پروکسی ارسال خود استفاده کنند.

در مراحل زیر، مطمئن شوید که YOUR-PROJECT-ID به Project ID خود تغییر می‌دهید.

ایجاد یک پروکسی وب:

در Cloud Shell، فایل policy.yaml را با استفاده از یک ویرایشگر متن ایجاد کنید:

cat > policy.yaml << EOF
description: basic Secure Web Proxy policy
name: projects/$projectid/locations/us-central1/gatewaySecurityPolicies/policy1
EOF

در Cloud Shell، سیاست Secure Web Proxy را ایجاد کنید:

gcloud network-security gateway-security-policies import policy1 \
    --source=policy.yaml \
    --location=us-central1

در بخش بعدی، بر اساس sessionMatcher میزبان، قانونی برای دسترسی به class-e-vm ایجاد کنید.

در Cloud Shell، فایل rule1.yaml را با استفاده از یک ویرایشگر متن ایجاد کنید:

cat > rule1.yaml << EOF
name: projects/$projectid/locations/us-central1/gatewaySecurityPolicies/policy1/rules/allow-nonrfc-classe
description: Allow nonrfc class-e
enabled: true
priority: 1
basicProfile: ALLOW
sessionMatcher: host() == 'class-e-vm.demo.com'
EOF

در بخش بعدی، یک قانون ایجاد کنید تا به Jupyter notebook اجازه دسترسی به نصب apache2 روی ماشین مجازی "class-e" را بدهید.

در Cloud Shell، فایل rule2.yaml را با استفاده از یک ویرایشگر متن ایجاد کنید:

cat > rule2.yaml << EOF
name: projects/$projectid/locations/us-central1/gatewaySecurityPolicies/policy1/rules/allow-apache2
description: Allow Apache2 install on class-e VM
enabled: true
priority: 2
basicProfile: ALLOW
sessionMatcher: inIpRange(source.ip,'240.0.0.2')
EOF

در Cloud Shell، قانون شماره ۱ سیاست امنیتی را ایجاد کنید:

gcloud network-security gateway-security-policies rules import allow-nonrfc-classe \
    --source=rule1.yaml \
    --location=us-central1 \
    --gateway-security-policy=policy1

در Cloud Shell، قانون دوم سیاست امنیتی را ایجاد کنید:

gcloud network-security gateway-security-policies rules import allow-apache2 \
    --source=rule2.yaml \
    --location=us-central1 \
    --gateway-security-policy=policy1

برای پشتیبانی از آموزش هوش مصنوعی Vertex، دروازه Secure Web Proxy را با این تنظیمات پیکربندی کنید:

  • پورت شنود: از همان پورتی که در تنظیمات پروکسی صریح کد برنامه Vertex AI پیکربندی شده است (مثلاً ۸۰۸۰) استفاده کنید.
  • آدرس: یک آدرس IP خصوصی از محدوده RFC 1918 اختصاص دهید.
  • حالت مسیریابی: این را روی EXPLICIT_ROUTING_MODE تنظیم کنید

در Cloud Shell، یک فایل gateway.yaml برای تعریف دروازه Secure Web Proxy ایجاد کنید:

cat > gateway.yaml << EOF
name: projects/$projectid/locations/us-central1/gateways/swp1
type: SECURE_WEB_GATEWAY
addresses: ["10.10.10.5"]
ports: [8080]
gatewaySecurityPolicy: projects/$projectid/locations/us-central1/gatewaySecurityPolicies/policy1
network: projects/$projectid/global/networks/consumer-vpc
subnetwork: projects/$projectid/regions/us-central1/subnetworks/rfc1918-subnet1
routingMode: EXPLICIT_ROUTING_MODE
EOF

در Cloud Shell، نمونه Secure Web Proxy را ایجاد کنید:

gcloud network-services gateways import swp1 \
    --source=gateway.yaml \
    --location=us-central1

راه‌اندازی یک پروکسی وب امن می‌تواند چند دقیقه طول بکشد.

e8a4cf23bfc63030.png

۷. اتصال شبکه سرویس خصوصی

پیوست‌های شبکه، منابع منطقه‌ای هستند که سمت مصرف‌کننده‌ی یک رابط Private Service Connect را نشان می‌دهند. شما یک زیرشبکه‌ی واحد را با یک پیوست شبکه مرتبط می‌کنید و تولیدکننده، IPها را از آن زیرشبکه به رابط Private Service Connect اختصاص می‌دهد. زیرشبکه باید در همان منطقه‌ی پیوست شبکه باشد. یک پیوست شبکه باید در همان منطقه‌ی سرویس تولیدکننده باشد.

پیوست شبکه را ایجاد کنید

درون Cloud Shell، پیوست شبکه را ایجاد کنید.

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

توجه: لازم نیست شناسه پروژه پذیرفته شده را به طور صریح در این پیوست ذکر کنید، وقتی vertex AI پیکربندی شود، پروژه مستاجر مدیریت شده توسط گوگل به طور خودکار اضافه می‌شود، گویی که روی "پذیرش خودکار" پیکربندی شده است.

فهرست کردن پیوست‌های شبکه

درون Cloud Shell، پیوست شبکه را فهرست کنید.

gcloud compute network-attachments list

پیوست‌های شبکه را شرح دهید

درون Cloud Shell، پیوست شبکه را شرح دهید.

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

نام پیوست شبکه PSC، psc-network-attachment ، را که توسط تولیدکننده هنگام ایجاد رابط اتصال سرویس خصوصی استفاده خواهد شد، یادداشت کنید.

برای مشاهده آدرس اینترنتی پیوست شبکه PSC در Cloud Console، به مسیر زیر بروید:

سرویس‌های شبکه → اتصال سرویس خصوصی → پیوست شبکه → psc-network-attachment

b969cca5242d9c8a.png

۸. منطقه DNS خصوصی

شما یک منطقه DNS ابری برای demo.com ایجاد خواهید کرد و آن را با رکوردهای A که به آدرس‌های IP ماشین‌های مجازی شما اشاره می‌کنند، پر خواهید کرد. بعداً، DNS peering در کار 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، رکوردهای مربوط به ماشین مجازی، 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، رکوردهای تنظیم‌شده برای Secure Web Proxy را ایجاد کنید، مطمئن شوید که آدرس IP را بر اساس خروجی محیط خود به‌روزرسانی می‌کنید.

gcloud dns --project=$projectid record-sets create explicit-swp.demo.com. --zone="private-dns-codelab" --type="A" --ttl="300" --rrdatas="10.10.10.5"

یک قانون فایروال ابری ایجاد کنید تا دسترسی از رابط PSC امکان‌پذیر باشد

در بخش بعدی، یک قانون فایروال ایجاد کنید که به ترافیک ناشی از PSC Network Attachment اجازه دسترسی به منابع محاسباتی RFC 1918 در VPC مصرف‌کننده را بدهد.

در Cloud Shell، یک قانون فایروال ورودی ایجاد کنید که امکان دسترسی از زیرشبکه فقط پروکسی به زیرشبکه کلاس e را فراهم کند. SWP اتصال را با زیرشبکه فقط پروکسی به عنوان آدرس منبع آغاز می‌کند.

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.100.0/28" \
    --destination-ranges="240.0.0.0/4" \
    --enable-logging

۹. یک دفترچه یادداشت ژوپیتر ایجاد کنید

بخش زیر شما را در ایجاد یک Jupyter Notebook راهنمایی می‌کند. این Notebook برای استقرار یک Vertex AI Pipelines Job استفاده می‌شود که یک 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"

حساب کاربری سرویس را با نقش Storage Admin به‌روزرسانی کنید.

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

حساب کاربری سرویس را با نقش کاربر پلتفرم هوش مصنوعی به‌روزرسانی کنید.

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

حساب کاربری سرویس را با نقش Artifact Registry Admin به‌روزرسانی کنید.

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

حساب کاربری سرویس را با نقش Cloud Build Editor به‌روزرسانی کنید.

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

به حساب سرویس نوت‌بوک اجازه دهید از حساب سرویس پیش‌فرض 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 ایجاد کنید

در بخش بعدی، یک نمونه Vertex AI Workbench ایجاد کنید که حساب سرویس قبلاً ایجاد شده، notebook-sa ، را در خود جای دهد.

درون Cloud Shell، نمونه کلاینت خصوصی را ایجاد کنید.

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

۱۱. به‌روزرسانی عامل سرویس هوش مصنوعی ورتکس

Vertex AI از طرف شما برای انجام عملیاتی مانند دریافت آدرس IP از زیرشبکه پیوست شبکه PSC که برای ایجاد رابط PSC استفاده می‌شود، عمل می‌کند. برای انجام این کار، Vertex AI از یک عامل سرویس (که در زیر ذکر شده است) استفاده می‌کند که به مجوز مدیر شبکه نیاز دارد.

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

توجه : قبل از به‌روزرسانی مجوزهای عامل سرویس، به Vertex AI در Cloud Console بروید تا مطمئن شوید که Vertex AI API فعال است.

درون پوسته ابری:

شماره پروژه خود را دریافت کنید.

gcloud projects describe $projectid | grep projectNumber

شماره پروژه خود را تنظیم کنید.

projectnumber=YOUR-PROJECT-NUMBER

یک حساب کاربری سرویس برای پلتفرم هوش مصنوعی ایجاد کنید. اگر در پروژه خود یک حساب کاربری سرویس دارید، از این مرحله صرف نظر کنید.

gcloud beta services identity create --service=aiplatform.googleapis.com --project=$projectnumber

حساب کاربری عامل سرویس را با نقش compute.networkAdmin به‌روزرسانی کنید.

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

حساب کاربری سرویس ایجنت را با نقش 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"

حساب کاربری سرویس پیش‌فرض را با نقش storage.admin به‌روزرسانی کنید.

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

حساب کاربری سرویس پیش‌فرض را با نقش artifactregistry.admin به‌روزرسانی کنید.

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

۱۲. نصب Apache2 و فعال کردن Tcpdump روی 'class-e-vm':

از طریق پروکسی امن وب، آپاچی ۲ را از طریق class-e-vm نصب کنید:

یک تب جدید Cloud Shell باز کنید، متغیر پروژه خود را به‌روزرسانی کنید و با استفاده از ssh به class-e-vm دسترسی پیدا کنید.

gcloud compute ssh --zone us-central1-a "class-e-vm" --tunnel-through-iap --project $projectid
sudo apt-get -o Acquire::http::Proxy="http://10.10.10.5:8080" update
sudo apt-get -o Acquire::http::Proxy="http://10.10.10.5:8080" install apache2 -y
sudo service apache2 restart
echo 'class-e Server !!' | sudo tee /var/www/html/index.html

فیلترینگ tcpdump را روی زیرشبکه‌ای که فقط پروکسی دارد اجرا کنید، که توسط Secure Web Proxy برای ارسال ترافیک به اهداف استفاده می‌شود.

از سیستم عامل class-e-vm، فیلترینگ tcpdump را روی زیرشبکه proxy-vm اجرا کنید.

sudo tcpdump -i any net 10.10.100.0/24 -nn

توجه: مطمئن شوید که برای باز شدن JupyterLab Session، گزینه Private Google Access را در زیرشبکه نمونه workbench-tutorial فعال کرده‌اید.

۱۳. استقرار شغل Vertex AI Pipelines

در بخش بعدی، شما یک دفترچه یادداشت برای انجام یک wget موفق از Vertex AI Pipelines به پروکسی صریح ایجاد خواهید کرد. این به شما امکان می‌دهد به ماشین‌های مجازی غیر RFC 1918، مانند class-e-vm ، دسترسی پیدا کنید. برای دسترسی Vertex AI Pipelines به rfc1918-vm ، نیازی به پروکسی صریح نیست، زیرا هدف آن یک آدرس IP RFC 1918 است.

کار آموزشی را در نمونه Vertex AI Workbench اجرا کنید.

  1. در کنسول گوگل کلود، به تب نمونه‌ها در صفحه Vertex AI Workbench بروید.
  2. در کنار نام نمونه Vertex AI Workbench خود (workbench-tutorial)، روی Open JupyterLab کلیک کنید. نمونه Vertex AI Workbench شما در JupyterLab باز می‌شود.
  3. فایل > جدید > دفترچه یادداشت را انتخاب کنید
  4. هسته > پایتون ۳ را انتخاب کنید

در نوت‌بوک 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://explicit-swp.demo.com:8080"
  • یک FQDN با ماشین مجازی پروکسی مستقر در VPC مصرف‌کننده مرتبط است. ما در مرحله بعدی از DNS peering برای حل 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 nonRFC-1918 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://explicit-swp.demo.com:8080" # replace it with your Secure Web proxy Ip-address and the 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 خود، سلول زیر را ایجاد و اجرا کنید، به نکات برجسته زیر توجه کنید:

  • DNS Peering به VPC های مصرف کننده با استفاده از dnsPeeringConfigs (dnsPeeringConfigs) برای نام دامنه demo.com پیکربندی شده است.
  • پروکسی وب حالت مسیریابی صریح در اینجا explicit-swp.demo.com است. وضوح از طریق DNS peering در VPC مصرف‌کننده مدیریت می‌شود.
  • پورت ۸۰۸۰ پورتی است که به صورت پیش‌فرض در Secure Web Proxy پیکربندی شده و در حال گوش دادن به اطلاعات است.
  • wget به class-e-vm-demo.com از طریق DNS peering اجرا می‌شود.
  • این کد، "psc-network-attachment" را برای Vertex مشخص می‌کند و آن را قادر می‌سازد تا از زیرشبکه‌ی اتصال شبکه برای استقرار دو نمونه‌ی رابط 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 = "explicit-swp.demo.com" #@param {type:"string"}
PROXY_VM_PORT = "8080" #@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)

۱۴. اعتبارسنجی رابط PSC

همچنین می‌توانید IPهای اتصال شبکه مورد استفاده توسط Vertax AI Pipelines را با رفتن به مسیر زیر مشاهده کنید:

سرویس‌های شبکه → اتصال سرویس خصوصی → پیوست شبکه → psc-network-attachment

پروژه مستاجر را انتخاب کنید (نام پروژه به -tp ختم می‌شود)

a2e0b6d6243f26f1.png

فیلد هایلایت شده، آدرس IP مورد استفاده توسط Vertex AI Pipelines از پیوست شبکه PSC را نشان می‌دهد.

11e411ea919d3bad.png

۱۵. اعتبارسنجی ثبت وقایع ابری

اجرای اولین بار Vertex AI Pipelines تقریباً ۱۴ دقیقه طول می‌کشد، اجراهای بعدی بسیار کوتاه‌تر هستند. برای اعتبارسنجی یک نتیجه موفقیت‌آمیز، موارد زیر را انجام دهید:

به Vertex AI → Training → Custom jobs بروید

کار سفارشی اجرا شده را انتخاب کنید

2f467254aa0c2e3a.png

مشاهده گزارش‌ها را انتخاب کنید

8d525d3b152bcc61.png

پس از در دسترس بودن Cloud Logging، گزینه Run Query را انتخاب کنید که گزینه هایلایت شده زیر را ایجاد می‌کند و دریافت موفقیت‌آمیز wget از Vertex AI Pipelines به class-e-vm را تأیید می‌کند.

a4f9e9167f4ce1ae.png

۳۸۹۷۲f۸۳۴aa۲bd۱d.png

۱۶. اعتبارسنجی TCPDump

بیایید خروجی TCPDUMP را که اتصال به نمونه‌های محاسباتی را بیشتر تأیید می‌کند، بررسی کنیم:

از class-e-vm HTTP GET و 200 OK را مشاهده کنید.

XXXXXXXXX@class-e-vm:~$ sudo tcpdump -i any net 10.10.100.0/28 -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
05:51:14.173641 ens4  In  IP 10.10.100.8.55306 > 240.0.0.2.80: Flags [S], seq 1747181041, win 65535, options [mss 1420,sackOK,TS val 3942828403 ecr 0,nop,wscale 8], length 0
05:51:14.173668 ens4  Out IP 240.0.0.2.80 > 10.10.100.8.55306: Flags [S.], seq 3013226100, ack 1747181042, win 64768, options [mss 1420,sackOK,TS val 1886125065 ecr 3942828403,nop,wscale 7], length 0
05:51:14.174977 ens4  In  IP 10.10.100.8.55306 > 240.0.0.2.80: Flags [.], ack 1, win 1054, options [nop,nop,TS val 3942828405 ecr 1886125065], length 0
05:51:14.175066 ens4  In  IP 10.10.100.8.55306 > 240.0.0.2.80: Flags [P.], seq 1:223, ack 1, win 1054, options [nop,nop,TS val 3942828405 ecr 1886125065], length 222: HTTP: GET / HTTP/1.1
05:51:14.175096 ens4  Out IP 240.0.0.2.80 > 10.10.100.8.55306: Flags [.], ack 223, win 505, options [nop,nop,TS val 1886125066 ecr 3942828405], length 0
05:51:14.239042 ens4  Out IP 240.0.0.2.80 > 10.10.100.8.55306: Flags [P.], seq 1:246, ack 223, win 505, options [nop,nop,TS val 1886125130 ecr 3942828405], length 245: HTTP: HTTP/1.1 200 OK

۱۷. تمیز کردن

از Cloud Shell، اجزای آموزشی را حذف کنید.

gcloud workbench instances delete workbench-tutorial --project=$projectid --location=us-central1-a

gcloud network-security gateway-security-policies rules delete allow-nonrfc-classe \
    --gateway-security-policy=policy1 \
    --location=us-central1

gcloud network-security gateway-security-policies rules delete allow-apache2 \
    --gateway-security-policy=policy1 \
    --location=us-central1

gcloud network-security gateway-security-policies delete policy1 \
    --location=us-central1
gcloud network-services gateways delete swp1 \
    --location=us-central1

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 explicit-swp.demo.com --zone=private-dns-codelab  --type=A

gcloud dns managed-zones delete private-dns-codelab

gcloud computeinstances delete class-e-vm --project=$projectid --zone=us-central1-a --quiet
gcloud compute networks delete consumer-vpc --quiet

۱۸. تبریک

تبریک می‌گوییم، شما با موفقیت اتصال بین Vertex AI Pipelines Private Service Connect Interface را به محدوده‌های IP غیر RFC از طریق Secure Web Proxy پیکربندی و تأیید کردید.

شما زیرساخت مصرف‌کننده را ایجاد کردید و یک پیوست شبکه اضافه کردید که به تولیدکننده اجازه می‌داد یک ماشین مجازی چند کارت شبکه‌ای برای ایجاد پل ارتباطی بین مصرف‌کننده و تولیدکننده ایجاد کند. شما یاد گرفتید که چگونه DNS peering ایجاد کنید و در عین حال یک پروکسی صریح در شبکه VPC مصرف‌کننده مستقر کنید که امکان اتصال به نمونه class-e-vm را که مستقیماً از Vertex قابل مسیریابی نیست، فراهم می‌کند.

678ba30d64a76795.png

بعدش چی؟

مطالعه بیشتر و ویدیوها

اسناد مرجع