خروج Agent Gateway از Agent Runtime به شبکه VPC

۱. مقدمه

این Codelab به بررسی مدیریت خروجی Agent Gateway برای عامل‌های هوش مصنوعی که از طریق یک شبکه خصوصی VPC به نقاط انتهایی راه دور دسترسی دارند، می‌پردازد. Agent Gateway که در حالت خروجی ( عامل به هر جایی ) عمل می‌کند، از اتصال خصوصی به یک شبکه VPC با استفاده از رابط‌های Private Service Connect (PSC) پشتیبانی می‌کند. در این سناریو، Agent Runtime با استفاده از یک نقطه انتهایی Private Service Connect (PSC) برای APIهای گوگل در شبکه VPC، از Agent Gateway برای دسترسی به یک سرور HTTP MCP قابل پخش از راه دور که در Cloud Run میزبانی می‌شود، استفاده می‌کند.

برنامه‌های هوش مصنوعی، از چت‌بات‌های مستقل گرفته تا سیستم‌های خودگردان با گردش‌های کاری چندعاملی، می‌توانند به صورت پویا ابزارهای خارجی را فراخوانی کنند. فراهم کردن دسترسی کنترل‌شده برای عامل‌ها جهت پرس‌وجو از پایگاه‌های داده، دریافت محتوای وب و اجرای اقدامات، برای عامل‌های ایمن و کارآمد ضروری است. با این حال، در محیط‌های سازمانی، ایمن‌سازی اجرای ابزار عامل یک چالش است. اگر یک عامل دسترسی مستقیم به شبکه داشته باشد، حملات تزریق سریع یا توهمات مدل می‌تواند باعث شود عامل داده‌های حساس را استخراج کند یا دستورات مخرب را اجرا کند.

برای مدیریت عامل‌های خودمختار در مقیاس بزرگ، Agent Gateway یک نقطه اجرای متمرکز و بدون اعتماد (zero-trust) را فراهم می‌کند که مستقیماً در معماری Agent Platform ادغام شده است. Agent Gateway به جای تکیه بر پیاده‌سازی‌های سفارشی منحصر به فرد برای هر برنامه یا کد عامل، مسیریابی شبکه، مدیریت عامل و امنیت زمان اجرا را در سطح پلتفرم اعمال می‌کند.

وقتی Agent Gateway در حالت خروجی ( agent-to-anywhere ) عمل می‌کند، تمام درخواست‌های خروجی از Agentهایی که برای استفاده از Gateway پیکربندی شده‌اند را پروکسی می‌کند. هر درخواست بار کاری Agent با استفاده از هویت منحصر به فرد Agent احراز هویت شده و با استفاده از سیاست‌های Identity-Aware Proxy (IAP) مجاز می‌شود. فراخوانی‌های ابزار MCP به صورت پویا رمزگشایی و برای اجرای سیاست‌ها بررسی می‌شوند. مدیران امنیتی می‌توانند مجوزهای دقیق را به صورت مرکزی اعمال کنند تا اطمینان حاصل شود که Agentها فقط می‌توانند نقاط پایانی و روش‌های تأیید شده را فراخوانی کنند.

آنچه می‌سازید

  • دروازه عامل در حالت خروج ( عامل به هر جایی )
  • افزونه‌ی مجوز پروکسی آگاه از هویت (IAP)
  • عامل ADK Runtime با هویت عامل
  • سرور HTTP MCP قابل پخش در Cloud Run
  • رجیستری نمایندگان با API گوگل و نقاط پایانی MCP سفارشی
  • سیاست‌های مجوزدهی با کنترل دسترسی IAM
  • منابع شبکه VPC، منطقه Cloud DNS و نقطه پایانی PSC برای API های Google
  • اتصال شبکه PSC برای خروجی Agent Gateway
  • قوانین سیاست فایروال نسل بعدی ابر (NGFW)

شکل1

شکل 1. معماری Codelab

آنچه یاد می‌گیرید

  • نحوه استقرار Agent Gateway در یک توالی پیکربندی ساختاریافته
  • نحوه پیکربندی Agent Gateway با اتصال شبکه خصوصی VPC
  • چگونه سیاست‌های مجوزدهی را از حالت آزمایشی به حالت اجباری منتقل کنیم؟
  • نحوه ثبت نقاط پایانی API گوگل و سرورهای MCP در رجیستری نمایندگان
  • نحوه ممیزی لاگ‌های Agent Gateway برای اعتبارسنجی مدیریت خروجی
  • نحوه اعتبارسنجی ترافیک خروجی Agent Gateway با استفاده از لاگ‌های Cloud NGFW

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

  • یک پروژه گوگل کلود با قابلیت پرداخت صورتحساب
  • مجوزهای IAM برای ارائه خدمات شبکه، مجموعه داده‌های BigQuery و منابع پلتفرم Agent
  • یک پوسته سازگار با POSIX ( bash یا zsh ) با رابط خط فرمان گوگل کلود (اجزای gcloud و bq ) نصب شده
  • ابزارهای خط فرمان: git ، curl ، jq (پردازشگر JSON)، پایتون ۳ و uv (مدیر بسته پایتون)

۲. مفاهیم

توالی استقرار

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

این Codelab از توالی استقرار زیر استفاده می‌کند:

  1. شروع در حالت DRY_RUN : اطمینان حاصل کنید که درخواست‌های عامل با موفقیت به دروازه می‌رسند و عبور می‌کنند (حالت فقط حسابرسی).
  2. ثبت تمام سرویس‌ها: تمام اجزای عامل را در رجیستری عامل ثبت کنید و دسترسی به ابزار عامل را تأیید کنید. از Cloud Logging و داشبورد مشاهده‌پذیری دروازه عامل برای مشاهده پرس‌وجوها در رجیستری عامل استفاده کنید.
  3. ایجاد سیاست‌های مجوزدهی: سیاست‌های مجوزدهی را ایجاد و اعمال کنید تا ترافیک خروجی از Agentها به سرورهای MCP و Endpointها مجاز باشد.
  4. به حالت ENFORCED بروید: سیاست گسترش مجوز را به‌روزرسانی کنید تا سیاست‌ها اعمال شوند و ترافیک خروجی غیرمجاز مسدود شود.

شکل ۲

شکل ۲. توالی استقرار

توپولوژی مسیریابی خروجی

خروجی Agent Gateway ( agent-to-anywhere ) به عنوان یک پروکسی خروجی متمرکز و بدون اعتماد برای بارهای کاری agentic عمل می‌کند. هنگامی که یک agent درخواستی به یک ابزار یا API خارجی ارسال می‌کند، درخواست خروجی توسط Agent Gateway رهگیری شده و قبل از مسیریابی به مقصد، در برابر سیاست‌های حاکمیتی ارزیابی می‌شود. در معماری پلتفرم Google Cloud Agent، Agent Gateway اتصال سطح داده را برای موارد زیر فراهم می‌کند:

  • شبکه‌های خصوصی (VPC): ترافیک خروجی که APIهای داخلی سازمان، میکروسرویس‌ها، پایگاه‌های داده میزبانی‌شده در VPCهای خصوصی و شبکه‌های داخلی یا بین ابری قابل دسترسی از طریق اتصال ترکیبی را هدف قرار می‌دهد.
  • شبکه‌های خارجی (اینترنت): ترافیک خروجی که سرویس‌های وب شخص ثالث، APIهای SaaS یا نقاط پایانی عمومی را هدف قرار می‌دهد.
  • سرویس‌های هوش مصنوعی و پلتفرم عامل: هدف‌گیری ترافیک خروجی، APIهای مدیریت‌شده‌ی Google Cloud، مدل‌های پایه، نقاط پایانی Google MCP (مانند BigQuery) و سرویس‌های مدیریت پلتفرم (ثبت عامل و سیاست‌های IAP).

شکل ۳

شکل ۳. توپولوژی مسیریابی خروجی دروازه عامل

تمرکز این Codelab بر ترافیک خروجی از یک عامل سفارشی در Agent Runtime است که یک نقطه پایانی PSC برای Google APIs مستقر در یک شبکه VPC را هدف قرار می‌دهد. این معماری با استفاده از پیوست شبکه PSC برای خروجی Agent Gateway، دسترسی خصوصی به سرور MCP میزبانی شده در Cloud Run را امکان‌پذیر می‌کند.

اتصال VPC

خروجی Agent Gateway ( agent-to-anywhere ) می‌تواند با مشخص کردن networkConfig: egress: networkAttachment: [URI] در فایل پیکربندی YAML پیاده‌سازی، به یک شبکه VPC متصل شود . این تنظیم، قوانین مسیریابی را در Agent Gateway پیکربندی می‌کند تا ترافیکی را که به آدرس‌های IP خصوصی از طریق پیوست شبکه PSC به شبکه VPC منتقل می‌شود، ارسال کند.

شکل ۴

شکل ۴. اتصال Agent Gateway VPC

