Agent Engine PSC Explicit Proxy

1. مقدمه

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

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

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

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

ملاحظات دسترسی PSC-Interface AI Vertex

  • PSC-Interface قادر است ترافیک را به VPC یا مقصدهای مبتنی بر Premesis در بلوک آدرس RFC1918 هدایت کند.
  • PSC-Interface که بلوک‌های آدرس غیر rfc-1918 را هدف قرار می‌دهد به یک پروکسی صریح مستقر در VPC مصرف‌کننده با آدرس rfc-1918 نیاز دارد. در استقرار Vertex AI، پروکسی باید به همراه FQDN نقطه پایانی هدف تعریف شود.
  • هنگامی که استقرار خود را فقط با یک رابط PSC پیکربندی می کنید، دسترسی به اینترنت پیش فرض خود را حفظ می کند. این ترافیک خروجی مستقیماً از شبکه مستاجر ایمن و تحت مدیریت Google خارج می شود.

ملاحظات Vertex AI PSC-Interface VPC-SC

  • وقتی پروژه شما بخشی از محیط کنترل‌های سرویس VPC است، دسترسی پیش‌فرض مستاجرین تحت مدیریت Google به اینترنت توسط محیط مسدود می‌شود تا از نفوذ داده‌ها جلوگیری شود.
  • برای اجازه دسترسی استقرار به اینترنت عمومی در این سناریو، باید به صراحت یک مسیر خروج ایمن را پیکربندی کنید که ترافیک را از طریق VPC شما هدایت کند.
  • راه توصیه شده برای دستیابی به این هدف، راه اندازی یک سرور پراکسی در محیط VPC با آدرس RFC1918 و ایجاد یک دروازه NAT Cloud برای اجازه دسترسی به اینترنت پراکسی VM است.

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

استقرار یک عامل | هوش مصنوعی مولد در Vertex AI | Google Cloud

راه اندازی یک رابط Private Service Connect برای منابع Vertex AI | Google Cloud

چیزی که خواهی ساخت

