خروج Agent Gateway من Agent Runtime إلى شبكة VPC

1. مقدمة

يستكشف هذا الدرس التطبيقي حول الترميز إدارة حركة البيانات الصادرة من بوابة الوكيل للوكلاء المستندين إلى الذكاء الاصطناعي الذين يصلون إلى نقاط نهاية بعيدة من خلال شبكة VPC خاصة. تتيح "بوابة الوكيل" التي تعمل في وضع الخروج (الوكيل إلى أي مكان) إمكانية الاتصال الخاص بشبكة VPC باستخدام واجهات Private Service Connect (PSC). في هذا السيناريو، يستخدم Agent Runtime خدمة Agent Gateway للوصول إلى خادم MCP HTTP قابل للبث عن بُعد مستضاف على Cloud Run من خلال استخدام نقطة نهاية Private Service Connect (PSC) لواجهات Google APIs في شبكة VPC.

يمكن لتطبيقات الذكاء الاصطناعي، بدءًا من برامج الدردشة المستقلة إلى الأنظمة المستقلة التي تتضمّن مهام سير عمل متعددة الوكلاء، استدعاء أدوات خارجية بشكل ديناميكي. من الضروري منح الوكلاء إذن وصول خاضعًا للرقابة للاستعلام عن قواعد البيانات وجلب محتوى الويب وتنفيذ الإجراءات، وذلك لضمان أمانهم وفعاليتهم. ومع ذلك، في بيئات المؤسسات، يمثّل تأمين تنفيذ أدوات الوكيل تحديًا. إذا كان لدى الوكيل إذن وصول مباشر إلى الشبكة، يمكن أن تؤدي الهجمات بحقن النصوص البرمجية أو الهلوسات التي تصدر عن النموذج إلى أن يستخرج الوكيل بيانات حساسة أو ينفّذ أوامر مدمرة.

لإدارة الوكلاء المستقلين على نطاق واسع، توفّر Agent Gateway نقطة تنفيذ مركزية مستندة إلى نهج الثقة المعدومة ومدمجة مباشرةً في بنية منصة الوكلاء. بدلاً من الاعتماد على عمليات تنفيذ مخصّصة وفريدة لكل تطبيق أو رمز وكيل، توفّر Agent Gateway توجيه الشبكة وإدارة الوكيل وأمان وقت التشغيل الذي يتم فرضه على مستوى النظام الأساسي.

عندما تعمل "بوابة الوكيل" في وضع الخروج (الوكيل إلى أي مكان)، فإنّها تعمل كوكيل لجميع الطلبات الصادرة من الوكلاء الذين تم إعدادهم لاستخدام البوابة. يتمّ إثبات ملكية كلّ طلب عبء عمل وكيل باستخدام هوية الوكيل الفريدة، ويتمّ منح الإذن باستخدام سياسات Identity-Aware Proxy (IAP). يتم فك ترميز طلبات أداة MCP وفحصها بشكل ديناميكي لفرض السياسات. يمكن لمشرفي الأمان فرض أذونات دقيقة على مستوى مركزي لضمان عدم تمكّن الوكلاء من استدعاء نقاط النهاية والطُرق التي تمت الموافقة عليها فقط.

ما يمكنك إنشاؤه

  • Agent Gateway في وضع الخروج (الوكيل إلى أي مكان)
  • إضافة تفويض Identity-Aware Proxy (IAP)
  • وكيل Agent Runtime ADK مع هوية الوكيل
  • خادم MCP قابل للبث عبر HTTP على Cloud Run
  • Agent Registry مع Google API ونقاط نهاية MCP المخصّصة
  • سياسات التفويض مع التحكّم في الوصول من خلال "إدارة الهوية وإمكانية الوصول"
  • موارد شبكة السحابة الافتراضية الخاصة (VPC) ومنطقة Cloud DNS ونقطة نهاية Private Service Connect (PSC) لواجهات Google APIs
  • ربط شبكة PSC بخروج Agent Gateway
  • قواعد سياسات جدار الحماية Cloud Next Generation Firewall (NGFW)

figure1

الشكل 1. بنية Codelab