Agent Gateway قادر است با استفاده از Cloud DNS peering به یک پروژه هدف مشخص و شبکه VPC، نام‌های میزبان DNS خصوصی را حل کند. هر منطقه خصوصی که در پیکربندی dnsPeeringConfig: domains: [NAME] فهرست شده باشد، از رکوردهای Cloud DNS در پروژه هدف استفاده خواهد کرد. هر پرس و جوی DNS دیگری از حل کننده عمومی پیش فرض VPC Cloud DNS استفاده خواهد کرد.

این بخش مفاهیم را به پایان می‌رساند... و در ادامه به بخش تنظیمات می‌پردازیم.

۳. راه‌اندازی

نقش‌های مورد نیاز IAM

برای ایجاد منابع در این Codelab، نقش‌های زیر مورد نیاز است:

دسته بندی

نقش IAM مورد نیاز (شناسه)

توضیحات

مدیریت API

roles/serviceusage.serviceUsageAdmin

فعال کردن سرویس‌های Google Cloud API

شبکه و درگاه

roles/networkservices.admin

دروازه عامل تأمین

افزونه‌های سرویس

roles/serviceextensions.admin

پیکربندی افزونه‌های مسیریابی

امنیت شبکه

roles/networksecurity.admin

استقرار سیاست‌های مجوزدهی

ثبت نماینده

roles/agentregistry.admin

میزبان‌های مجاز کاتالوگ

هوش مصنوعی و عامل‌های Vertex

roles/aiplatform.admin

بارهای کاری Agent Runtime را مستقر کنید

سیاست‌های خروج

roles/iap.admin

اعمال سیاست‌های roles/iap.egressor

فضای ذخیره‌سازی ابری

roles/storage.admin

مدیریت سطل‌های مرحله‌بندی استقرار

گزارش‌ها و حسابرسی

roles/logging.viewer

بررسی ردپاها و گزارش‌های حسابرسی

توسعه‌دهنده‌ی کلود ران

roles/run.developer

سرویس‌های Cloud Run را مستقر کنید

خواننده رجیستری مصنوعات

roles/artifactregistry.reader

تصاویر کانتینر را بکشید

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

roles/compute.networkAdmin

مدیریت منابع شبکه VPC

مدیر DNS

roles/dns.admin

مدیریت مناطق و رکوردهای Cloud DNS

روش دیگر، استفاده از یک نقش اساسی گسترده مانند roles/admin یا نقش قدیمی roles/owner .

به پروژه خود دسترسی پیدا کنید

این Codelab از یک پروژه Google Cloud واحد استفاده می‌کند. مراحل پیکربندی از gcloud CLI و دستورات پوسته لینوکس استفاده می‌کنند.

با دسترسی به خط فرمان پروژه Google Cloud خود شروع کنید:

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

gcloud config set project SET_YOUR_PROJECT_ID_HERE

احراز هویت جلسه

# login to gcloud cli
gcloud auth login
# login for gcloud api
gcloud auth application-default login

تنظیم متغیرهای محیطی پوسته

# set custom var for slug (eg, "foo") and region preference
export SLUG="foo"
export REGION="us-central1"
export MREGION="us"
echo ${SLUG}
echo ${REGION}
echo ${MREGION}
# create project vars (automatic)
export PROJ_ID=$(gcloud config list --format="value(core.project)")
export PROJ_NO=$(gcloud projects describe ${PROJ_ID} --format="value(projectNumber)")
export ORG_ID=$(gcloud projects get-ancestors ${PROJ_ID} --format="value(id)" | tail -n 1)
export USER_IDENTITY=$(gcloud config get-value account)
echo ${PROJ_ID}
echo ${PROJ_NO}
echo ${ORG_ID}
echo ${USER_IDENTITY}
# create resource vars (automatic)
export AGW_NAME="agw-${SLUG}-${REGION}-ata"
export AGW_URI="projects/${PROJ_ID}/locations/${REGION}/agentGateways/${AGW_NAME}"
export RE_AGENT_NAME="agent-weather"
export RE_AGENT_ID_SET="principalSet://agents.global.org-${ORG_ID}.system.id.goog/attribute.platformContainer/aiplatform/projects/${PROJ_NO}"
export STAGING_BUCKET="agent-staging-${PROJ_NO}"
export MCP_NAME="mcp-weather"
export MCP_DISPLAY_NAME="${MCP_NAME}-${PROJ_NO}.${REGION}.run.app"
export MCP_URL="https://${MCP_DISPLAY_NAME}/mcp"
echo ${AGW_NAME}
echo ${AGW_URI}
echo ${RE_AGENT_NAME}
echo ${RE_AGENT_ID_SET}
echo ${STAGING_BUCKET}
echo ${MCP_NAME}
echo ${MCP_DISPLAY_NAME}
echo ${MCP_URL}
# create local dir for config files
mkdir -p cfg

اگر نصب خودمدیریت‌شده‌ی Google Cloud SDK (یعنی خارج از Cloud Shell) را اجرا می‌کنید، اجزا را به آخرین نسخه به‌روزرسانی کنید.

# update gcloud cli
gcloud components update

فعال کردن سرویس‌های API

# enable google apis (agent platform bundle, part 1)
gcloud services enable \
  agentregistry.googleapis.com \
  aiplatform.googleapis.com \
  apphub.googleapis.com \
  apptopology.googleapis.com \
  cloudapiregistry.googleapis.com \
  cloudtrace.googleapis.com \
  compute.googleapis.com \
  dataform.googleapis.com \
  iam.googleapis.com \
  iamconnectors.googleapis.com \
  iap.googleapis.com \
  logging.googleapis.com \
  modelarmor.googleapis.com \
  monitoring.googleapis.com \
  networksecurity.googleapis.com \
  networkservices.googleapis.com \
  notebooks.googleapis.com \
  observability.googleapis.com
# enable google apis (agent platform bundle, part 2)
gcloud services enable \
  securitycenter.googleapis.com \
  saasservicemgmt.googleapis.com \
  storage.googleapis.com \
  telemetry.googleapis.com \
  texttospeech.googleapis.com
# enable google apis (all the rest)
gcloud services enable \
  run.googleapis.com \
  artifactregistry.googleapis.com \
  cloudbuild.googleapis.com \
  dns.googleapis.com

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

۴. شبکه

شبکه VPC با استفاده از حالت سفارشی برای ایجاد زیرشبکه‌های منظم که از اتصال شبکه PSC برای خروجی مستقیم VPC از Agent Gateway و Cloud Run پشتیبانی می‌کنند، مستقر می‌شود.

نقطه پایانی PSC برای APIهای گوگل با استفاده از یک آدرس IPv4 داخلی جهانی /32 برای پشتیبانی از دسترسی داخلی خصوصی به Cloud Run مستقر شده است. این آدرس IP از هیچ زیرشبکه منطقه‌ای اختصاص داده نشده است.

ایجاد شبکه‌ها

یک شبکه جهانی VPC ایجاد کنید.

# create vpc network
gcloud compute networks create vnet-${SLUG} --subnet-mode=custom

زیرشبکه‌هایی برای اتصال شبکه PSC مربوط به Agent Gateway و خروجی مستقیم VPC مربوط به Cloud Run ایجاد کنید.

# create subnet for agent gateway psc na
gcloud compute networks subnets create subnet-${REGION}-agw \
  --network=vnet-${SLUG} \
  --range=192.168.10.0/28 \
  --region=${REGION} \
  --enable-private-ip-google-access

# create subnet for cloud run dvpc egress
gcloud compute networks subnets create subnet-${REGION}-crun \
  --network=vnet-${SLUG} \
  --range=10.10.10.0/24 \
  --region=${REGION} \
  --enable-private-ip-google-access

ایجاد قوانین فایروال

یک سیاست و قانون فایروال ایجاد کنید تا به همه ترافیک خروجی با قابلیت ثبت وقایع اجازه ورود دهد. این برای نظارت بر ترافیک خروجی از Agent Gateway به شبکه VPC استفاده خواهد شد.

# create fw policy
gcloud compute network-firewall-policies create fw-policy-${SLUG} --global
# create fw policy rule
gcloud compute network-firewall-policies rules create 1001 \
  --description="allow all out and log" \
  --firewall-policy=fw-policy-${SLUG} \
  --global-firewall-policy \
  --action=allow \
  --direction=EGRESS \
  --layer4-configs=all \
  --dest-ip-ranges=0.0.0.0/0 \
  --enable-logging
# associate fw policy to vpc network
gcloud compute network-firewall-policies associations create \
  --name=fw-policy-bind-${SLUG} \
  --firewall-policy=fw-policy-${SLUG} \
  --network=vnet-${SLUG} \
  --global-firewall-policy

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

یک پیوست شبکه PSC ایجاد کنید که طوری پیکربندی شده باشد که به طور خودکار اتصالات تولیدکننده جدید را بپذیرد .

# create psc network attachment
gcloud compute network-attachments create psc-na-${REGION}-agw \
  --region=${REGION} \
  --subnets=subnet-${REGION}-agw \
  --connection-preference=ACCEPT_AUTOMATIC

تأیید اتصال شبکه PSC

