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
شما یک پیوست شبکه psc را در VPC مصرفکننده ایجاد میکنید که از همتاسازی DNS برای حلوفصل شبکه مصرفکننده پروکسی-vm در پروژه مستاجر میزبان Agent Engine استفاده میکند که منجر به موارد استفاده زیر میشود:
استقرار Agent Engine و پیکربندی یک VM پراکسی برای عمل به عنوان یک پروکسی صریح، به آن اجازه می دهد تا به یک URL عمومی https://api.frankfurter.app برسد.
چیزی که یاد خواهید گرفت
- نحوه ایجاد پیوست شبکه
- چگونه یک تولید کننده می تواند از پیوست شبکه برای ایجاد یک رابط PSC استفاده کند
- نحوه برقراری ارتباط از تولید کننده با مصرف کننده با استفاده از DNS Peering
- نحوه استقرار و استفاده از پروکسی vm برای خروج از اینترنت
آنچه شما نیاز دارید
پروژه Google Cloud
مجوزهای IAM
- مدیر شبکه محاسبه (roles/compute.networkAdmin)
- Compute Instance Admin (roles/compute.instanceAdmin)
- مدیریت امنیت محاسبه (roles/compute.securityAdmin)
- مدیر DNS (roles/dns.admin)
- کاربر تونل امن با IAP (roles/iap.tunnelResourceAccessor)
- مدیر ورود به سیستم (roles/logging.admin)
- مدیر نوت بوک (roles/notebooks.admin)
- Project IAM Admin (roles/resourcemanager.projectIamAdmin)
- سرپرست حساب سرویس (roles/iam.serviceAccountAdmin)
- سرپرست استفاده از سرویس (roles/serviceusage.serviceUsageAdmin)
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
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))
مثالی از اجرای موفق:
پرس و جو از عامل مستقر شده: برای آزمایش عملکرد آن، یک درخواست به 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))
مثالی از اجرای موفق:
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 ختم می شود)
فیلد برجسته نشان دهنده آدرس IP مورد استفاده Agent Engine از پیوست شبکه PSC است.
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"
دوره زمانی را انتخاب کنید، سپس Query را اجرا کنید
ورودی گزارشی را که IP عمومی (مقصد) (104.26.1.198) api.frankfurter.app و آدرس IP منبع و نام پروکسی-vm را که استفاده از پراکسی صریح برای خروج از اینترنت را تأیید می کند، گسترش دهید.
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 فکر می کند آموزش ها عالی هستند!!