ما ستتعلمه

  • كيفية نشر Agent Gateway في تسلسل إعدادات منظَّم
  • كيفية ضبط Agent Gateway باستخدام اتصال شبكة VPC الخاصة
  • كيفية نقل سياسات التفويض من وضع التشغيل التجريبي إلى الوضع الإلزامي
  • كيفية تسجيل نقاط نهاية Google API وخوادم MCP في Agent Registry
  • كيفية تدقيق سجلّات Agent Gateway للتحقّق من صحة إدارة الخروج
  • كيفية التحقّق من صحة عدد زيارات الخروج من Agent Gateway باستخدام سجلّات Cloud NGFW

ما تحتاج إليه

  • مشروع Google Cloud تم تفعيل الفوترة فيه
  • أذونات إدارة الهوية وإمكانية الوصول لتوفير خدمات الشبكات ومجموعات بيانات BigQuery وموارد "منصّة الوكيل"
  • برنامج shell متوافق مع POSIX ‏(bash أو zsh) مع تثبيت واجهة سطر الأوامر (CLI) في Google Cloud (المكوّنان gcloud وbq)
  • أدوات سطر الأوامر: git وcurl وjq (معالج JSON) وPython 3 وuv (مدير حِزم Python)

2. المفاهيم

تسلسل النشر

يتّبع هذا الدرس التطبيقي حول الترميز تسلسلاً منظَّمًا للإعدادات حتى يتمكّن العملاء من الوصول إلى الموارد اللازمة عند بدء التشغيل، ويمكن تأكيد إمكانية الاتصال قبل تطبيق سياسات الوصول المفروضة.

يستخدم هذا الدرس التطبيقي حول الترميز تسلسل النشر التالي:

  1. البدء في وضع DRY_RUN: تأكَّد من وصول طلبات الوكيل إلى البوابة بنجاح ومن اجتيازها (وضع التدقيق فقط).
  2. تسجيل جميع الخدمات: سجِّل جميع المكوّنات المستندة إلى وكيل في "سجلّ الوكلاء" وأكِّد إمكانية الوصول إلى أدوات الوكيل. استخدِم Cloud Logging ولوحة بيانات إمكانية المراقبة في Agent Gateway لعرض طلبات البحث في Agent Registry.
  3. إنشاء سياسات التفويض: أنشئ سياسات التفويض وطبِّقها للسماح بخروج البيانات من الوكلاء إلى خوادم MCP ونقاط النهاية.
  4. التبديل إلى وضع ENFORCED: عدِّل سياسة إضافة تفويض التحديث لفرض السياسات وحظر حركة الخروج غير المصرّح بها.

figure2

الشكل 2. تسلسل النشر

تخطيط توجيه الخروج

تعمل ميزة Agent Gateway egress (agent-to-anywhere) كخادم وكيل مركزي صادر لا يتطلّب ثقة لأحمال العمل المستندة إلى الذكاء الاصطناعي الوكيل. عندما يرسل وكيل طلبًا إلى أداة أو واجهة برمجة تطبيقات خارجية، تعترض "بوابة الوكيل" الطلب الصادر وتقيّمه وفقًا لسياسات الحوكمة قبل توجيهه إلى وجهته. في بنية Google Cloud Agent Platform، توفّر Agent Gateway إمكانية الاتصال بمستوى البيانات من أجل:

  • الشبكات الخاصة (VPC): الزيارات الصادرة التي تستهدف واجهات برمجة التطبيقات الداخلية للمؤسسة والخدمات المصغّرة وقواعد البيانات المستضافة ضِمن شبكات VPC الخاصة والشبكات المحلية أو الشبكات المتعددة السحابات التي يمكن الوصول إليها من خلال الاتصال المختلط
  • الشبكات الخارجية (الإنترنت): الزيارات الصادرة التي تستهدف خدمات الويب التابعة لجهات خارجية أو واجهات برمجة التطبيقات الخاصة بالبرامج كخدمة (SaaS) أو نقاط النهاية العامة
  • خدمات الذكاء الاصطناعي ومنصة Agent: تشمل هذه الفئة الزيارات الصادرة التي تستهدف واجهات Google Cloud API المُدارة والنماذج الأساسية ونقاط نهاية Google MCP (مثل BigQuery) وخدمات إدارة المنصة (Agent Registry وسياسات IAP).

figure3

الشكل 3. بنية توجيه الخروج في Agent Gateway