# show psc network attachment details
gcloud compute network-attachments describe psc-na-${REGION}-agw --region=${REGION}
# fetch psc na uri
export PSC_NA_URI=$(gcloud compute network-attachments describe psc-na-${REGION}-agw \
  --region=${REGION} \
  --format="value(selfLink.scope(v1))")
echo ${PSC_NA_URI}

ایجاد نقطه پایانی PSC

یک آدرس IP رزرو شده برای نقطه پایانی PSC جهانی ایجاد کنید. آدرسی که در اینجا استفاده می‌شود نمی‌تواند از یک زیرشبکه موجود باشد یا با آن همپوشانی داشته باشد.

# set env var for psc ep ip address
export PSC_EP_IP="240.0.0.10"
echo ${PSC_EP_IP}
# reserve internal global ipv4 address
gcloud compute addresses create ip-psc2gapis \
  --global \
  --purpose=PRIVATE_SERVICE_CONNECT \
  --addresses=${PSC_EP_IP} \
  --network=vnet-${SLUG}

با استفاده از بسته all-apis که شامل Cloud Run ( run.app ) است، یک نقطه پایانی PSC برای API های گوگل ایجاد کنید.

# create psc endpoint for google apis
gcloud compute forwarding-rules create psc2gapis \
  --global \
  --network=vnet-${SLUG} \
  --address=ip-psc2gapis \
  --target-google-apis-bundle=all-apis

تأیید نقطه پایانی PSC

# show psc endpoint details
gcloud compute forwarding-rules describe psc2gapis --global

ایجاد منطقه و رکوردهای DNS

یک منطقه خصوصی مدیریت شده توسط Cloud DNS برای دامنه run.app ایجاد کنید.

# create private dns zone
gcloud dns managed-zones create priv-zone-run \
  --description="private zone for cloud run" \
  --dns-name="run.app." \
  --visibility=private \
  --networks=vnet-${SLUG}

یک رکورد DNS A با پسوند *.run.app. ایجاد کنید که به آدرس IP نقطه پایانی PSC اشاره کند.

# create dns record
gcloud dns record-sets create *.run.app \
  --zone=priv-zone-run \
  --type=A \
  --ttl=300 \
  --rrdatas=${PSC_EP_IP}

برای فعال کردن ثبت وقایع DNS، یک سیاست Cloud DNS ایجاد کنید.

# create dns policy (logging)
gcloud dns policies create dns-policy-${SLUG} \
  --description="dns logging for vnet-${SLUG}" \
  --networks=vnet-${SLUG} \
  --enable-logging

ایجاد NAT ابری

یک روتر ابری و Cloud NAT ایجاد کنید تا از خروجی مستقیم VPC از Cloud Run برای سرور MCP پشتیبانی کند تا از طریق شبکه VPC به داده‌های آب و هوای خارجی دسترسی پیدا کند.

# create router for nat
gcloud compute routers create cr-nat-${SLUG}-${REGION} \
  --network=vnet-${SLUG} \
  --asn=16550 \
  --region=${REGION}
# create nat gateway
gcloud compute routers nats create nat-${SLUG}-${REGION} \
  --router=cr-nat-${SLUG}-${REGION} \
  --region=${REGION} \
  --auto-allocate-nat-external-ips \
  --nat-all-subnet-ip-ranges

این بخش شبکه را به پایان می‌رساند... و در ادامه به بخش دروازه (Gateway) می‌پردازیم.

۵. دروازه

قبل از اعمال کنترل‌های دسترسی، Agent Gateway را مستقر کرده و افزونه‌ی مجوز را در حالت DRY_RUN پیکربندی کنید. این کار باعث می‌شود فراخوانی‌های ابزار خروجی با موفقیت انجام شوند و در عین حال نتایج ارزیابی برای اهداف حسابرسی ثبت شوند.

در اینجا Agent Gateway از یک رجیستری منطقه‌ای برای پشتیبانی از منابع منطقه‌ای Agent Runtime استفاده می‌کند و فیلدهای networkConfig را برای اتصال شبکه PSC شبکه VPC و پیکربندی DNS peering مشخص می‌کند.

ایجاد دروازه

# create new agent gateway config file (with network settings)
cat > cfg/${AGW_NAME}-networkConfig.yaml << EOF
name: ${AGW_NAME}
protocols:
  - MCP
googleManaged:
  governedAccessPath: AGENT_TO_ANYWHERE
registries:
  - "//agentregistry.googleapis.com/projects/${PROJ_ID}/locations/${REGION}"
networkConfig:
  egress:
    networkAttachment: ${PSC_NA_URI}
  dnsPeeringConfig:
    domains:
      - run.app.
    targetProject: ${PROJ_ID}
    targetNetwork: projects/${PROJ_ID}/global/networks/vnet-${SLUG}
EOF
# import agent gateway config file (create gateway)
gcloud network-services agent-gateways import ${AGW_NAME} \
  --source="cfg/${AGW_NAME}-networkConfig.yaml" \
  --location=${REGION}

تأیید درگاه

# show agent gateway details
gcloud network-services agent-gateways describe ${AGW_NAME} \
  --location=${REGION}
# show psc network attachment details
gcloud compute network-attachments describe psc-na-${REGION}-agw --region=${REGION}

بررسی کنید که یک نقطه پایانی اتصال پذیرفته شده وجود دارد.

connectionEndpoints:
- ipAddress: 192.168.10.2
  projectIdOrNum: '[AGW_PROJECT_NO]'
  status: ACCEPTED
  subnetwork: https://www.googleapis.com/compute/v1/projects/${PROJ_ID}/regions/${REGION}/subnetworks/subnet-${REGION}-agw

این بخش مربوط به درگاه (gateway) است... که در کنار بخش مجوز (Authorization) قرار دارد.

۶. مجوز

افزونه‌ی مجوزدهی Agent Gateway برای Identity-Aware Proxy (IAP) نوعی افزونه‌ی سرویس است که برای واگذاری تصمیمات مجوزدهی برای تمام ارتباطات Agent Platform استفاده می‌شود.

  1. جریان واگذاری: وقتی یک عامل تلاش می‌کند تا یک نقطه پایانی خارجی یا سرور MCP را فراخوانی کند، درخواست را به Agent Gateway هدایت می‌کند. به جای ارزیابی دسترسی به صورت محلی، Gateway از افزونه مجوز برای ارسال یک فراخوان به سرویس ارزیابی IAP استفاده می‌کند. IAP هویت عامل ( مبتنی بر SPIFFE ) را در برابر سیاست IAM منبع هدف در رجیستری عامل ارزیابی می‌کند. IAP تصمیم ALLOW یا DENY را به Gateway برمی‌گرداند، که یا ترافیک را به جلو هدایت می‌کند یا آن را با کد وضعیت HTTP 403 Forbidden مسدود می‌کند.
  2. حالت‌های اجرا: در حالت DRY_RUN ، IAP درخواست‌ها را ارزیابی می‌کند و بدون مسدود کردن ترافیک، تصمیمات ثبت وقایع را در Cloud Logging ثبت می‌کند. در حالت ENFORCE ، هرگونه درخواست از یک عامل غیرمجاز یا به یک هدف ثبت نشده بلافاصله مسدود می‌شود.
  3. لایه اتصال: افزونه سرویس با استفاده از یک سیاست مجوز پیکربندی شده با پروفایل REQUEST_AUTHZ به Agent Gateway متصل می‌شود.

تمدید مجوز

یک افزونه‌ی مجوز، سرویس ارائه‌دهنده‌ی امنیت را با تنظیمات اتصال و سایر پارامترهایی که نحوه‌ی عملکرد سرویس و ادغام آن با Agent Gateway را تعریف می‌کنند، مشخص می‌کند.

ایجاد افزونه authz

# create authz extension config file (dry run mode)
cat > cfg/${AGW_NAME}-svc-ext-authz-iap-dryrun.yaml << EOF
name: ${AGW_NAME}-svc-ext-authz-iap-dryrun
service: iap.googleapis.com
failOpen: true
timeout: 1s
metadata:
  iamEnforcementMode: "DRY_RUN"
  iapPolicyVersion: "V1"
EOF

افزونه authz را وارد کنید

# import authz extension file (create extension)
gcloud service-extensions authz-extensions import ${AGW_NAME}-svc-ext-authz-iap-dryrun \
  --source=cfg/${AGW_NAME}-svc-ext-authz-iap-dryrun.yaml \
  --location=${REGION}

تأیید افزونه authz

# show authz extension details
gcloud service-extensions authz-extensions describe ${AGW_NAME}-svc-ext-authz-iap-dryrun \
  --location=${REGION}

سیاست مجوز

یک سیاست مجوزدهی، ارائه‌دهنده امنیت (IAP) را به منبع دروازه هدف متصل می‌کند و نمایه رهگیری ( REQUEST_AUTHZ ) را مشخص می‌کند.

ایجاد سیاست احراز هویت

# create authz policy config file (attach dry-run authz extension)
cat > cfg/${AGW_NAME}-authz-policy-profile-iap.yaml << EOF
name: ${AGW_NAME}-authz-policy-profile-iap
target:
  resources:
    - "projects/${PROJ_ID}/locations/${REGION}/agentGateways/${AGW_NAME}"