در این آموزش، شما قصد دارید یک Agent Engine جامع با رابط Private Service Connect (PSC) بسازید تا امکان اتصال به یک سایت عمومی (https://api.frankfurter.app/) را از طریق یک Proxy VM مستقر در VPC مصرف کننده با آدرس RFC1918 فراهم کند. استقرار مثال در یک پروژه فعال VPC-SC یا برای مدیرانی که به جای vpc مستاجر نیاز به خروج اینترنت از طریق شبکه مشتریان دارند، قابل اجرا است.

شکل 1

f42f2db921f6d5af.png

شما یک پیوست شبکه psc را در VPC مصرف‌کننده ایجاد می‌کنید که از همتاسازی DNS برای حل‌وفصل شبکه مصرف‌کننده پروکسی-vm در پروژه مستاجر میزبان Agent Engine استفاده می‌کند که منجر به موارد استفاده زیر می‌شود:

استقرار Agent Engine و پیکربندی یک VM پراکسی برای عمل به عنوان یک پروکسی صریح، به آن اجازه می دهد تا به یک URL عمومی https://api.frankfurter.app برسد.

چیزی که یاد خواهید گرفت

  • نحوه ایجاد پیوست شبکه
  • چگونه یک تولید کننده می تواند از پیوست شبکه برای ایجاد یک رابط PSC استفاده کند
  • نحوه برقراری ارتباط از تولید کننده با مصرف کننده با استفاده از DNS Peering
  • نحوه استقرار و استفاده از پروکسی vm برای خروج از اینترنت

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

پروژه Google Cloud

مجوزهای IAM

2. قبل از شروع

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

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

در داخل 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 "iap.googleapis.com"

بررسی کنید که APIها با موفقیت فعال شده باشند

gcloud services list --enabled

3. راه اندازی مصرف کننده

Consumer VPC را ایجاد کنید

این VPC در پروژه مشتری قرار دارد. منابع زیر در این VPC ایجاد خواهند شد

  • زیرشبکه مصرف کننده
  • زیرشبکه پیوست شبکه
  • روتر ابری (برای Cloud NAT مورد نیاز است)
  • Cloud NAT

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

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

زیرشبکه های مصرف کننده ایجاد کنید

در داخل Cloud Shell، زیرشبکه را برای Proxy VM ایجاد کنید:

gcloud compute networks subnets create rfc1918-subnet1 --project=$projectid --range=10.10.10.0/28 --network=consumer-vpc --region=us-central1

زیرشبکه Private Service Connect Network Attachment را ایجاد کنید

در داخل Cloud Shell، زیرشبکه ای برای پیوست شبکه PSC ایجاد کنید:

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

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

در این آموزش از Cloud NAT برای دسترسی به اینترنت برای پروکسی VM استفاده می شود که آدرس IP عمومی ندارد. Cloud NAT این امکان را برای ماشین‌های مجازی با آدرس‌های IP خصوصی فراهم می‌کند تا به اینترنت متصل شوند و به آنها اجازه می‌دهد کارهایی مانند نصب بسته‌های نرم‌افزاری را انجام دهند.

در داخل Cloud Shell، Cloud Router را ایجاد کنید.

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

در داخل Cloud Shell، دروازه NAT را با ورود فعال ایجاد کنید. ما از ورود به سیستم برای تأیید اعتبار دسترسی به IP عمومی برای Frankfurter API (https://api.frankfurter.app/) استفاده خواهیم کرد.

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 شما متصل شود، یک قانون فایروال ایجاد کنید که:

  • برای تمام نمونه های VM که می خواهید با استفاده از 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

5. نمونه های VM مصرف کننده ایجاد کنید

در Cloud Shell، نمونه VM مصرف کننده، proxy-vm را ایجاد کنید، که به عنوان پروکسی صریح برای Agent Engine عمل می کند. ما از tinyproxy به عنوان برنامه کاربردی برای پروکسی کردن ترافیک HTTP استفاده خواهیم کرد.

gcloud compute instances create proxy-vm \
    --project=$projectid \
    --machine-type=e2-micro \
    --image-family debian-11 \
    --no-address \
    --can-ip-forward \
    --image-project debian-cloud \
    --zone us-central1-a \
    --subnet=rfc1918-subnet1 \
    --shielded-secure-boot \
    --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 هستند. شما یک زیرشبکه منفرد را با یک پیوست شبکه مرتبط می‌کنید، و سازنده IPها را از آن زیرشبکه به رابط Private Service Connect اختصاص می‌دهد. زیرشبکه باید در همان ناحیه پیوست شبکه باشد. یک پیوست شبکه باید در همان منطقه ای باشد که سرویس تولیدکننده است.

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

در داخل 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

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

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

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

8eec51cb197da218.png

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

شما یک Cloud DNS Zone برای demo.com ایجاد می کنید و آن را با یک رکورد A پر می کنید که به آدرس های IP پروکسی-vm شما اشاره می کند. بعداً همتاسازی DNS در Agent Engine مستقر خواهد شد که امکان دسترسی به سوابق DNS مصرف کننده را فراهم می کند.

در داخل Cloud Shell، موارد زیر را انجام دهید که یک نام DNS demo.com ایجاد می کند.

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"

آدرس های IP نمونه های مورد استفاده برای رکوردهای DNS A را دریافت و ذخیره کنید.

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

gcloud compute instances describe proxy-vm --zone=us-central1-a | grep  networkIP:

در داخل Cloud Shell، رکوردهای تنظیم شده برای VM، proxy-vm.demo.com را ایجاد کنید، اطمینان حاصل کنید که آدرس 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"

یک قانون Cloud Firewall ایجاد کنید تا اجازه دسترسی از رابط PSC را بدهد

در بخش زیر، یک قانون فایروال ایجاد کنید که به ترافیک ناشی از پیوست شبکه PSC اجازه دسترسی به پروکسی-vm در Consumer VPC را می دهد.

در Cloud Shell، قانون دیوار آتش ورودی را ایجاد کنید.

gcloud compute firewall-rules create allow-access-to-compute \
    --network=consumer-vpc \
    --action=ALLOW \
    --rules=ALL \
    --direction=INGRESS \
    --priority=1000 \
    --source-ranges="192.168.10.0/28" \
    --destination-ranges="10.10.10.0/28" \
    --enable-logging

8. یک نوت بوک Jupyter ایجاد کنید

بخش زیر شما را از طریق ایجاد یک نوت بوک Jupyter راهنمایی می کند. این نوت بوک برای استقرار Agent Engine با هدف قرار دادن یک پروکسی صریح برای Internet Egress استفاده خواهد شد.

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

در بخش زیر، یک حساب کاربری ایجاد خواهید کرد که با نمونه Vertex AI Workbench استفاده شده در آموزش مرتبط خواهد بود.

در آموزش، حساب سرویس دارای نقش های زیر خواهد بود:

در داخل Cloud Shell، حساب سرویس را ایجاد کنید.

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

در داخل Cloud Shell، حساب سرویس را با نقش Storage Admin به‌روزرسانی کنید.

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

در داخل Cloud Shell، حساب سرویس را با نقش Vertex AI User به روز کنید.

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

در داخل Cloud Shell، حساب سرویس را با نقش Artifact Registry Admin به‌روزرسانی کنید.

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

در داخل Cloud Shell، به حساب سرویس نوت بوک اجازه دهید از حساب خدمات پیش فرض Compute Engine استفاده کند.

gcloud iam service-accounts add-iam-policy-binding \
    $(gcloud projects describe $(gcloud config get-value project) --format='value(projectNumber)')-compute@developer.gserviceaccount.com \
    --member="serviceAccount:notebook-sa@$projectid.iam.gserviceaccount.com" \
    --role="roles/iam.serviceAccountUser"

9. پروکسی صریح را به روز کنید

در بخش بعدی، باید 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

10. یک Vertex AI Workbench Instance ایجاد کنید

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

Inside 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

11. Vertex AI Service Agent Update

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

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

در داخل Cloud Shell، شماره پروژه خود را بدست آورید.

gcloud projects describe $projectid | grep projectNumber

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

projectnumber=YOUR-PROJECT-Number

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

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"

به روز رسانی حساب پیش فرض سرویس

به Vertex AI اجازه دسترسی به حساب سرویس پیش فرض خود را بدهید . توجه داشته باشید که ممکن است مدتی طول بکشد تا تغییر دسترسی منتشر شود.

در داخل Cloud Shell، حساب سرویس پیش فرض را با role aiplatform.user به روز کنید

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

12. پروکسی VM Tcpdump

برای تأیید اعتبار اتصال IP از Agent Engine، می‌توانیم از TCPDUMP استفاده کنیم. این به ما این امکان را می دهد که هنگام فراخوانی درخواست دریافت از Agent Engine به URL عمومی، ارتباطاتی را که از زیرشبکه پیوست شبکه PSC، 192.168.10.0/28 سرچشمه می گیرد، مشاهده کنیم.

از Cloud Shell ssh به پروکسی vm.

gcloud compute ssh --zone us-central1-a "proxy-vm" --tunnel-through-iap --project $projectid

از سیستم عامل proxy-vm، tcpdump را اجرا کنید.

sudo tcpdump -i any net 192.168.10.0/28 -nn

13. Deploy Agent Engine

توجه: برای تکمیل وظایف این بخش از کنسول GCP و نوت بوک JupyterLab استفاده خواهیم کرد

در بخش زیر، یک دفترچه یادداشت ایجاد خواهید کرد که وظایف زیر را انجام می دهد:

  • از فرانکفورتر API (https://api.frankfurter.app/) برای به دست آوردن داده های نرخ ارز استفاده می کند.
  • به یک پروکسی صریح (proxy_server) اشاره می کند که پروکسی-vm را در vpc مصرف کنندگان با استفاده از FQDN proxy-vm.demo.com هدف قرار می دهد.
  • dnsPeeringConfigs "domain" را تعریف کنید: "demo.com."

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

  • در کنسول Google Cloud، به Vertex AI → Workbench بروید
  • در کنار نام نمونه Vertex AI Workbench خود (workbench-tutorial)، روی Open JupyterLab کلیک کنید. نمونه Vertex AI Workbench شما در JupyterLab باز می شود.
  • File > New > Notebook را انتخاب کنید
  • هسته > پایتون 3 را انتخاب کنید

نصب کتابخانه‌های ضروری پایتون: کتابخانه‌های مورد نیاز برای Agent Engine، از جمله pyyaml، google-cloud-aiplatform، cloudpickle، google-cloud-api-keys و langchain-google-vertexai را نصب کنید.

در نوت بوک JupyterLab یک سلول جدید ایجاد کنید و موارد زیر را اجرا کنید.

!pip install pyyaml
!pip install google-cloud-aiplatform[agent_engines,langchain]==1.96.0
!pip install cloudpickle==3.1.1
!pip install google-cloud-api-keys
!pip install langchain-google-vertexai==2.0.24

هسته نوت بوک Jupyter را مجدداً راه اندازی کنید: اطمینان حاصل کنید که کتابخانه های تازه نصب شده به درستی بارگیری شده اند.

در نوت بوک JupyterLab یک سلول جدید ایجاد کنید و موارد زیر را اجرا کنید.

# Restart the notebook kernel after install, so you can run langchain successfully.

import IPython

app = IPython.Application.instance()
app.kernel.do_shutdown(True)

تنظیم متغیرهای پروژه و سطل: شناسه پروژه Google Cloud، شماره پروژه، نام سرویس، فهرست راهنمای GCS، نقطه پایانی، نام سطل و مکان خود را تعریف کنید.

قبل از اجرای سلول، فیلدهای زیر را به روز کنید

  • PROJECT_ID = "projectid خود را وارد کنید"
  • PROJECT_NUMBER = "شماره پروژه خود را وارد کنید"
  • BUCKET= "نام سطل را وارد کنید"

نکته: در مرحله بعد از متغیر BUCKET برای ایجاد یک سطل Cloud Storage استفاده می کنیم.

در نوت بوک JupyterLab، یک سلول جدید ایجاد کنید، به روز رسانی کنید و موارد زیر را اجرا کنید.

PROJECT_ID = "enter-your-projectid"  #@param {type:"string"}
PROJECT_NUMBER = "enter-your-projectnumber"  #@param {type:"string"}
SERVICE_NAME = "aiplatform"  #@param ["autopush-aiplatform", "staging-aiplatform", "aiplatform"]
# @markdown  Specify where your agent code should be written in GCS:
GCS_DIR = "reasoning-engine-test"  #@param {type:"string"}
ENDPOINT = "https://us-central1-aiplatform.googleapis.com" # @param ["https://us-central1-aiplatform.googleapis.com", "https://us-central1-autopush-aiplatform.sandbox.googleapis.com", "https://us-central1-staging-aiplatform.sandbox.googleapis.com"]
BUCKET= "enter-a-unique-bucket-name" #@param {type:"string"}
LOCATION="us-central1" #@param {type:"string"}

ایجاد یک سطل GCS: یک سطل Cloud Storage برای ذخیره کد عامل ایجاد کنید.

در نوت بوک JupyterLab یک سلول جدید ایجاد کنید و موارد زیر را اجرا کنید.

!gcloud storage buckets create gs://{BUCKET}

تعریف نام پیوست شبکه: نام پیوست شبکه Private Service Connect خود را مشخص کنید.

در نوت بوک JupyterLab یک سلول جدید ایجاد کنید و موارد زیر را اجرا کنید.

NETWORK_ATTACHMENT_NAME = 'psc-network-attachment' #@param {type:"string"}

راه‌اندازی کتابخانه‌های کلاینت پایتون: کتابخانه‌های مشتری لازم را برای سرویس‌های Google Cloud تنظیم کنید.

در نوت بوک JupyterLab یک سلول جدید ایجاد کنید و موارد زیر را اجرا کنید.

import json
import pprint

import cloudpickle
from google import auth as google_auth
from google.auth.transport import requests as google_requests
from google.cloud import storage
import yaml


def get_identity_token():
    """Gets ID token for calling Cloud Run."""
    credentials, _ = google_auth.default()
    auth_request = google_requests.Request()
    credentials.refresh(auth_request)
    return credentials.id_token

if not GCS_DIR or "your_ldap" in GCS_DIR:
    raise ValueError("GCS_DIR must be set or you must set your ldap.")

if not PROJECT_ID:
    raise ValueError("PROJECT_ID must be set.")


client = storage.Client(project=PROJECT_ID)
bucket = client.get_bucket(BUCKET)

پیکربندی عامل و ابزار: کلاس StreamingAgent و تابع get_exchange_rate را برای واکشی نرخ مبادله ارز با استفاده از Frankfurter API از طریق پراکسی صریح تعریف کنید.

در نوت بوک JupyterLab خود، یک سلول جدید ایجاد کنید و پیکربندی زیر را اجرا کنید، به نکات برجسته زیر توجه کنید:

  • تابع def get_exchange_rate از Frankfurter API (https://api.frankfurter.app/) برای به دست آوردن داده های نرخ ارز استفاده می کند.
  • proxy_server = "http://proxy-vm.demo.com:8888" FQDN با پروکسی vm مستقر در VPC مصرف کننده مرتبط است. ما از همتاسازی DNS برای حل و فصل FQDN در مرحله بعد استفاده می کنیم.
from langchain_google_vertexai import ChatVertexAI
from langchain.agents import AgentExecutor
from langchain.agents.format_scratchpad.tools import format_to_tool_messages
from langchain.agents.output_parsers.tools import ToolsAgentOutputParser
from langchain.tools.base import StructuredTool
from langchain_core import prompts
from re import S
from typing import Callable, Sequence
import google.auth
import vertexai


class StreamingAgent:

    def __init__(
            self,
            model: str,
            tools: Sequence[Callable],
            project_id: str,
        ):
        self.model_name = model
        self.tools = tools
        self.project_id = project_id

    def set_up(self):
        """All unpickle-able logic should go here.

        The .set_up() method should not be called for an object that is being
        prepared for deployment.
        """
        creds, _ = google.auth.default(quota_project_id=self.project_id)
        vertexai.init(project=self.project_id, location="us-central1", credentials=creds)

        prompt = {
            "input": lambda x: x["input"],
            "agent_scratchpad": (
                lambda x: format_to_tool_messages(x["intermediate_steps"])
            ),
        } | prompts.ChatPromptTemplate.from_messages([
            ("user", "{input}"),
            prompts.MessagesPlaceholder(variable_name="agent_scratchpad"),
        ])

        llm = ChatVertexAI(model_name=self.model_name)
        if self.tools:
            llm = llm.bind_tools(tools=self.tools)

        self.agent_executor = AgentExecutor(
            agent=prompt | llm | ToolsAgentOutputParser(),
            tools=[StructuredTool.from_function(tool) for tool in self.tools],
        )

    def query(self, input: str):
        """Query the application.

        Args:
            input: The user prompt.

        Returns:
            The output of querying the application with the given input.
        """
        return self.agent_executor.invoke(input={"input": input})

    def stream_query(self, input: str):
        """Query the application and stream the output.

        Args:
            input: The user prompt.

        Yields:
            Chunks of the response as they become available.
        """
        for chunk in self.agent_executor.stream(input={"input": input}):
            yield chunk

def get_exchange_rate(
    currency_from: str = "USD",
    currency_to: str = "EUR",
    currency_date: str = "latest",
):
    """Retrieves the exchange rate between two currencies on a specified date.

    Uses the Frankfurter API (https://api.frankfurter.app/) to obtain
    exchange rate data.

    Args:
        currency_from: The base currency (3-letter currency code).
            Defaults to "USD" (US Dollar).
        currency_to: The target currency (3-letter currency code).
            Defaults to "EUR" (Euro).
        currency_date: The date for which to retrieve the exchange rate.
            Defaults to "latest" for the most recent exchange rate data.
            Can be specified in YYYY-MM-DD format for historical rates.

    Returns:
        dict: A dictionary containing the exchange rate information.
            Example: {"amount": 1.0, "base": "USD", "date": "2023-11-24",
                "rates": {"EUR": 0.95534}}
    """
    import requests

    proxy_server = "http://proxy-vm.demo.com:8888" # This is the VM's FQDN to reach the proxy vm in the consumers network

    proxies = {
       "http": proxy_server,
       "https": proxy_server,
    }
    response = requests.get(
        f"https://api.frankfurter.app/{currency_date}",
        params={"from": currency_from, "to": currency_to},
        proxies=proxies,
    )
    return response.json()

آپلود فایل‌های عامل در فضای ذخیره‌سازی ابری: عامل سریال و الزامات آن را در سطل GCS تعیین‌شده خود آپلود کنید.

در نوت بوک JupyterLab، یک سلول جدید ایجاد کنید و موارد زیر را اجرا کنید:

# Upload files to Cloud Storage.
if not GCS_DIR:
    raise ValueError("GCS_DIR must be set.")

FILE = "streaming_agent.pkl"
blob = bucket.blob(f"{GCS_DIR}/{FILE}")
with blob.open("wb") as f:
    cloudpickle.dump(
        StreamingAgent(
            model="gemini-2.0-flash-001",  # Required.
            tools=[get_exchange_rate],  # Optional.
            project_id=PROJECT_ID
        ), f)


requirements = """
google-cloud-aiplatform[agent_engines,langchain]==1.96.0
cloudpickle==3.1.1
"""

blob = bucket.blob(f"{GCS_DIR}/requirements-streaming.txt")
blob.upload_from_string(requirements)

!gsutil ls gs://{BUCKET}/{GCS_DIR}

Deploy Agent Engine: Agent Engine را با رابط PSC و همتاسازی DNS پیکربندی کنید تا FQDN VM پراکسی را در VPC مصرف کننده حل کند.

در نوت بوک JupyterLab، سلول زیر را ایجاد و اجرا کنید، به نکات برجسته زیر توجه کنید:

  • DNS Peering به VPCهای مصرف کننده با استفاده از dnsPeeringConfigs (dnsPeeringConfigs) برای نام دامنه demo.com پیکربندی شده است.
import requests


token = !gcloud auth application-default print-access-token

response = requests.post(
    f"{ENDPOINT}/v1beta1/projects/{PROJECT_ID}/locations/{LOCATION}/reasoningEngines",
    headers={
        "Content-Type": "application/json; charset=utf-8",
        "Authorization": f"Bearer {token[0]}"
    },
    data=json.dumps({
        "displayName": "PSC-I Explicit Proxy",
        "description": "test psc-i agent + proxy vm",
        "spec": {
            "packageSpec": {
                "pickleObjectGcsUri": f"gs://{BUCKET}/{GCS_DIR}/streaming_agent.pkl",
                "requirementsGcsUri": f"gs://{BUCKET}/{GCS_DIR}/requirements-streaming.txt",
                "pythonVersion": "3.10"
            },
            "deploymentSpec": {
                "pscInterfaceConfig": {
                    "networkAttachment": NETWORK_ATTACHMENT_NAME,
                    "dnsPeeringConfigs": [
                    {
                      "domain": "demo.com.",
                      "targetProject": PROJECT_ID,
                      "targetNetwork": "consumer-vpc", #Consumer VPC
                    },
                  ],
                }
            }
        },
    })
)

pprint.pprint(json.loads(response.content))
reasoning_engine_id = json.loads(response.content)["name"].split("/")[5]
pprint.pprint(reasoning_engine_id)

وضعیت استقرار مانیتور: وضعیت عملیات استقرار Agent Engine را بررسی کنید.

در نوت بوک JupyterLab یک سلول جدید ایجاد کنید و موارد زیر را اجرا کنید.

operation_id = json.loads(response.content)["name"].split("/")[7]
pprint.pprint(operation_id)

در نوت بوک JupyterLab یک سلول جدید ایجاد کنید و موارد زیر را اجرا کنید.

توجه: تکمیل این عملیات ممکن است حدود 5 دقیقه طول بکشد. برای بررسی پیشرفت، سلول را دوباره اجرا کنید. لطفاً تا زمانی که خروجی مشابه تصویر زیر را مشاهده نکنید، به بخش بعدی نروید.

# You can run this multiple times to check the status of the deployment operation, operation takes approx 5 min.
token = !gcloud auth application-default print-access-token
response = requests.get(
    f"{ENDPOINT}/v1beta1/projects/{PROJECT_ID}/locations/{LOCATION}/operations/{operation_id}        ",
    headers={
        "Content-Type": "application/json; charset=utf-8",
        "Authorization": f"Bearer {token[0]}"
    }
)
pprint.pprint(json.loads(response.content))

مثالی از اجرای موفق:

3f6dcd1074af7651.png

پرس و جو از عامل مستقر شده: برای آزمایش عملکرد آن، یک درخواست به Agent Engine مستقر شده ارسال کنید.

در نوت بوک JupyterLab یک سلول جدید ایجاد کنید و موارد زیر را اجرا کنید.

response = requests.post(
    f"{ENDPOINT}/v1beta1/projects/{PROJECT_ID}/locations/{LOCATION}/reasoningEngines/{reasoning_engine_id}:query",
    headers={
        "Content-Type": "application/json; charset=utf-8",
        "Authorization": f"Bearer {token[0]}"
    },
    data=json.dumps({ "input": {"input": "What is the exchange rate from US dollars to Euro?"} })
)
print(response.text)

نتایج استریم پرس و جو: خروجی را از جستار Agent Engine پخش کنید.

در نوت بوک JupyterLab خود، یک سلول جدید ایجاد کنید و موارد زیر را اجرا کنید که با استفاده از پراکسی صریح در VPC مصرف کنندگان، فراخوانی API را به URL عمومی راه اندازی می کند.

token = !gcloud auth application-default print-access-token
print(f"{ENDPOINT}/v1beta1/projects/{PROJECT_ID}/locations/us-central1/reasoningEngines/{reasoning_engine_id}:streamQuery")

response = requests.post(
    f"{ENDPOINT}/v1beta1/projects/{PROJECT_ID}/locations/us-central1/reasoningEngines/{reasoning_engine_id}:streamQuery",
    headers={
        "Content-Type": "application/json; charset=utf-8",
        "Authorization": f"Bearer {token[0]}"
    },
    data=json.dumps({ "input": {"input": "What is the exchange rate from US dollars to Euro?"} })
)
for chunk in response.iter_lines():
    print(chunk.decode('utf-8'))
# pprint.pprint(json.loads(response.content))

مثالی از اجرای موفق:

1bd81d12426a348f.png

14. اعتبارسنجی Tcpdump

خروجی tcpdump را مشاهده کنید که ارتباط بین آدرس IP پیوست شبکه PSC استفاده شده توسط Agent Engine و Prox-VM را بر اساس پست درخواست توضیح می دهد.

user@proxy-vm:~$ sudo tcpdump -i any net 192.168.10.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
22:17:53.983212 ens4  In  IP 192.168.10.2.22261 > 10.10.10.2.8888: Flags [S], seq 3841740961, win 28800, options [mss 1440,sackOK,TS val 4245243253 ecr 0,nop,wscale 7], length 0
22:17:53.983252 ens4  Out IP 10.10.10.2.8888 > 192.168.10.2.22261: Flags [S.], seq 2232973833, ack 3841740962, win 64768, options [mss 1420,sackOK,TS val 2251247643 ecr 4245243253,nop,wscale 7], length 0
22:17:53.985167 ens4  In  IP 192.168.10.2.22261 > 10.10.10.2.8888: Flags [.], ack 1, win 225, options [nop,nop,TS val 4245243256 ecr 2251247643], length 0
22:17:53.986476 ens4  In  IP 192.168.10.2.22261 > 10.10.10.2.8888: Flags [P.], seq 1:45, ack 1, win 16384, options [nop,nop,TS val 4245243256 ecr 2251247643], length 44
22:17:53.986485 ens4  Out IP 10.10.10.2.8888 > 192.168.10.2.22261: Flags [.], ack 45, win 506, options [nop,nop,TS val 2251247646 ecr 4245243256], length 0
22:17:54.043347 ens4  Out IP 10.10.10.2.8888 > 192.168.10.2.22261: Flags [P.], seq 1:71, ack 45, win 506, options [nop,nop,TS val 2251247703 ecr 4245243256], length 70

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

همچنین می توانید IP های پیوست شبکه مورد استفاده توسط Agent Engine را با پیمایش به موارد زیر مشاهده کنید:

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

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

8a4b5a6e5dfd63d7.png

فیلد برجسته نشان دهنده آدرس IP مورد استفاده Agent Engine از پیوست شبکه PSC است.

c618359f6eafc0c6.png

16. Cloud Logging Validation

از جلسه TCPDump proxy-vm خارج شوید و یک PING به Frankfurter api.frankfurter.app انجام دهید تا آدرس IP عمومی مرتبط را بدست آورید.

ping -c4 api.frankfurter.app 

مثال 104.26.1.198 را به عنوان IP عمومی برای api.frankfurter.app شناسایی می کند.

user@proxy-vm:~$ ping -c4 api.frankfurter.app

PING api.frankfurter.app (104.26.1.198) 56(84) bytes of data.

64 bytes from 104.26.1.198 (104.26.1.198): icmp_seq=1 ttl=61 time=10.9 ms

64 bytes from 104.26.1.198 (104.26.1.198): icmp_seq=2 ttl=61 time=10.9 ms

64 bytes from 104.26.1.198 (104.26.1.198): icmp_seq=3 ttl=61 time=10.9 ms

64 bytes from 104.26.1.198 (104.26.1.198): icmp_seq=4 ttl=61 time=10.9 ms

بیایید نگاهی به NAT Logging بیندازیم تا ببینیم آیا ترافیک برای 104.26.1.198 مشاهده شده است یا خیر.

به مسیر زیر بروید:

مانیتورینگ → Log Explorer

از فیلتر زیر استفاده کنید:

resource.type="nat_gateway"

31024dc29c39084.png

دوره زمانی را انتخاب کنید، سپس Query را اجرا کنید

5976857e92d149d3.png

ورودی گزارشی را که IP عمومی (مقصد) (104.26.1.198) api.frankfurter.app و آدرس IP منبع و نام پروکسی-vm را که استفاده از پراکسی صریح برای خروج از اینترنت را تأیید می کند، گسترش دهید.

14e293a7fea68db4.png

17. پاکسازی کنید

در نوت بوک JupyterLab، یک سلول جدید ایجاد کنید و موارد زیر را اجرا کنید که باعث حذف استقرار Agent Engine می شود.

token = !gcloud auth application-default print-access-token

response = requests.delete(
    f"{ENDPOINT}/v1beta1/projects/{PROJECT_ID}/locations/us-central1/reasoningEngines/{reasoning_engine_id}",
    headers={
        "Content-Type": "application/json; charset=utf-8",
        "Authorization": f"Bearer {token[0]}"
    },
)
print(response.text)

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

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 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 compute networks delete consumer-vpc --quiet

18. تبریک می گویم

تبریک می‌گوییم، Agent Engine را که با رابط اتصال سرویس خصوصی با خروجی اینترنت از طریق یک پروکسی صریح انجام می‌شود، با موفقیت پیکربندی و تأیید کردید.

شما زیرساخت مصرف کننده را ایجاد کردید، و یک پیوست شبکه اضافه کردید که به تولید کننده اجازه می داد یک VM چندنیک برای ایجاد پل ارتباطی بین مصرف کننده و تولید کننده ایجاد کند. شما یاد گرفتید که چگونه یک پروکسی صریح و همتاسازی DNS ایجاد کنید که امکان اتصال به اینترنت را فراهم کند.

Cosmopup فکر می کند آموزش ها عالی هستند!!

c911c127bffdee57.jpeg

بعدش چی؟

ادامه مطلب و ویدیوها

اسناد مرجع