يركّز هذا الدرس التطبيقي حول الترميز على حركة البيانات الصادرة من وكيل مخصّص على Agent Runtime يستهدف نقطة نهاية PSC لواجهات Google APIs تم نشرها في شبكة VPC. تتيح هذه البنية الوصول الخاص إلى خادم MCP المستضاف على Cloud Run باستخدام مرفق شبكة PSC لحركة البيانات الصادرة من Agent Gateway.

الاتصال بشبكة VPC

يمكن أن تتصل عملية الخروج من Agent Gateway (agent-to-anywhere) بشبكة VPC من خلال تحديد networkConfig: egress: networkAttachment: [URI] في ملف إعداد YAML الخاص بعملية النشر. يضبط هذا الإعداد قواعد التوجيه على Agent Gateway لإرسال الزيارات التي يتم تحليلها إلى عناوين IP خاصة من خلال ملحق شبكة PSC إلى شبكة VPC.

figure4

الشكل 4. الاتصال بشبكة VPC في Agent Gateway

يمكن لـ Agent Gateway تحويل أسماء مضيفين خاصة بنظام أسماء النطاقات باستخدام تبادل معلومات بين الشبكات عبر Cloud DNS إلى مشروع مستهدف وشبكة VPC محدّدين. ستستخدِم أي مناطق خاصة مُدرَجة في إعدادات dnsPeeringConfig: domains: [NAME] سجلّات Cloud DNS في المشروع المستهدَف. ستستخدم أي طلبات بحث أخرى في نظام أسماء النطاقات برنامج تحليل نظام أسماء النطاقات العام التلقائي في شبكة VPC.

بهذا نكون قد انتهينا من جزء المفاهيم... لننتقل الآن إلى قسم الإعداد.

3- الإعداد

أدوار "إدارة الهوية وإمكانية الوصول" المطلوبة

يجب توفّر الأدوار التالية لإنشاء الموارد في هذا الدرس العملي:

الفئة

دور "إدارة الهوية وإمكانية الوصول" المطلوب (المعرّف)

الوصف

إدارة واجهة برمجة التطبيقات

roles/serviceusage.serviceUsageAdmin

تفعيل خدمات Google Cloud API

الشبكات والبوابة

roles/networkservices.admin

Provision Agent Gateway

إضافات الخدمات

roles/serviceextensions.admin

ضبط إضافات التوجيه

أمان الشبكات

roles/networksecurity.admin

نشر سياسات التفويض

Agent Registry

roles/agentregistry.admin

المواقع الإلكترونية المضيفة المسموح بها في الكتالوج

‫Vertex AI والوكلاء

roles/aiplatform.admin

نشر أحمال عمل Agent Runtime

سياسات الخروج

roles/iap.admin

تطبيق سياسات roles/iap.egressor

Cloud Storage

roles/storage.admin

إدارة حِزم الإعداد المؤقت لعمليات النشر

السجلات والتدقيق

roles/logging.viewer

فحص عمليات التتبُّع وسجلّات التدقيق

مطوّر Cloud Run

roles/run.developer

نشر خدمات Cloud Run

قارئ Artifact Registry

roles/artifactregistry.reader

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

مشرف شبكة Cloud Compute

roles/compute.networkAdmin

إدارة موارد الشبكات في السحابة الافتراضية الخاصة (VPC)

مشرف نظام أسماء النطاقات

roles/dns.admin

إدارة مناطق وسجلات Cloud DNS

بدلاً من ذلك، استخدِم دورًا أساسيًا واسع النطاق، مثل roles/admin أو دورًا قديمًا، مثل roles/owner.

الوصول إلى مشروعك

يستخدم هذا الدرس التطبيقي حول الترميز مشروعًا واحدًا على Google Cloud. تستخدم خطوات الإعداد واجهة سطر الأوامر gcloud وأوامر واجهة مستخدم Linux.

ابدأ بالوصول إلى سطر الأوامر في مشروعك على 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

ضبط متغيرات بيئة shell

# 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

في حال تنفيذ عملية تثبيت مُدارة ذاتيًا لحزمة تطوير البرامج (SDK) من Google Cloud (أي خارج Cloud Shell)، يجب تعديل المكوّنات إلى أحدث إصدار.

# update gcloud cli
gcloud components update

تفعيل خدمات واجهة برمجة التطبيقات

# 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

بهذا نكون قد انتهينا من جزء الإعداد... لننتقل الآن إلى قسم الشبكة.

4. الشبكة