policyProfile: REQUEST_AUTHZ
action: CUSTOM
customProvider:
  authzExtension:
    resources:
      - "projects/${PROJ_ID}/locations/${REGION}/authzExtensions/${AGW_NAME}-svc-ext-authz-iap-dryrun"
EOF

سیاست اتصال authz

# import authz policy config file (enable authz policy)
gcloud beta network-security authz-policies import ${AGW_NAME}-authz-policy-profile-iap \
  --source=cfg/${AGW_NAME}-authz-policy-profile-iap.yaml \
  --location=${REGION}

سیاست authz را تأیید کنید

# show authz policy details
gcloud beta network-security authz-policies describe ${AGW_NAME}-authz-policy-profile-iap \
  --location=${REGION}

این بخش مجوزدهی را که در کنار بخش Codebase قرار دارد، به پایان می‌رساند.

۷. کدبیس

کد ثبت عامل، سرور MCP و نقطه پایانی مورد استفاده برای این Codelab در یک مخزن راه دور Google Cloud GitHub نگهداری می‌شوند. مراحل زیر مخزن را به صورت محلی کلون می‌کند، فایل‌های لازم را در ساختار دایرکتوری کاری فعلی کپی می‌کند و سپس فایل‌های موقت را پاکسازی می‌کند.

یک مخزن ذخیره‌سازی برای Agent Runtime ایجاد می‌شود تا کد برنامه عامل بسته‌بندی‌شده و مصنوعات وابستگی آن را آپلود، ساخت و مستقر کند.

مصنوعات از راه دور را دریافت کنید

# clone remote repository to temp local dir
git clone https://github.com/GoogleCloudPlatform/cloud-networking-solutions.git ./temp_agw_cuj_arun_egress_vpc
# copy agent runtime and endpoint definitions to working project dir
cp -r temp_agw_cuj_arun_egress_vpc/codelabs/agw-cuj-arun-egress-vpc/agent-weather ./agent-weather
cp -r temp_agw_cuj_arun_egress_vpc/codelabs/agw-cuj-arun-egress-vpc/mcp-weather ./mcp-weather
# remove temporary directory
rm -rf temp_agw_cuj_arun_egress_vpc

ایجاد سطل مرحله بندی

# create storage bucket for agent deployment artifacts
gcloud storage buckets create gs://${STAGING_BUCKET} --location=${REGION}
# verify staging bucket url
gcloud storage buckets list --format="value(storage_url)"

این بخش کدبیس را به پایان می‌رساند... و در ادامه به بخش رجیستری می‌پردازیم.

۸. رجیستری

رجیستری عامل، فهرستی متمرکز از تمام عامل‌ها، سرورهای MCP و نقاط پایانی (API) در اکوسیستم هوش مصنوعی است. همچنین، کاتالوگی است که می‌تواند برای فهرست کردن، جستجو و کشف سایر ابزارها و سرویس‌های ثبت‌شده برای استفاده توسط برنامه‌های هوش مصنوعی استفاده شود. دروازه عامل از مدل داده‌های رجیستری به عنوان چارچوب مدیریتی برای اجرای کنترل دسترسی خروجی استفاده می‌کند. اعطای نقش IAM برای عامل‌های اصلی فراخوانی، در برابر سیاستی که به منبع رجیستری متصل است، بررسی می‌شود.

برای بوت‌استرپ کردن محیط و پشتیبانی از عامل با استفاده از APIها و سرویس‌های مختلف گوگل ، یک سرویس نقطه پایانی رجیستری واحد ایجاد کنید که رابط‌های API اصلی مورد نیاز برای این آزمایشگاه را در خود جای دهد. این کار مدیریت سیاست‌های مدیریتی را برای مجموعه ابزارهای رایجی که اکثر عامل‌ها استفاده می‌کنند، آسان‌تر می‌کند.

نقاط پایانی را ثبت کنید

# create endpoint service (with multiple entries)
gcloud agent-registry services create core-gapi-services \
  --location=${REGION} \
  --display-name="gapi.core.services" \
  --description="core apis and services" \
  --endpoint-spec-type=no-spec \
  --interfaces=protocolBinding=JSONRPC,url=https://telemetry.googleapis.com \
  --interfaces=protocolBinding=JSONRPC,url=https://${REGION}-aiplatform.googleapis.com \
  --interfaces=protocolBinding=JSONRPC,url=https://cloudresourcemanager.googleapis.com \
  --interfaces=protocolBinding=JSONRPC,url=https://iamcredentials.googleapis.com

تأیید ثبت نقطه پایانی

# list registry regional endpoints
gcloud agent-registry endpoints list --location=${REGION} \
  --flatten="interfaces[]" \
  --format="table(displayName, name.basename():label=ENDPOINT_ID, interfaces.url:label=URL)"

این بخش رجیستری را به پایان می‌رساند... و در ادامه به بخش سرور MCP می‌پردازیم.

۹. سرور MCP

اعطای مجوزهای IAM برای استقرار

برای پشتیبانی از استقرار سرویس‌های Cloud Run از کد منبع، به حساب کاربری سرویس محاسباتی پیش‌فرض مجوز اعطا کنید.

# grant cloud run builder role to default compute sa
gcloud projects add-iam-policy-binding ${PROJ_ID} \
  --member="serviceAccount:${PROJ_NO}-compute@developer.gserviceaccount.com" \
  --role="roles/run.builder"

مجوزهای IAM را تأیید کنید

# show iam policy on project for default compute sa
gcloud projects get-iam-policy ${PROJ_ID} \
  --flatten="bindings[].members" \
  --filter="bindings.members=serviceAccount:${PROJ_NO}-compute@developer.gserviceaccount.com" \
  --format="table(bindings.role:label=ROLE, bindings.members:label=PRINCIPAL_IDENTITY)"

سرور MCP را مستقر کنید

# deploy cloud run service
gcloud -q run deploy ${MCP_NAME} \
  --source=mcp-weather/server \
  --region=${REGION} \
  --no-allow-unauthenticated \
  --min-instances=1 \
  --network=vnet-${SLUG} \
  --subnet=subnet-${REGION}-crun \
  --vpc-egress=all-traffic \
  --startup-probe=httpGet.path=/warmup

مجوزهای IAM را برای ورود اعطا کنید

سیاست اتصال برای دسترسی کاربر

به حساب کاربری (self) مجوزهای لازم برای فراخوانی سرور MCP میزبانی شده توسط Cloud Run را اعطا کنید. این مجوز برای اجرای اسکریپت تولید toolspec مورد نیاز است.

# grant run invoker role to user account on cloud run service level
gcloud run services add-iam-policy-binding ${MCP_NAME} \
  --region=${REGION} \
  --member="user:${USER_IDENTITY}" \
  --role="roles/run.invoker"

مجوزهای IAM را تأیید کنید

# show iam policy on cloud run service for invoker role
gcloud run services get-iam-policy ${MCP_NAME} \
  --region=${REGION} \
  --flatten="bindings[].members" \
  --filter="bindings.role=roles/run.invoker" \
  --format="table(bindings.members:label=PRINCIPAL_IDENTITY, bindings.role:label=ROLE)"

ایجاد SA سفارشی برای فراخوانی MCP

یک حساب سرویس سفارشی برای فراخوانی سرور MCP میزبانی شده توسط Cloud Run ایجاد کنید. این حساب سرویس توسط عامل برای دریافت یک توکن OIDC ID معتبر امضا شده توسط گوگل برای دسترسی به Cloud Run استفاده خواهد شد.

# create custom sa for mcp server invocation
gcloud iam service-accounts create sa-${MCP_NAME}-invoker \
  --display-name="custom sa to invoke ${MCP_NAME}"
# set env var for service account identity
export MCP_INVOKER_SA="sa-${MCP_NAME}-invoker@${PROJ_ID}.iam.gserviceaccount.com"
echo ${MCP_INVOKER_SA}

سیاست اتصال برای حساب سرویس

# grant run invoker role to custom sa on cloud run service level
gcloud run services add-iam-policy-binding ${MCP_NAME} \
  --role="roles/run.invoker" \
  --member="serviceAccount:${MCP_INVOKER_SA}" \
  --region=${REGION}

مجوزهای IAM را تأیید کنید

# show iam policy on cloud run service for invoker role
gcloud run services get-iam-policy ${MCP_NAME} \
  --region=${REGION} \
  --flatten="bindings[].members" \
  --filter="bindings.role=roles/run.invoker" \
  --format="table(bindings.members:label=PRINCIPAL_IDENTITY, bindings.role:label=ROLE)"

اعطای مجوزهای IAM برای احراز هویت

نقش‌های جعل هویت حساب سرویس را به حساب سرویس محاسبه پیش‌فرض (Default Compute Service Account ) اعطا کنید. این به عامل (agent) که تحت اعتبارنامه‌های پیش‌فرض برنامه (ADC) اجرا می‌شود، اجازه می‌دهد تا توکن‌های شناسه OIDC امضا شده توسط گوگل را از طرف حساب سرویس فراخوانی سفارشی برای تأیید اعتبار تماس‌ها به Cloud Run ضرب کند.