يتم نشر شبكة السحابة الافتراضية الخاصة (VPC) باستخدام الوضع المخصّص لإنشاء شبكات فرعية عادية تتيح ربط الشبكة بخدمة PSC لكلّ من Agent Gateway والخروج المباشر من سحابة VPC في Cloud Run.

يتم نشر نقطة نهاية PSC لواجهات Google APIs باستخدام /32عنوان IPv4 داخلي عالمي واحد لإتاحة الوصول الداخلي الخاص إلى Cloud Run. لم يتم تخصيص عنوان IP هذا من أي شبكة فرعية إقليمية.

إنشاء شبكات

إنشاء شبكة VPC عالمية

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

أنشئ شبكات فرعية لربط شبكة Private Service Connect (PSC) ببوابة الوكيل ولإتاحة الخروج المباشر من سحابة 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}

أنشئ نقطة نهاية Private Service Connect لواجهات Google APIs باستخدام الحزمة all-apis التي تتضمّن Cloud Run (run.app).

# 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

إنشاء منطقة وسجلات نظام أسماء النطاقات

أنشئ منطقة مُدارة خاصة في 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}

أنشئ سجلّ A لنظام أسماء النطاقات (DNS) يتضمّن حرف بدل لنطاق *.run.app. يشير إلى عنوان IP لنقطة نهاية Private Service Connect.

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

أنشئ سياسة Cloud DNS لتفعيل تسجيل طلبات البحث في نظام أسماء النطاقات.

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

إنشاء Cloud NAT

أنشئ Cloud Router و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

بهذا نكون قد انتهينا من جزء الشبكة... لننتقل الآن إلى قسم البوابة.

5- البوابة

قبل فرض عناصر التحكّم في الوصول، يجب نشر Agent Gateway وضبط إضافة الأذونات في وضع DRY_RUN. يسمح ذلك بإجراء مكالمات الأدوات الصادرة بنجاح مع تسجيل نتائج التقييم لأغراض التدقيق.

يستخدم Agent Gateway هنا سجلّ إقليمي لتوفير موارد Agent Runtime إقليمية ويحدّد الحقول networkConfig لربط شبكة PSC بشبكة VPC وإعداد ربط نظام أسماء النطاقات.

إنشاء بوابة

# 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

بهذا نكون قد انتهينا من جزء البوابة... ننتقل الآن إلى قسم التفويض.

6. التفويض

إضافة تفويض Agent Gateway لخدمة Identity-Aware Proxy (IAP) هي نوع من إضافات الخدمة تُستخدَم لتفويض قرارات التفويض لجميع عمليات التواصل في منصة Agent Platform.

  1. مسار التفويض: عندما يحاول وكيل استدعاء نقطة نهاية خارجية أو خادم MCP، يوجّه الطلب إلى Agent Gateway. بدلاً من تقييم إذن الوصول محليًا، تستخدم البوابة إضافة التفويض لإرسال وسيلة شرح إلى خدمة تقييم IAP. تقيّم خدمة IAP هوية الوكيل (المستندة إلى SPIFFE) مقارنةً بسياسة إدارة الهوية وإمكانية الوصول الخاصة بالمرجع المستهدف في "قاعدة بيانات الوكلاء". تعرض خدمة IAP القرار ALLOW أو DENY إلى البوابة، التي إما تعيد توجيه الزيارات أو تحظرها باستخدام رمز حالة HTTP 403 Forbidden.
  2. أوضاع التنفيذ: في وضع DRY_RUN، تقيِّم خدمة IAP الطلبات وتسجّل القرارات في Cloud Logging بدون حظر الزيارات. في وضع ENFORCE، يتم حظر أي طلب من وكيل غير مصرَّح به أو إلى هدف غير مسجَّل على الفور.
  3. طبقة الربط: يتم ربط إضافة الخدمة بـ Agent Gateway باستخدام سياسة تفويض تم إعدادها باستخدام الملف الشخصي REQUEST_AUTHZ.

إضافة التفويض

يحدّد ملحق التفويض خدمة موفّر الأمان مع إعدادات الاتصال وغيرها من المَعلمات التي تحدّد طريقة عمل الخدمة وتكاملها مع 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

إضافة Import 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}

Verify authz extension

# 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

سياسة Bind 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}

التحقّق من سياسة التفويض

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

بهذا نكون قد انتهينا من جزء التفويض... لننتقل الآن إلى قسم قاعدة الرموز.