سیاست اتصال برای احراز هویت

# grant oidc token creator role to default compute service account
gcloud iam service-accounts add-iam-policy-binding ${MCP_INVOKER_SA} \
  --role="roles/iam.serviceAccountOpenIdTokenCreator" \
  --member="serviceAccount:${PROJ_NO}-compute@developer.gserviceaccount.com"

# grant service account token creator role to default compute service account
gcloud iam service-accounts add-iam-policy-binding ${MCP_INVOKER_SA} \
  --role="roles/iam.serviceAccountTokenCreator" \
  --member="serviceAccount:${PROJ_NO}-compute@developer.gserviceaccount.com"

مجوزهای IAM را تأیید کنید

# show iam policy for the custom service account
gcloud iam service-accounts get-iam-policy ${MCP_INVOKER_SA} \
  --flatten="bindings[].members" \
  --format="table(bindings.role:label=ROLE, bindings.members:label=PRINCIPAL_IDENTITY)"

ایجاد toolspec MCP

هنگام ثبت دستی یک سرور MCP، باید یک فایل مشخصات ابزار نیز ضمیمه شود. فایل toolspec.json تمام ابزارهای موجود توسط سرور MCP را فهرست می‌کند و به سایر کاربران اجازه می‌دهد پس از ثبت، آنها را کشف کنند.

اسکریپت test_mcp.py که در کدبیس mcp-weather/ قرار دارد، با اتصال به سرور MCP هدف (از طریق SSE یا HTTP) و فراخوانی list_tools() برای بازیابی تمام ابزارهای موجود در معرض سرور، یک فایل toolspec.json تولید می‌کند.

# fetch oidc token for cloud run authentication
export OIDC_TOKEN=$(gcloud auth print-identity-token)
# generate toolspec for registry ingestion
uv --directory mcp-weather run test_mcp.py --toolspec=include --token="${OIDC_TOKEN}"

نگاهی به خروجی toolspec تولید شده، ویژگی‌های MCP را نشان می‌دهد که Agent Gateway می‌تواند برای ارزیابی و اجرای سیاست خروجی از آنها استفاده کند.

toolspec MCP را تأیید کنید

# show toolspec mcp attributes
jq '.tools[] | {name, isReadOnly, isDestructive, isIdempotent, isOpenWorld}' mcp-weather/toolspec.json

به‌روزرسانی ورود به Cloud Run

تنظیمات ورودی سرویس Cloud Run را طوری تغییر دهید که فقط درخواست‌های ورودی از شبکه VPC را بپذیرد. این کار از دسترسی عمومی مستقیم به نقطه پایانی MCP جلوگیری می‌کند و فقط به منابع داخلی اجازه دسترسی به آن را می‌دهد. ترافیکی که به مقصد نقطه پایانی PSC برای APIهای گوگل در شبکه VPC ارسال می‌شود، ورودی داخلی در نظر گرفته شده و مجاز خواهد بود.

# update cloud run service config
gcloud run services update ${MCP_NAME} \
  --region=${REGION} \
  --ingress=internal

ورود Cloud Run را تأیید کنید

# show cloud run service details
gcloud run services describe ${MCP_NAME} --region=${REGION} | grep -iE 'ingress|egress'

سرور MCP را ثبت کنید

اکنون با در دست داشتن toolspec ، سرور MCP را در رجیستری منطقه‌ای Agent ثبت کنید.

# register mcp server
gcloud agent-registry services create ${MCP_NAME} \
  --location=${REGION} \
  --display-name="${MCP_DISPLAY_NAME}" \
  --description="mcp server for weather info" \
  --mcp-server-spec-type=tool-spec \
  --mcp-server-spec-content=mcp-weather/toolspec.json \
  --interfaces=url=${MCP_URL},protocolBinding=JSONRPC

تأیید ثبت نام MCP

# list registry regional mcp servers
gcloud agent-registry mcp-servers list --location=${REGION} --format="table(displayName, interfaces.url)"
# show mcp server registry details
gcloud agent-registry services describe ${MCP_NAME} --location=${REGION}
# fetch mcp server registry id
export MCP_REGISTRY_ID=$(gcloud agent-registry services describe ${MCP_NAME} \
  --location=${REGION} \
  --format="value(registryResource.basename())")
echo ${MCP_REGISTRY_ID}

این بخش سرور MCP را به پایان می‌رساند... و سپس بخش عامل ADK .

۱۰. مامور ADK

ایجنت ADK مربوط به agent-weather که در Agent Runtime مستقر شده است، با تنظیمات زیر در اسکریپت استقرار پیکربندی شده است تا با Agent Platform ادغام شود:

  • "identity_type": types.IdentityType.AGENT_IDENTITY برای ارائه یک هویت اصلی منحصر به فرد مبتنی بر SPIFFE برای عامل
  • "agent_gateway_config": { "agent_to_anywhere_config": {"agent_gateway": } } برای هدایت تمام ترافیک خروجی آغاز شده توسط agent به Agent Gateway جهت ارزیابی و اجرای سیاست‌ها

همچنین این عامل طوری پیکربندی شده است که با ارسال URL و حساب سرویس برای دریافت توکن OIDC ID از سرور MCP استفاده کند.

عامل را مستقر کنید

# deploy agent runtime workload
uv --directory agent-weather run python3 deploy_agent.py \
  --project=${PROJ_ID} \
  --region=${REGION} \
  --src-dir=./agent \
  --staging-bucket=${STAGING_BUCKET} \
  --display-name="${RE_AGENT_NAME}" \
  --description="agent for weather info" \
  --mcp-server-url="${MCP_URL}" \
  --mcp-invoker-sa="${MCP_INVOKER_SA}" \
  --enable-telemetry \
  --enable-agent-identity \
  --agent-gateway-egress=${AGW_URI} \
  --allow-token-sharing

تأیید استقرار

موارد حیاتی استقرار را دریافت کنید

# fetch agent runtime resource (reasoning engine) id
export RE_ENGINE_ID=$(curl -s -X GET "https://${REGION}-aiplatform.googleapis.com/v1/projects/${PROJ_ID}/locations/${REGION}/reasoningEngines" \
  -H "Authorization: Bearer $(gcloud auth application-default print-access-token)" | \
  jq -r --arg name "${RE_AGENT_NAME}" '.reasoningEngines[] | select(.displayName==$name) | .name | split("/") | last')
echo ${RE_ENGINE_ID}
# fetch agent runtime (reasoning engine) agent identity
export RE_AGENT_IDENTITY=$(gcloud agent-registry agents list \
  --location=${REGION} --filter="displayName=${RE_AGENT_NAME}" \
  --format="value(attributes.'agentregistry.googleapis.com/system/RuntimeIdentity'.principal)")
echo ${RE_AGENT_IDENTITY}
# fetch agent registry uid for agent
export RE_AGENT_REGISTRY_ID=$(gcloud agent-registry agents list \
  --location=${REGION} \
  --filter="displayName=${RE_AGENT_NAME}" \
  --format="value(uid)")
echo ${RE_AGENT_REGISTRY_ID}

تأیید ورودی رجیستری

# show agent resource registry details
gcloud agent-registry agents describe ${RE_AGENT_REGISTRY_ID} --location=${REGION}

پیکربندی دروازه را تأیید کنید

# show agent config details (gateway config)
curl -s -X GET "https://${REGION}-aiplatform.googleapis.com/v1/projects/${PROJ_ID}/locations/${REGION}/reasoningEngines/${RE_ENGINE_ID}" \
  -H "Authorization: Bearer $(gcloud auth application-default print-access-token)" \
  | jq '{displayName: .displayName, name: .name, effectiveIdentity: .spec.effectiveIdentity, agentGatewayConfig: .spec.deploymentSpec.agentGatewayConfig}'

اعطای مجوزهای IAM برای احراز هویت

وقتی یک عامل برای استفاده از هویت عامل پیکربندی می‌شود، یک توکن (با فرمت JWT-SVID) از سرویس توکن امنیتی فدرال (STS) دریافت می‌کند که توسط sts.googleapis.com (ارائه‌دهنده هویت SPIFFE) امضا شده است.

با این حال، بررسی فراخوانی‌کننده‌ی داخلی Cloud Run IAM فقط به توکن‌های استاندارد OIDC ID که توسط صادرکننده‌ی اصلی OIDC گوگل ( accounts.google.com ) امضا شده‌اند، اعتماد می‌کند و می‌تواند آنها را تأیید کند.

بنابراین، از یک حساب سرویس سفارشی برای تبادل توکن STS فدرال (JWT-SVID) که توسط هویت عامل به دست آمده است، با یک توکن استاندارد گوگل (OIDC) که با استفاده از جعل هویت حساب سرویس در زمان اجرا به دست آمده است، استفاده می‌شود.

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

سیاست اتصال برای احراز هویت (جعل هویت)

# grant service account token creator role to agent principal identity
gcloud iam service-accounts add-iam-policy-binding ${MCP_INVOKER_SA} \
  --role="roles/iam.serviceAccountTokenCreator" \
  --member="${RE_AGENT_IDENTITY}"

# grant service account openid token creator role to agent principal identity
gcloud iam service-accounts add-iam-policy-binding ${MCP_INVOKER_SA} \
  --role="roles/iam.serviceAccountOpenIdTokenCreator" \
  --member="${RE_AGENT_IDENTITY}"

مجوزهای IAM را تأیید کنید

# show iam policy for custom service account
gcloud iam service-accounts get-iam-policy ${MCP_INVOKER_SA} \
  --flatten="bindings[].members" \
  --format="table(bindings.members.sub('^.*locations/', '.../locations/'):label=PRINCIPAL_IDENTITY, bindings.role:label=ROLE)"

اعطای مجوزهای IAM برای زمان اجرا

اعطای مجوزهای IAM برای زمان اجرا، به عامل این امکان را می‌دهد که با استفاده از هویت عامل اصلی مبتنی بر SPIFFE خود، به سرویس‌های پلتفرم هوش مصنوعی و سایر APIها و سرویس‌های اصلی گوگل دسترسی پیدا کند. این سیاست‌ها با استفاده از IAM در سطح منابع اعمال می‌شوند.

پیوندهای نقش مورد نیاز برای هویت عامل را ایجاد کنید.

سیاست‌های اتصال برای دسترسی عامل

# grant ai platform user role
gcloud projects add-iam-policy-binding ${PROJ_ID} \
  --member="${RE_AGENT_IDENTITY}" \
  --role="roles/aiplatform.user"

# grant agent default access role
gcloud projects add-iam-policy-binding ${PROJ_ID} \
  --member="${RE_AGENT_IDENTITY}" \
  --role="roles/aiplatform.agentDefaultAccess"

# grant agent registry viewer role
gcloud projects add-iam-policy-binding ${PROJ_ID} \
  --member="${RE_AGENT_IDENTITY}" \
  --role="roles/agentregistry.viewer"
# grant cloud logging writer role
gcloud projects add-iam-policy-binding ${PROJ_ID} \
  --member="${RE_AGENT_IDENTITY}" \
  --role="roles/logging.logWriter"

# grant cloud monitoring writer role
gcloud projects add-iam-policy-binding ${PROJ_ID} \
  --member="${RE_AGENT_IDENTITY}" \
  --role="roles/monitoring.metricWriter"

# grant browser role for resource manager lookup
gcloud projects add-iam-policy-binding ${PROJ_ID} \
  --member="${RE_AGENT_IDENTITY}" \
  --role="roles/browser"

مجوزهای IAM را تأیید کنید

# show iam policy on project for agent identity
gcloud projects get-iam-policy ${PROJ_ID} \
  --flatten="bindings[].members" \
  --filter="bindings.members:${RE_AGENT_IDENTITY}" \
  --format="table(bindings.members.sub('^.*locations/', '.../locations/'):label=PRINCIPAL_IDENTITY, bindings.role:label=ROLE)"

این بخش مربوط به عامل ADK ... و در ادامه بخش سیاست‌ها است.

۱۱. سیاست‌ها

سیاست‌های مجوزدهی مدیریت عامل، امکان هدایت ترافیک از یک عامل هوش مصنوعی از طریق دروازه عامل و رسیدن به مقصد نهایی منبع (مثلاً یک نقطه پایانی سرور خصوصی MCP برای بازیابی داده‌ها) را فراهم می‌کنند. پس از رسیدن ترافیک به مقصد، مجوزهای منظم در سطح سرویس یا سطح برنامه، دسترسی به داده‌ها را مجاز می‌کنند.

اعطای نقش‌های IAM برای خروجی Agent Gateway، سیاست‌های دسترسی را فعال می‌کند که به هویت اصلی Agent اجازه دسترسی به منابع مقصد ثبت‌شده را از طریق Agent Gateway می‌دهد. این سیاست‌ها در سطح Agent Gateway اعمال شده و با استفاده از سیاست‌های IAM مبتنی بر Identity-Aware Proxy (IAP) اعتبارسنجی می‌شوند.

اعطای نقش‌های IAM برای خروج Agent Gateway

Agent Gateway درخواست‌های ورودی را بررسی می‌کند تا هویت عامل فراخوانی‌کننده را که دارای مجوز iap.webServiceVersions.egressViaIAP (اعطا شده توسط نقش roles/iap.egressor ) در منبع هدف است، تأیید کند.

اعطای roles/iap.egressor به هویت عامل یا مجموعه اصلی Agent Runtime روی منبع مقصد انتخاب شده، این ترافیک خروجی را مجاز می‌کند. در این آزمایشگاه کد، این نقش به عامل اصلی اعمال می‌شود که به هویت عامل خاص Agent Runtime اجازه می‌دهد.

سیاست‌های IAM همانطور که در مدل داده Agent Registry تعریف شده است، به منابع مقصد محدود می‌شوند. منبع iap_web/agentRegistry نشان دهنده یک سطح " در سطح رجیستری " در سلسله مراتب IAM است. که در آن agentRegistry به عنوان والد برای منابع فرزند برای agents ، mcpServers و endpoints عمل می‌کند. در این آزمایشگاه کد، سیاست IAM به سطوح mcpServer و endpoint محدود می‌شود که مجوز را به منابع فرزند خاص اعمال می‌کند.

پیکربندی عامل برای سیاست سرور MCP

ایجاد پالیسی برای عامل به سرور mcp

# fetch active etag on policy for mcp server
export IAP_ETAG=$(gcloud beta iap web get-iam-policy \
  --resource-type=agent-registry --region=${REGION} \
  --mcp-server=${MCP_REGISTRY_ID} --format="value(etag)")
echo ${IAP_ETAG}

نکته: etag: باید مقدار پیش‌فرض ACAB را برگرداند، زیرا هنوز هیچ سیاستی تعریف نشده است.

# create policy config file
cat > cfg/iap-policy-agent-to-mcp.json << EOF
{
  "bindings": [
    {
      "role": "roles/iap.egressor",
      "members": [
        "${RE_AGENT_IDENTITY}"
      ]
    }
  ],
  "etag": "${IAP_ETAG}"
}
EOF

سیاست اتصال برای عامل به سرور mcp

# import policy file
gcloud beta iap web set-iam-policy cfg/iap-policy-agent-to-mcp.json \
  --resource-type=agent-registry \
  --mcp-server=${MCP_REGISTRY_ID} \
  --region=${REGION}

مجوزهای IAM را تأیید کنید

# show iap iam policy on mcp server for agent
gcloud beta iap web get-iam-policy \
  --region=${REGION} \
  --resource-type=agent-registry \
  --mcp-server=${MCP_REGISTRY_ID}

این بخش سیاست‌ها را به پایان می‌رساند... که در کنار بخش حسابرسی قرار دارد.

۱۲. حسابرسی

افزونه‌ی مجوز Agent Gateway در حالت DRY_RUN فعال است. درخواست‌های خروجی مشاهده و ثبت می‌شوند اما مسدود نمی‌شوند. تجزیه و تحلیل گزارش‌ها قبل از تغییر به حالت ENFORCED تأیید می‌کند که کدام سیاست‌ها باید پیکربندی شوند تا ترافیک مورد نظر مجاز باشد.

سوالات مربوط به عامل تست

یک پنجره مرورگر را باز کنید و به رابط کاربری کنسول Google Cloud بروید و به مسیر زیر بروید:

  • پلتفرم عامل → عامل‌ها → استقرارها → agent-weather
  • برگه زمین بازی را انتخاب کنید

یا این دستور ترمینال را تکرار کنید و روی لینک کلیک کنید تا به محیط عامل بروید:

# playground
echo "https://console.cloud.google.com/agent-platform/runtimes/locations/${REGION}/agent-engines/${RE_ENGINE_ID}/playground?project=${PROJ_ID}"

ارسال چند سوال آزمایشی ....

  • What is the weather like in London?
  • How warm is it in New York?

تأیید کنید که پرس‌وجوها پاسخ‌های معتبری برمی‌گردانند.

تجزیه و تحلیل گزارش‌های حسابرسی

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

# show gateway logs for endpoints and authz status (duplicates removed)
gcloud logging read \
  "resource.type=\"networkservices.googleapis.com/Gateway\" \
  AND httpRequest.requestUrl:*" \
  --project=${PROJ_ID} \
  --limit=50 \
  --freshness=24h \
  --format="table( \
    timestamp.date(tz=LOCAL):label=TIMESTAMP, \
    httpRequest.status:label=STATUS, \
    jsonPayload.authzPolicyInfo.result:label=AUTHZ, \
    httpRequest.requestUrl.sub('(https?://[^/:]+).*', '\1'):label=ENDPOINT \
  )" | awk 'NR==1 {print; next} ! seen[$2,$3,$4]++'