7. قاعدة الرموز البرمجية

يتم الاحتفاظ بالوكيل وخادم MCP ورمز تسجيل نقطة النهاية المستخدَم في هذا الدرس التطبيقي حول الترميز في مستودع 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)"

بهذا نكون قد انتهينا من جزء قاعدة الرموز البرمجية... ننتقل الآن إلى قسم قاعدة بيانات المسجّلين.

8. اسم السجلّ

‫Agent Registry هي مستودع مركزي لجميع الوكلاء وخوادم MCP ونقاط النهاية (واجهات برمجة التطبيقات) في منظومة الذكاء الاصطناعي المتكاملة. وهو أيضًا فهرس يمكن استخدامه لإدراج الأدوات والخدمات الأخرى المسجّلة والبحث عنها واكتشافها لاستخدامها في تطبيقات الذكاء الاصطناعي. تستخدم Agent Gateway نموذج بيانات السجلّ كإطار عمل للحوكمة من أجل فرض التحكّم في الوصول إلى البيانات الصادرة. يتم التحقّق من أذونات دور "إدارة الهوية وإمكانية الوصول" الخاصة بالجهات الأساسية التي تستدعي الوكلاء مقارنةً بالسياسة المرتبطة بمورد السجلّ.

من أجل إعداد البيئة ودعم الوكيل باستخدام خدمات وواجهات برمجة تطبيقات Google المختلفة، أنشئ خدمة نقطة نهاية تسجيل واحدة تجمع بين واجهات برمجة التطبيقات الأساسية اللازمة لهذه التجربة. سيؤدي ذلك إلى تسهيل إدارة سياسات الحوكمة لمجموعات الأدوات الشائعة التي سيستخدمها معظم الموظفين.

تسجيل نقاط النهاية

# 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.

9. خادم MCP

منح أذونات "إدارة الهوية وإمكانية الوصول" لعملية النشر

منح الأذونات لحساب خدمة Compute Engine التلقائي لتفعيل خدمات 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"

التحقّق من أذونات "إدارة الهوية وإمكانية الوصول"

# 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) لعملية نقل البيانات

ربط السياسة بوصول المستخدم

منح أذونات لحساب المستخدم (الذاتي) لاستدعاء خادم 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"

التحقّق من أذونات "إدارة الهوية وإمكانية الوصول"

# 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. سيستخدم الوكيل حساب الخدمة هذا لجلب رمز تعريف صالح بتوقيع Google من خلال "اتصال OpenID" للوصول إلى 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}

التحقّق من أذونات "إدارة الهوية وإمكانية الوصول"

# 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)"

منح أذونات "إدارة الهوية وإمكانية الوصول" للمصادقة

امنح أدوار انتحال هوية حساب الخدمة إلى حساب خدمة Compute التلقائي. سيسمح ذلك للوكيل، الذي يعمل بموجب "بيانات الاعتماد التلقائية للتطبيق" (ADC)، بإنشاء رموز تعريف "اتصال OpenID" ‏(OIDC) موقّعة من Google نيابةً عن حساب خدمة المنشئ المخصّص للمصادقة على الطلبات إلى 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"

التحقّق من أذونات "إدارة الهوية وإمكانية الوصول"

# 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)"

إنشاء MCP toolspec

عند تسجيل خادم MCP يدويًا، يجب تضمين ملف مواصفات الأداة. يسرد ملف toolspec.json جميع الأدوات التي يوفّرها خادم MCP، ويتيح للمستخدمين الآخرين العثور عليها بعد تسجيلها.

ينشئ النص البرمجي test_mcp.py، المضمّن في قاعدة الرموز mcp-weather/، ملف toolspec.json من خلال الاتصال بخادم MCP المستهدف (عبر SSE أو HTTP) واستدعاء list_tools() لاسترداد جميع الأدوات المتاحة التي يعرضها الخادم.

# 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 لتقييم سياسة الخروج وتنفيذها.

تأكيد MCP toolspec

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

تعديل حركة المرور الواردة إلى Cloud Run

غيِّر إعداد الدخول لخدمة Cloud Run كي تقبل الطلبات الواردة من شبكة VPC فقط. يمنع ذلك الوصول المباشر للجميع إلى نقطة نهاية MCP ويسمح فقط للموارد الداخلية بالوصول إليها. سيتم اعتبار الزيارات المتّجهة إلى نقطة نهاية PSC لواجهات Google 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 في قاعدة بيانات الوكلاء الإقليمية.