TIMESTAMP            STATUS  AUTHZ    ENDPOINT
YYYY-MM-DDTHH:MM:SS  200     ALLOWED  https://cloudresourcemanager.googleapis.com
YYYY-MM-DDTHH:MM:SS  200     ALLOWED  https://${REGION}-aiplatform.googleapis.com
YYYY-MM-DDTHH:MM:SS  200     ALLOWED  https://iamcredentials.googleapis.com
YYYY-MM-DDTHH:MM:SS  200     ALLOWED  https://mcp-weather-${PROJ_NO}.${REGION}.run.app
YYYY-MM-DDTHH:MM:SS  200     ALLOWED  https://telemetry.googleapis.com
YYYY-MM-DDTHH:MM:SS  202     ALLOWED  https://mcp-weather-${PROJ_NO}.${REGION}.run.app

پیکربندی سیاست عامل به نقاط پایانی

از آنجا که APIهای اصلی گوگل برای agent-weather تحت یک سرویس نقطه پایانی جمعی در رجیستری ( gapi.core.services ) ثبت شده‌اند، فقط یک سیاست واحد برای اعطای مجوزهای خروج به عامل برای دسترسی به نقطه پایانی مورد نیاز است.

ایجاد سیاست برای عامل به نقطه پایانی

# set var for endpoint display name
export ENDPOINT_DISPLAY_NAME="gapi.core.services"
echo ${ENDPOINT_DISPLAY_NAME}
# fetch endpoint registry id
export ENDPOINT_REGISTRY_ID=$(gcloud agent-registry services list \
  --location=${REGION} \
  --filter="displayName=${ENDPOINT_DISPLAY_NAME}" \
  --format="value(registryResource.basename())")
echo ${ENDPOINT_REGISTRY_ID}
# create policy config file
cat > cfg/iap-policy-agent-to-ep.json << EOF
{
  "bindings": [
    {
      "role": "roles/iap.egressor",
      "members": [
        "${RE_AGENT_IDENTITY}"
      ]
    }
  ]
}
EOF

سیاست اتصال برای عامل به نقطه پایانی

# import policy file (bind iam policy)
gcloud -q beta iap web set-iam-policy cfg/iap-policy-agent-to-ep.json \
  --resource-type=agent-registry \
  --endpoint=${ENDPOINT_REGISTRY_ID} \
  --region=${REGION}

مجوزهای IAM را تأیید کنید

# show iap iam policy on endpoint for agent
gcloud beta iap web get-iam-policy \
  --region=${REGION} \
  --resource-type=agent-registry \
  --endpoint=${ENDPOINT_REGISTRY_ID}

این بخش حسابرسی را به پایان می‌رساند... و پس از آن بخش اجرا قرار دارد.

۱۳. اجرا

عامل توانست درخواست‌های موفقیت‌آمیزی را از طریق دروازه در حالت DRY_RUN ارسال کند. گزارش‌های دسترسی و نقاط پایانی برای ایجاد مجموعه‌ای از سیاست‌های مدیریتی که امکان ترافیک خروجی لازم از عامل را فراهم می‌کنند، تجزیه و تحلیل شدند. اکنون با به‌روزرسانی سیاست مجوز، افزونه مجوز IAP دروازه عامل را به حالت ENFORCE منتقل کنید.

به‌روزرسانی افزونه‌ی مجوز

ایجاد افزونه authz

# create authz extension config file (enforced mode)
cat > cfg/${AGW_NAME}-svc-ext-authz-iap-enforced.yaml << EOF
name: ${AGW_NAME}-svc-ext-authz-iap-enforced
service: iap.googleapis.com
failOpen: false
timeout: 1s
metadata:
  iapPolicyVersion: "V1"
EOF

افزونه authz را وارد کنید

# import authz extension file (create extension)
gcloud service-extensions authz-extensions import ${AGW_NAME}-svc-ext-authz-iap-enforced \
  --source=cfg/${AGW_NAME}-svc-ext-authz-iap-enforced.yaml \
  --location=${REGION}

تأیید افزونه authz

# list authz extensions (imported configs)
gcloud service-extensions authz-extensions list --location=${REGION}

به‌روزرسانی سیاست مجوزدهی

ایجاد سیاست احراز هویت

# re-write authz policy config file (pointing to enforced authz extension)
cat > cfg/${AGW_NAME}-authz-policy-profile-iap.yaml << EOF
name: ${AGW_NAME}-authz-policy-profile-iap
target:
  resources:
    - "projects/${PROJ_ID}/locations/${REGION}/agentGateways/${AGW_NAME}"
policyProfile: REQUEST_AUTHZ
action: CUSTOM
customProvider:
  authzExtension:
    resources:
      - "projects/${PROJ_ID}/locations/${REGION}/authzExtensions/${AGW_NAME}-svc-ext-authz-iap-enforced"
EOF

سیاست اتصال authz

# import authz policy config file (enable new authz policy)
gcloud beta network-security authz-policies import ${AGW_NAME}-authz-policy-profile-iap \
  --source=cfg/${AGW_NAME}-authz-policy-profile-iap.yaml \
  --location=${REGION}

سیاست authz را تأیید کنید

# show authz policy details (verify enforced mode)
gcloud beta network-security authz-policies describe ${AGW_NAME}-authz-policy-profile-iap \
  --location=${REGION}

تأیید اجرای قانون

در رابط کاربری کنسول به محیط بازی عامل (agent Playground) برگردید.

  • برای ایجاد یک جلسه چت جدید، روی دکمه « + جلسه جدید » کلیک کنید

ارسال درخواست تست اضافی...

  • What is the current temperature in Los Angeles?

مشاهده کنید که درخواست‌های عامل به مدل پایه Gemini ( ${REGION}-aiplatform.googleapis.com/... ) و نقطه پایانی سرور MCP ( mcp-weather-${PROJ_NO}.${REGION}.run.app/mcp ) با کدهای وضعیت HTTP 200 OK ارسال می‌شوند.

تحلیل لاگ‌های دروازه

# show gateway logs for http requests
gcloud logging read \
  "resource.type=\"networkservices.googleapis.com/Gateway\" \
  AND httpRequest.requestUrl:*" \
  --project=${PROJ_ID} \
  --limit=10 \
  --format="table(
    timestamp.date(tz=LOCAL):label=TIMESTAMP,
    httpRequest.requestMethod:label=METHOD,
    httpRequest.status:label=STATUS,
    jsonPayload.authzPolicyInfo.result:label=IAP_AUTHZ,
    jsonPayload.agentGatewayInfo.mcpInfo.method:label=MCP_METHOD,
    httpRequest.requestUrl:label=URL)"

بررسی کنید که هیچ درخواستی مسدود نشده باشد. در گزارش‌های حسابرسی دروازه، به دنبال هرگونه تلاش برای خروج رد شده با کدهای وضعیت HTTP 403 Forbidden باشید.

# show gateway logs for authz denies
gcloud logging read \
  "resource.type=\"networkservices.googleapis.com/Gateway\" \
  AND (jsonPayload.authzPolicyInfo.result=\"DENIED\" OR httpRequest.status=403)" \
  --project=${PROJ_ID} \
  --limit=10 \
  --format="table(
    timestamp.date(tz=LOCAL):label=TIMESTAMP,
    httpRequest.requestMethod:label=METHOD,
    httpRequest.status:label=STATUS,
    jsonPayload.enforcedGatewaySecurityPolicy.serverNameIndication:label=SNI,
    jsonPayload.authzPolicyInfo.result:label=AUTHZ_RESULT,
    jsonPayload.authzPolicyInfo.policies[0].name.basename():label=DENYING_POLICY
  )"

لاگ‌های Agent Gateway MCP را مشاهده کنید و توجه داشته باشید که چگونه بار داده برنامه MCP (JSON-RPC) برای افشای ابرداده پروتکل، از جمله اینکه کدام ابزارها در حال اجرا هستند، بررسی می‌شود.

# show gateway logs for mcp requests with method and tool name
gcloud logging read \
  "resource.type=\"networkservices.googleapis.com/Gateway\" \
  AND jsonPayload.agentGatewayInfo.mcpInfo.method:*" \
  --project=${PROJ_ID} \
  --limit=10 \
  --format="table(
    timestamp.date(tz=LOCAL):label=TIMESTAMP,
    httpRequest.status:label=STATUS,
    jsonPayload.authzPolicyInfo.result:label=IAP_AUTHZ,
    jsonPayload.agentGatewayInfo.mcpInfo.method:label=MCP_METHOD,
    jsonPayload.agentGatewayInfo.mcpInfo.parameter:label=TOOL_NAME,
    httpRequest.requestUrl:label=URL
  )"

تحلیل لاگ‌های فایروال

مشاهده گزارش‌های مربوط به قانون سیاست فایروال شبکه با اولویت 1001 .

# show firewall logs for rule 1001
gcloud logging read \
  "jsonPayload.rule_details.priority=1001" \
  --project=${PROJ_ID} \
  --limit=10 \
  --format="table(
    timestamp.date(tz=LOCAL):label=TIMESTAMP,
    jsonPayload.disposition:label=ACTION,
    jsonPayload.connection.src_ip:label=SRC_IP,
    jsonPayload.connection.dest_ip:label=DEST_IP,
    jsonPayload.connection.dest_port:label=DEST_PORT,
    jsonPayload.vpc.subnetwork_name:label=SUBNET
  )"