# 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.

10. وكيل ADK

تم إعداد وكيل agent-weather ADK الذي تم نشره في Agent Runtime باستخدام الإعدادات التالية في نص برمجي للنشر من أجل الدمج مع Agent Platform:

  • "identity_type": types.IdentityType.AGENT_IDENTITY لتوفير هوية أساسية فريدة مستندة إلى SPIFFE للوكيل
  • "agent_gateway_config": { "agent_to_anywhere_config": {"agent_gateway": } } لتوجيه جميع الزيارات الصادرة التي يبدأها الوكيل إلى Agent Gateway من أجل تقييم السياسات وتنفيذها

تم أيضًا ضبط الوكيل لاستخدام خادم MCP من خلال تمرير عنوان URL وحساب الخدمة لجلب رمز تعريف OIDC.

نشر الوكيل

# 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}'

منح أذونات "إدارة الهوية وإمكانية الوصول" للمصادقة

عند ضبط وكيل لاستخدام هوية الوكيل، يتلقّى رمزًا مميزًا (بتنسيق JWT-SVID) من خدمة STS الموحّدة التي يتم توقيعها بواسطة sts.googleapis.com (موفّر هوية SPIFFE).

ومع ذلك، لا يثق فحص IAM المضمّن في Cloud Run إلا في رموز تعريف OIDC العادية الموقَّعة من جهة إصدار Google OIDC الرئيسية (accounts.google.com)، ولا يمكنه التحقّق منها.

لذلك، يتم استخدام حساب خدمة مخصّص لتبادل رمز STS الموحّد (JWT-SVID) الذي تم الحصول عليه من خلال هوية الوكيل مقابل رمز Google عادي (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}"

التحقّق من أذونات "إدارة الهوية وإمكانية الوصول"

# 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) لوقت التشغيل إلى تمكين الوكيل من الوصول إلى خدمات "منصة الذكاء الاصطناعي" وخدمات وواجهات برمجة تطبيقات Google الأساسية الأخرى باستخدام هوية الوكيل الأساسية المستندة إلى SPIFFE. يتم فرض هذه السياسات باستخدام "إدارة الهوية وإمكانية الوصول" على مستوى المورد.

أنشِئ عمليات ربط الأدوار اللازمة لهوية الوكيل.

ربط السياسات بوصول الوكيل

# 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"

التحقّق من أذونات "إدارة الهوية وإمكانية الوصول"

# 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... وسننتقل الآن إلى قسم السياسات.

11. السياسات

تسمح سياسات تفويض إدارة الوكيل بتوجيه الزيارات من وكيل الذكاء الاصطناعي من خلال Agent Gateway إلى وجهة المرجع النهائية (مثل نقطة نهاية خادم MCP خاص لاسترداد البيانات). وبعد وصول الزيارات إلى الوجهة، تمنح أذونات الخدمة أو التطبيق العادية إذن الوصول إلى البيانات.

يتيح منح أدوار "إدارة الهوية وإمكانية الوصول" لخروج Agent Gateway سياسات الوصول التي تسمح لهوية المستخدم الأساسي للوكيل بالوصول إلى موارد الوجهة المسجّلة من خلال Agent Gateway. يتم فرض السياسات على مستوى Agent Gateway والتحقّق من صحتها باستخدام سياسات إدارة الهوية وإمكانية الوصول (IAM) في Identity-Aware Proxy (IAP).

منح أدوار "إدارة الهوية وإمكانية الوصول" لخروج Agent Gateway

تتحقّق Agent Gateway من الطلبات الواردة للتأكّد من أنّ هوية الوكيل المتصل لديها الإذن iap.webServiceVersions.egressViaIAP (الذي يمنحه الدور roles/iap.egressor) على المورد المستهدف.

يسمح منح roles/iap.egressor لهوية الوكيل أو مجموعة الأساسيات في Agent Runtime على مورد الوجهة المحدّد بنقل بيانات الخروج هذا. في هذا الدرس التطبيقي حول الترميز، يتم تطبيق الدور على الوكيل الأساسي الذي يمنح الإذن لهوية وكيل Agent Runtime المحدّدة.