به نمای سطح شبکه از مسیرهای مختلف ترافیک توجه کنید:

  • ارتباط Agent Gateway با منابع شبکه داخلی VPC با استفاده از subnet-${REGION}-agw
  • سرور MCP میزبانی شده توسط Cloud Run با استفاده از subnet-${REGION}-crun با APIهای آب و هوای خارجی تماس برقرار می‌کند.
TIMESTAMP            ACTION   SRC_IP        DEST_IP        DEST_PORT  SUBNET
YYYY-MM-DDTHH:MM:SS  ALLOWED  10.10.10.16   188.40.99.226  443        subnet-${REGION}-crun
YYYY-MM-DDTHH:MM:SS  ALLOWED  10.10.10.16   202.61.206.6   443        subnet-${REGION}-crun
YYYY-MM-DDTHH:MM:SS  ALLOWED  10.10.10.16   188.40.99.226  443        subnet-${REGION}-crun
YYYY-MM-DDTHH:MM:SS  ALLOWED  10.10.10.16   202.61.206.6   443        subnet-${REGION}-crun
YYYY-MM-DDTHH:MM:SS  ALLOWED  10.10.10.16   202.61.206.6   443        subnet-${REGION}-crun
YYYY-MM-DDTHH:MM:SS  ALLOWED  10.10.10.16   202.61.206.6   443        subnet-${REGION}-crun
YYYY-MM-DDTHH:MM:SS  ALLOWED  192.168.10.2  240.0.0.10     443        subnet-${REGION}-agw
YYYY-MM-DDTHH:MM:SS  ALLOWED  192.168.10.2  240.0.0.10     443        subnet-${REGION}-agw
YYYY-MM-DDTHH:MM:SS  ALLOWED  192.168.10.2  240.0.0.10     443        subnet-${REGION}-agw

تحلیل لاگ‌های DNS

مشاهده گزارش‌های کوئری DNS برای درخواست‌های حل‌شده توسط منطقه DNS خصوصی ( priv-zone-run ).

gcloud logging read \
  "resource.type=\"dns_query\" AND resource.labels.target_name=\"priv-zone-run\"" \
  --project=${PROJ_ID} \
  --limit=10 \
  --format="table(
    timestamp.date(tz=LOCAL):label=TIMESTAMP,
    jsonPayload.queryName:label=QUERY_NAME,
    jsonPayload.queryType:label=TYPE,
    jsonPayload.rdata:label=RESPONSE_RDATA,
    jsonPayload.sourceNetwork:label=NETWORK,
    resource.labels.source_type:label=SRC_TYPE
  )"

توجه داشته باشید که جستجوهای DNS برای سرویس Cloud Run ( mcp-weather...run.app ) از شبکه VPC با استفاده از DNS peering سرچشمه می‌گیرند و با موفقیت به نقطه پایانی PSC داخلی برای APIهای گوگل ( 240.0.0.10 ) منتقل می‌شوند.

TIMESTAMP            QUERY_NAME                                     TYPE  RESPONSE_RDATA                                                     NETWORK   SRC_TYPE
YYYY-MM-DDTHH:MM:SS  mcp-weather-${PROJ_NO}.${REGION}.run.app.  A     mcp-weather-${PROJ_NO}.${REGION}.run.app. 300     IN      a       240.0.0.10  vnet-${SLUG}  peering-zone
YYYY-MM-DDTHH:MM:SS  mcp-weather-${PROJ_NO}.${REGION}.run.app.  A     mcp-weather-${PROJ_NO}.${REGION}.run.app. 300     IN      a       240.0.0.10  vnet-${SLUG}  peering-zone
YYYY-MM-DDTHH:MM:SS  mcp-weather-${PROJ_NO}.${REGION}.run.app.  A     mcp-weather-${PROJ_NO}.${REGION}.run.app. 300     IN      a       240.0.0.10  vnet-${SLUG}  peering-zone
YYYY-MM-DDTHH:MM:SS  mcp-weather-${PROJ_NO}.${REGION}.run.app.  A     mcp-weather-${PROJ_NO}.${REGION}.run.app. 300     IN      a       240.0.0.10  vnet-${SLUG}  peering-zone

این بخش اجرا را به پایان می‌رساند... که در کنار بخش پاکسازی قرار دارد.

۱۴. پاکسازی

# delete agent runtime
curl -s -X DELETE "https://${REGION}-aiplatform.googleapis.com/v1/projects/${PROJ_ID}/locations/${REGION}/reasoningEngines/${RE_ENGINE_ID}?force=true" \
  -H "Authorization: Bearer $(gcloud auth application-default print-access-token)"

# next
# delete agent resources
gcloud -q storage rm --recursive gs://${STAGING_BUCKET}

for ROLE in \
  "roles/aiplatform.user" \
  "roles/aiplatform.agentDefaultAccess" \
  "roles/agentregistry.viewer" \
  "roles/logging.logWriter" \
  "roles/monitoring.metricWriter" \
  "roles/browser"; do
  gcloud -q projects remove-iam-policy-binding ${PROJ_ID} \
    --member="${RE_AGENT_IDENTITY}" \
    --role="${ROLE}"
done

# next
# delete mcp (cloud run) resources
gcloud -q projects remove-iam-policy-binding ${PROJ_ID} \
  --member="serviceAccount:${PROJ_NO}-compute@developer.gserviceaccount.com" \
  --role="roles/run.builder"

gcloud -q run services delete ${MCP_NAME} --region=${REGION}

gcloud -q artifacts repositories delete cloud-run-source-deploy --location=${REGION}

gcloud -q iam service-accounts delete sa-${MCP_NAME}-invoker@${PROJ_ID}.iam.gserviceaccount.com

gcloud -q agent-registry services delete ${MCP_NAME} --location=${REGION}

# next
# delete gateway resources (policy binding must be deleted synchronously first)
gcloud -q beta network-security authz-policies delete ${AGW_NAME}-authz-policy-profile-iap --location=${REGION}

gcloud -q beta service-extensions authz-extensions delete ${AGW_NAME}-svc-ext-authz-iap-dryrun --location=${REGION} --async

gcloud -q beta service-extensions authz-extensions delete ${AGW_NAME}-svc-ext-authz-iap-enforced --location=${REGION} --async

gcloud -q network-services agent-gateways delete ${AGW_NAME} --location=${REGION} --async

# next
# remove policies
export IAP_ETAG=$(gcloud beta iap web get-iam-policy --resource-type=agent-registry --endpoint=${ENDPOINT_REGISTRY_ID} --region=${REGION} --format="value(etag)")
cat > cfg/iap-policy-empty.json << EOF
{
  "bindings": [],
  "etag": "${IAP_ETAG}"
}
EOF

gcloud -q beta iap web set-iam-policy cfg/iap-policy-empty.json \
  --resource-type=agent-registry \
  --endpoint=${ENDPOINT_REGISTRY_ID} \
  --region=${REGION}

# next
# delete dns resources
gcloud -q dns record-sets delete *.run.app --type=A --zone=priv-zone-run

gcloud -q dns managed-zones delete priv-zone-run

gcloud -q dns policies update dns-policy-${SLUG} --networks=""

gcloud -q dns policies delete dns-policy-${SLUG}

# next
# delete router (includes nat) and psc resources
gcloud -q compute routers delete cr-nat-${SLUG}-${REGION} --region=${REGION}

gcloud -q compute forwarding-rules delete psc2gapis --global

gcloud -q compute addresses delete ip-psc2gapis --global

# next
# delete firewall resources
gcloud -q compute network-firewall-policies associations delete --name=fw-policy-bind-${SLUG} --firewall-policy=fw-policy-${SLUG} --global-firewall-policy

gcloud -q compute network-firewall-policies rules delete 1001 --firewall-policy=fw-policy-${SLUG} --global-firewall-policy

gcloud -q compute network-firewall-policies delete fw-policy-${SLUG} --global

# next
# delete network resources
gcloud -q compute networks subnets delete subnet-${REGION}-agw --region=${REGION}

gcloud -q compute networks subnets delete subnet-${REGION}-crun --region=${REGION}

gcloud -q compute network-attachments delete psc-na-${REGION}-agw --region=${REGION}

gcloud -q compute networks delete vnet-${SLUG}

# next
# clean up local working directories and generated configs
rm -rf cfg agent-weather mcp-weather

# end

این بخش پاکسازی را به پایان می‌رساند... و بعد از نتیجه‌گیری !

۱۵. نتیجه‌گیری

تبریک! شما با موفقیت Agent Gateway را مستقر کرده و ترافیک خروجی عامل هوش مصنوعی را مدیریت کرده‌اید!

کازموپاپ

کازموپاپ فکر می‌کند Codelabs لباس خواب گربه است!

قدم بعدی چیست؟

با استفاده از این فرم بازخورد، می‌توانید هرگونه نظر، سوال یا اصلاحیه‌ای را ارائه دهید.

متشکرم!