ترتبط سياسات إدارة الهوية وإمكانية الوصول بالموارد الوجهة على النحو المحدّد في نموذج البيانات الخاص بـ Agent Registry. يمثّل مورد iap_web/agentRegistry مستوى "على مستوى السجلّ" في التسلسل الهرمي لإدارة الهوية وإمكانية الوصول. حيث يمثّل agentRegistry العنصر الرئيسي لموارد العناصر الفرعية الفردية agents وmcpServers وendpoints في هذا الدرس العملي، تكون سياسة إدارة الهوية وإمكانية الوصول مرتبطة بمستويَي 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}

التحقّق من أذونات "إدارة الهوية وإمكانية الوصول"

# 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}

بهذا نكون قد انتهينا من جزء السياسات، وسننتقل الآن إلى قسم التدقيق.

12. التدقيق

تعمل إضافة تفويض Agent Gateway في وضع DRY_RUN. يتم رصد الطلبات الصادرة وتسجيلها ولكن لا يتم حظرها. سيؤكّد تحليل السجلات قبل التبديل إلى وضع ENFORCED السياسات التي يجب ضبطها للسماح بحركة الزيارات المقصودة.

اختبار طلبات الوكيل

افتح نافذة متصفّح لواجهة مستخدم Google Cloud Console وانتقِل إلى:

  • منصة الوكيل → الوكلاء → عمليات النشر → 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

ضبط سياسة "الوكيل إلى نقاط النهاية"

بما أنّه تم تسجيل واجهات Google APIs الأساسية لـ 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}

التحقّق من أذونات "إدارة الهوية وإمكانية الوصول"

# 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}

بهذا نكون قد انتهينا من جزء التدقيق... لننتقل الآن إلى قسم فرض.

13. تنفيذ

تمكّن الوكيل من تقديم طلبات ناجحة من خلال البوابة في وضع DRY_RUN. تم تحليل سجلّات الوصول ونقاط النهاية لإنشاء مجموعة من سياسات الحوكمة التي تسمح بحركة الخروج اللازمة من الوكيل. يمكنك الآن نقل إضافة تفويض Agent Gateway 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

إضافة Import 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}

Verify authz extension

# 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

سياسة Bind 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}

التحقّق من سياسة التفويض

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

التحقّق من إجراء التنفيذ

ارجع إلى ساحة التجربة الخاصة بالوكيل في واجهة مستخدم وحدة التحكّم.

  • انقر على الزر + جلسة جديدة لإنشاء جلسة محادثة جديدة

إرسال طلب بحث اختباري إضافي...

  • What is the current temperature in Los Angeles?

لاحظ أنّ طلبات الوكيل إلى النموذج الأساسي من Gemini (${REGION}-aiplatform.googleapis.com/...) ونقطة نهاية خادم MCP (mcp-weather-${PROJ_NO}.${REGION}.run.app/mcp) يتم تمريرها مع رموز الحالة 200 OK لبروتوكول HTTP.

تحليل سجلّات البوابة

# 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
  )"

اطّلِع على سجلات "بوابة الوكيل" الخاصة ببروتوكول سياق النموذج (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
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

تحليل سجلّات نظام أسماء النطاقات

عرض سجلّات طلبات البحث في نظام أسماء النطاقات للطلبات التي تم حلّها بواسطة منطقة نظام أسماء النطاقات الخاص (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
  )"

ملاحظة: إنّ عمليات البحث عن نظام أسماء النطاقات لخدمة Cloud Run (mcp-weather...run.app) مصدرها شبكة VPC باستخدام تبادل معلومات بين الشبكات عبر نظام أسماء النطاقات، ويتم حلّها بنجاح إلى نقطة نهاية PSC الداخلية لواجهات Google APIs (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

بهذا نكون قد انتهينا من جزء "فرض القيود"، وسننتقل الآن إلى قسم التنظيف.

14. تنظيف

# 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

بهذا نكون قد انتهينا من جزء التنظيف... لننتقل الآن إلى الخاتمة.

15. الخاتمة

تهانينا! لقد تم نشر Agent Gateway بنجاح وإدارة عدد الزيارات الصادرة من وكيل الذكاء الاصطناعي.

cosmopup

يعتقد Cosmopup أنّ Codelabs هي الأفضل!

ما هي الخطوة التالية؟

يمكنك تقديم أي تعليقات أو أسئلة أو تصحيحات باستخدام نموذج الملاحظات هذا.

شكرًا