एजेंट रनटाइम से बाहरी एमसीपी तक एजेंट गेटवे का इग्रेस

1. परिचय

इस कोडलैब में, Google Cloud के बाहर होस्ट किए गए बाहरी मॉडल कॉन्टेक्स्ट प्रोटोकॉल (एमसीपी) सर्वर को ऐक्सेस करने वाले एआई एजेंट के लिए, एजेंट गेटवे इग्रेस गवर्नेंस के बारे में बताया गया है.

एआई ऐप्लिकेशन, स्टैंडअलोन चैटबॉट से लेकर कई एजेंट वाले वर्कफ़्लो वाले ऑटोनॉमस सिस्टम तक, बाहरी टूल को डाइनैमिक तरीके से चालू कर सकते हैं. एजेंट को डेटाबेस से क्वेरी करने, वेब कॉन्टेंट फ़ेच करने, और कार्रवाइयां करने के लिए, सीमित ऐक्सेस देना ज़रूरी है. इससे एजेंट सुरक्षित और ज़्यादा असरदार तरीके से काम कर पाते हैं. हालांकि, एंटरप्राइज़ एनवायरमेंट में, एजेंट टूल के एक्ज़ीक्यूशन को सुरक्षित करना एक चुनौती है. अगर किसी एजेंट के पास नेटवर्क का सीधा ऐक्सेस है, तो प्रॉम्प्ट इंजेक्शन के हमलों या मॉडल के भ्रम की वजह से, एजेंट संवेदनशील डेटा को बाहर निकाल सकता है या नुकसान पहुंचाने वाले कमांड चला सकता है.

बड़े पैमाने पर अपने-आप काम करने वाले एजेंट को मैनेज करने के लिए, Agent Gateway एक ऐसा पॉइंट उपलब्ध कराता है जहां से सभी एजेंट को कंट्रोल किया जा सकता है. यह पॉइंट, Agent Platform के आर्किटेक्चर में सीधे तौर पर इंटिग्रेट किया गया है. साथ ही, यह ज़ीरो-ट्रस्ट सिद्धांत पर काम करता है. हर ऐप्लिकेशन या एजेंट कोड के लिए, कस्टम तरीके से लागू करने के बजाय, एजेंट गेटवे प्लैटफ़ॉर्म लेवल पर नेटवर्क राउटिंग, एजेंट गवर्नेंस, और रनटाइम सुरक्षा उपलब्ध कराता है.

जब एजेंट गेटवे, इग्रेस (एजेंट-टू-एनीवेयर) मोड में काम करता है, तो यह गेटवे का इस्तेमाल करने के लिए कॉन्फ़िगर किए गए एजेंट से किए गए सभी आउटबाउंड अनुरोधों को प्रॉक्सी करता है. एजेंट के हर वर्कलोड अनुरोध की पुष्टि, यूनीक एजेंट आइडेंटिटी का इस्तेमाल करके की जाती है. साथ ही, Identity-Aware Proxy (IAP) की नीतियों का इस्तेमाल करके, अनुरोध को अनुमति दी जाती है. MCP टूल के कॉल को डाइनैमिक तरीके से डिकोड किया जाता है. साथ ही, नीति लागू करने के लिए उनकी जांच की जाती है. सुरक्षा एडमिन, ग्रेन्यूलर अनुमतियों को केंद्रीय रूप से लागू कर सकते हैं. इससे यह पक्का किया जा सकता है कि एजेंट सिर्फ़ मंज़ूरी वाले एंडपॉइंट और तरीकों का इस्तेमाल कर सकें.

आपने क्या बनाया है

  • एजेंट गेटवे, इग्रेस (agent-to-anywhere) मोड में
  • Identity-Aware Proxy (IAP) ऑथराइज़ेशन एक्सटेंशन
  • एजेंट की पहचान के साथ एजेंट रनटाइम ADK एजेंट
  • Google API और एमसीपी एंडपॉइंट के साथ एजेंट रजिस्ट्री
  • Data Commons के सार्वजनिक डेटासेट से, बाहरी एमसीपी टूल को कनेक्ट करने की सुविधा
  • आईएएम ऐक्सेस कंट्रोल के साथ अनुमति से जुड़ी नीतियां

figure1

पहली इमेज. कोडलैब का स्ट्रक्चर

आपको ये सब सीखने को मिलेगा

  • स्ट्रक्चर्ड कॉन्फ़िगरेशन सीक्वेंस में एजेंट गेटवे को डिप्लॉय करने का तरीका
  • अनुमति देने से जुड़ी नीतियों को ड्राय-रन मोड से लागू किए गए मोड में कैसे बदला जाता है
  • एजेंट रजिस्ट्री में Google API एंडपॉइंट और एमसीपी सर्वर रजिस्टर करने का तरीका
  • एमसीपी प्रोटोकॉल एट्रिब्यूट के आधार पर, शर्तों के साथ अनुमति देने वाली नीतियों का इस्तेमाल कैसे करें
  • एजेंट गेटवे के लॉग का ऑडिट करके, इग्रेस डेटा ट्रैफ़िक से जुड़ी नीतियों की पुष्टि कैसे करें

आपको इन चीज़ों की ज़रूरत पड़ेगी

  • बिलिंग की सुविधा वाला Google Cloud प्रोजेक्ट
  • नेटवर्किंग सेवाएं और एजेंट प्लैटफ़ॉर्म के संसाधन उपलब्ध कराने के लिए, आईएएम अनुमतियां
  • Google Cloud CLI (gcloud और bq कॉम्पोनेंट) इंस्टॉल किया गया हो, साथ ही POSIX के साथ काम करने वाला शेल (bash या zsh)
  • कमांड-लाइन टूल: git, curl, jq (JSON प्रोसेसर), Python 3, और uv (Python पैकेज मैनेजर)
  • क्वेरी टेस्ट डेटासेट को ऐक्सेस करने के लिए, Data Commons API की मुफ़्त कुंजी

2. कॉन्सेप्ट

डिप्लॉयमेंट का क्रम

इस कोडलैब में, कॉन्फ़िगरेशन का क्रम तय किया गया है, ताकि एजेंट को शुरू में ही ज़रूरी संसाधनों का ऐक्सेस मिल जाए. साथ ही, ऐक्सेस से जुड़ी नीतियां लागू करने से पहले, कनेक्टिविटी की पुष्टि की जा सके.

इस कोडलैब में, डिप्लॉयमेंट के लिए इस क्रम का इस्तेमाल किया गया है:

  1. DRY_RUN मोड में शुरू करें: पक्का करें कि एजेंट के अनुरोध, गेटवे पर पहुंच रहे हों और ऑडिट-ओनली मोड में पास हो रहे हों.
  2. सभी सेवाओं को रजिस्टर करें: Agent Registry में सभी एजेंटिक कॉम्पोनेंट रजिस्टर करें और एजेंट टूल के ऐक्सेस की पुष्टि करें.
  3. अनुमति देने से जुड़ी नीतियां बनाएं: एजेंट से एमसीपी सर्वर और एंडपॉइंट तक ईग्रेस ट्रैफ़िक की अनुमति देने के लिए, अनुमति देने से जुड़ी नीतियां बनाएं और लागू करें.
  4. ENFORCED मोड पर स्विच करें: नीतियों को लागू करने और बिना अनुमति वाले इग्रेस ट्रैफ़िक को ब्लॉक करने के लिए, अनुमति देने वाले एक्सटेंशन की नीति को अपडेट करें.

figure2

दूसरी इमेज. डिप्लॉयमेंट का क्रम

इग्रेस रूटिंग टोपोलॉजी

एजेंट गेटवे इग्रेस (agent-to-anywhere) एजेंटिक वर्कलोड के लिए, केंद्रीकृत और ज़ीरो-ट्रस्ट आउटबाउंड प्रॉक्सी के तौर पर काम करता है. जब कोई एजेंट किसी बाहरी टूल या एपीआई से अनुरोध करता है, तो आउटबाउंड अनुरोध को एजेंट गेटवे इंटरसेप्ट करता है. इसके बाद, इसे गवर्नेस की नीतियों के हिसाब से परखा जाता है. इसके बाद, इसे मंज़िल तक पहुंचाया जाता है. Google Cloud Agent Platform आर्किटेक्चर में, एजेंट गेटवे इन चीज़ों को डेटा प्लेन कनेक्टिविटी देता है:

  • निजी नेटवर्क (वीपीसी): आउटबाउंड ट्रैफ़िक, जो एंटरप्राइज़ के इंटरनल एपीआई, माइक्रोसेवाओं, निजी वीपीसी में होस्ट किए गए डेटाबेस, और हाइब्रिड कनेक्टिविटी के ज़रिए ऐक्सेस किए जा सकने वाले कंपनी की इमारत में या क्रॉस-क्लाउड नेटवर्क को टारगेट करता है.
  • बाहरी नेटवर्क (इंटरनेट): आउटबाउंड ट्रैफ़िक, तीसरे पक्ष की वेब सेवाओं, SaaS API या सार्वजनिक एंडपॉइंट को टारगेट करता है.
  • एआई सेवाएं और एजेंट प्लैटफ़ॉर्म: मैनेज किए गए Google Cloud API, फ़ाउंडेशन मॉडल, Google MCP एंडपॉइंट (जैसे कि BigQuery), और प्लैटफ़ॉर्म गवर्नेंस सेवाओं (जैसे कि एजेंट रजिस्ट्री और IAP नीतियां) को टारगेट करने वाला आउटबाउंड ट्रैफ़िक.

figure3

तीसरी इमेज. एजेंट गेटवे से बाहर निकलने वाले ट्रैफ़िक की राउटिंग टोपोलॉजी

इस कोडलैब में, एजेंट रनटाइम पर मौजूद कस्टम एजेंट से आउटबाउंड ट्रैफ़िक पर फ़ोकस किया गया है. यह एजेंट, इंटरनेट पर ऐक्सेस किए जा सकने वाले तीसरे पक्ष के बाहरी एमसीपी सर्वर एंडपॉइंट को टारगेट करता है.

MCP प्रोटोकॉल की जांच

एजेंट गेटवे इग्रेस (agent-to-anywhere) में, एमसीपी अनुरोधों के कॉन्टेंट को पार्स करने की सुविधा होती है. साथ ही, यह फ़ाइन-ग्रेन्ड प्रोटोकॉल एट्रिब्यूट के आधार पर ऐक्सेस से जुड़ी नीतियों का आकलन कर सकता है. एजेंट से एमसीपी सर्वर पर भेजे जाने वाले इग्रेस डेटा ट्रैफ़िक के लिए बनी नीतियों में, कॉमन एक्सप्रेशन लैंग्वेज (सीईएल) में बताई गई शर्तें शामिल हो सकती हैं. ये शर्तें, हर अनुरोध पर रनटाइम के दौरान लागू की जाती हैं.

एमसीपी कॉल आम तौर पर, JSON-RPC वायर प्रोटोकॉल फ़ॉर्मैट और एचटीटीपी ट्रांसपोर्ट का इस्तेमाल करते हैं. एचटीटीपी बॉडी में मौजूद JSON पेलोड में, एमसीपी के जिस तरीके को लागू किया जा रहा है उसकी जानकारी (जैसे, tools/call), टारगेट टूल का नाम, और कोई भी तर्क शामिल होता है.

iap.googleapis.com/mcp.toolName एट्रिब्यूट को एजेंट गेटवे, JSON बॉडी को पार्स करके निकालता है. इससे अनुरोध में बताया गया टूल आइडेंटिफ़ायर मिलता है.

आम तौर पर, iap.googleapis.com/mcp.tool.isReadOnly और mcp.tool.isDestructive जैसे एट्रिब्यूट, हर अनुरोध के मुख्य हिस्से में नहीं भेजे जाते. इसके बजाय, ये टूल से जुड़े एनोटेशन (मेटाडेटा) होते हैं. इसलिए, जब एजेंट गेटवे, बॉडी से toolName को निकालता है, तो वह एजेंट रजिस्ट्री से टूल की परिभाषा और उससे जुड़ी प्रॉपर्टी ढूंढता है. एजेंट रजिस्ट्री में ही toolspec.json कॉन्टेंट रजिस्टर किया गया था.

figure4

चौथी इमेज. Agent Gateway MCP inspection

IAP IAM की शर्तों में इस्तेमाल किए गए CEL एक्सप्रेशन, स्टैंडर्ड फ़ॉर्मैट api.getAttribute('iap.googleapis.com/ATTRIBUTE_NAME', 'DEFAULT_VALUE')== 'DESIRED_VALUE' का इस्तेमाल करते हैं.

इस टेबल में, Agent Gateway के ऐसे एट्रिब्यूट के बारे में बताया गया है जिन्हें एमसीपी सर्वर के अनुरोधों पर लागू किया जा सकता है:

एट्रिब्यूट

MCP का तरीका / जगह की जानकारी

ब्यौरा

mcp.toolName

tools/call (बॉडी)

आरपीसी पेलोड में अनुरोध किया गया टारगेट टूल आइडेंटिफ़ायर (जैसे, "delete_instance")

mcp.tool.isReadOnly

एजेंट रजिस्ट्री (toolspec.json)

इससे पता चलता है कि टूल सिर्फ़ पढ़ने के लिए है या नहीं. इसका मतलब है कि टूल अपने एनवायरमेंट में बदलाव नहीं करता

mcp.tool.isDestructive

एजेंट रजिस्ट्री (toolspec.json)

इससे पता चलता है कि टूल को कॉल करने से, डेटा में ऐसे बदलाव हो सकते हैं जिन्हें पहले जैसा नहीं किया जा सकता या डेटा मिट सकता है

mcp.tool.isIdempotent

एजेंट रजिस्ट्री (toolspec.json)

इससे पता चलता है कि एक जैसे आर्ग्युमेंट के साथ टूल को बार-बार चलाने पर, क्या एक जैसी स्थिति मिलती है

mcp.tool.isOpenWorld

एजेंट रजिस्ट्री (toolspec.json)

इससे पता चलता है कि टूल, सीमित इंटरनल सिस्टम से लेकर असीमित पब्लिक इंटरनेट तक पहुंचता है या नहीं

यहां कॉन्सेप्ट वाला हिस्सा खत्म होता है... अब सेटअप सेक्शन पर जाएं.

3. सेटअप

ज़रूरी IAM भूमिकाएं

इस कोडलैब में संसाधन बनाने के लिए, इन भूमिकाओं की ज़रूरत होती है:

कैटगरी

ज़रूरी IAM भूमिका (आईडी)

ब्यौरा

एपीआई मैनेजमेंट

roles/serviceusage.serviceUsageAdmin

Google Cloud की एपीआई सेवाएं चालू करना

नेटवर्किंग और गेटवे

roles/networkservices.admin

एजेंट गेटवे को चालू करना

सेवा एक्सटेंशन

roles/serviceextensions.admin

रूटिंग एक्सटेंशन कॉन्फ़िगर करना

नेटवर्क सिक्योरिटी

roles/networksecurity.admin

अनुमति से जुड़ी नीतियां लागू करना

एजेंट रजिस्ट्री

roles/agentregistry.admin

कैटलॉग के लिए अनुमति मिला हुआ होस्ट

Vertex AI और एजेंट

roles/aiplatform.admin

एजेंट रनटाइम वर्कलोड डिप्लॉय करना

इग्रेस नीतियां

roles/iap.admin

roles/iap.egressor नीतियां लागू करना

Cloud Storage

roles/storage.admin

डिप्लॉयमेंट के लिए स्टेजिंग बकेट मैनेज करना

लॉग और ऑडिटिंग

roles/logging.viewer

ट्रेस और ऑडिट लॉग की जांच करना

इसके अलावा, 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

शेल एनवायरमेंट वैरिएबल सेट करना

# 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)
echo ${PROJ_ID}
echo ${PROJ_NO}
echo ${ORG_ID}
# 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-datacommons"
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_DISPLAY_NAME="api.datacommons.org"
export MCP_RESOURCE_NAME="${REGION}-datacommons-mcp"
export MCP_URL="https://api.datacommons.org/mcp"
echo ${AGW_NAME}
echo ${AGW_URI}
echo ${RE_AGENT_NAME}
echo ${RE_AGENT_ID_SET}
echo ${STAGING_BUCKET}
echo ${MCP_DISPLAY_NAME}
echo ${MCP_RESOURCE_NAME}
echo ${MCP_URL}
# create local dir for config files
mkdir -p cfg

अगर Google Cloud SDK को खुद से मैनेज किया जा रहा है (यानी कि 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

सेटअप का हिस्सा यहीं खत्म होता है... अब गेटवे सेक्शन पर जाएं.

4. गेटवे

ऐक्सेस कंट्रोल लागू करने से पहले, एजेंट गेटवे को डिप्लॉय करें. साथ ही, DRY_RUN मोड में इसके अनुमति एक्सटेंशन को कॉन्फ़िगर करें. इससे ऑडिट के लिए, आकलन के नतीजों को लॉग करते समय, आउटबाउंड टूल कॉल पूरे किए जा सकते हैं.

यहां Agent Gateway, क्षेत्रीय Agent Runtime संसाधनों के साथ काम करने के लिए, क्षेत्रीय रजिस्ट्री का इस्तेमाल करता है.

गेटवे बनाना

# create agent gateway config file (regional registry)
cat > cfg/${AGW_NAME}.yaml << EOF
name: ${AGW_NAME}
protocols:
  - MCP
googleManaged:
  governedAccessPath: AGENT_TO_ANYWHERE
registries:
  - "//agentregistry.googleapis.com/projects/${PROJ_ID}/locations/${REGION}"
EOF
# import agent gateway config file (create gateway)
gcloud network-services agent-gateways import ${AGW_NAME} \
  --source="cfg/${AGW_NAME}.yaml" \
  --location=${REGION}
# show agent gateway details (verify deployment state)
gcloud network-services agent-gateways describe ${AGW_NAME} \
  --location=${REGION}

गेटवे का हिस्सा यहीं खत्म होता है... अब अनुमति सेक्शन पर जाएं.

5. अनुमति देना

पहचान के बारे में जानकारी रखने वाली प्रॉक्सी (IAP) के लिए एजेंट गेटवे ऑथराइज़ेशन एक्सटेंशन, एक तरह का सेवा एक्सटेंशन है. इसका इस्तेमाल, सभी एजेंट प्लैटफ़ॉर्म कम्यूनिकेशन के लिए, ऑथराइज़ेशन से जुड़े फ़ैसले लेने के अधिकार को सौंपने के लिए किया जाता है.

  1. डेलिगेशन फ़्लो: जब कोई एजेंट किसी बाहरी एंडपॉइंट या एमसीपी सर्वर को चालू करने की कोशिश करता है, तो यह अनुरोध को एजेंट गेटवे पर भेज देता है. ऐक्सेस का आकलन स्थानीय तौर पर करने के बजाय, गेटवे, अनुमति देने वाले एक्सटेंशन का इस्तेमाल करके, IAP की आकलन सेवा को कॉलआउट भेजता है. आईएपी, एजेंट (एसपीआईएफ़ई पर आधारित) की पहचान की पुष्टि करता है. इसके लिए, एजेंट रजिस्ट्री में मौजूद टारगेट रिसॉर्स की आईएएम नीति का इस्तेमाल किया जाता है. IAP, गेटवे को ALLOW या DENY का फ़ैसला वापस भेजता है. इसके बाद, गेटवे ट्रैफ़िक को आगे भेजता है या एचटीटीपी 403 Forbidden स्टेटस कोड के साथ उसे ब्लॉक कर देता है.
  2. लागू करने के मोड: DRY_RUN मोड में, IAP अनुरोधों का आकलन करता है और Cloud Logging में फ़ैसलों को लॉग करता है. हालांकि, इस दौरान ट्रैफ़िक को ब्लॉक नहीं किया जाता. ENFORCE मोड में, बिना अनुमति वाले एजेंट से किए गए किसी भी अनुरोध या बिना रजिस्टर किए गए टारगेट को तुरंत ब्लॉक कर दिया जाता है.
  3. बाइंडिंग लेयर: सेवा एक्सटेंशन, Agent Gateway से कनेक्ट होता है. इसके लिए, REQUEST_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 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}
# show authz extension details (verify extension state)
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
# 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 (verify dry run mode)
gcloud beta network-security authz-policies describe ${AGW_NAME}-authz-policy-profile-iap \
  --location=${REGION}

ऑथराइज़ेशन से जुड़ा हिस्सा यहीं खत्म होता है... अब कोडबेस सेक्शन पर जाएं.

6. कोडबेस

इस कोडलैब के लिए इस्तेमाल किया गया एजेंट कोड और एंडपॉइंट रजिस्ट्रेशन स्क्रिप्ट, रिमोट Google Cloud GitHub रिपॉज़िटरी में सेव की जाती है. यहां दिया गया तरीका अपनाने से, रिपॉज़िटरी को लोकल तौर पर क्लोन किया जाएगा. साथ ही, ज़रूरी फ़ाइलों को मौजूदा वर्किंग डायरेक्ट्री स्ट्रक्चर में कॉपी किया जाएगा. इसके बाद, अस्थायी फ़ाइलों को मिटा दिया जाएगा.

एजेंट रनटाइम के लिए, स्टोरेज का एक स्टैगिंग बकेट बनाया जाता है. इसका इस्तेमाल, पैकेज किए गए एजेंट ऐप्लिकेशन कोड और उसकी डिपेंडेंसी आर्टफ़ैक्ट को अपलोड, बिल्ड, और डिप्लॉय करने के लिए किया जाता है.

रिमोट आर्टफ़ैक्ट फ़ेच करना

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

स्टेजिंग बकेट बनाना

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

कोडबेस का हिस्सा यहीं खत्म होता है... अब रजिस्ट्री सेक्शन पर जाएं.

7. रजिस्ट्री

एजेंट रजिस्ट्री, एआई के पूरे नेटवर्क में मौजूद सभी एजेंट, एमसीपी सर्वर, और एंडपॉइंट (एपीआई) की एक सेंट्रलाइज़्ड इन्वेंट्री होती है. यह एक कैटलॉग भी है. इसका इस्तेमाल, एआई ऐप्लिकेशन के लिए रजिस्टर किए गए अन्य टूल और सेवाओं को खोजने, उनकी सूची बनाने, और उन्हें ढूंढने के लिए किया जा सकता है. एजेंट गेटवे इग्रेस (agent-to-anywhere) मोड, इग्रेस ऐक्सेस कंट्रोल लागू करने के लिए, रजिस्ट्री डेटा मॉडल का इस्तेमाल करता है. प्रिंसिपल कॉलिंग एजेंट के लिए IAM रोल की अनुमतियों की जांच, रजिस्ट्री संसाधन से जुड़ी नीति के हिसाब से की जाती है.

एजेंट को अलग-अलग Google API और सेवाओं का इस्तेमाल करने की सुविधा देने के लिए, एनवायरमेंट को बूटस्ट्रैप किया जाता है. इसके लिए, एक स्क्रिप्ट का इस्तेमाल किया जाता है. यह स्क्रिप्ट, endpoints/googleapis.txt से होस्टनेम और लोकेशन का इस्तेमाल करके, एपीआई एंडपॉइंट के सामान्य सेट को तुरंत रजिस्टर करती है.

एंडपॉइंट रजिस्टर करना

# run python script to register google api endpoints
python3 endpoints/register_endpoints.py \
  --multi-region=${MREGION} \
  --region=${REGION} \
  --mtls-endpoints=include

एंडपॉइंट की पुष्टि करना

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

रजिस्ट्री वाला सेक्शन यहां खत्म होता है... अब Data Commons सेक्शन पर जाएं.

8. Data Commons

Data Commons, Google की एक पहल है. इसका मकसद सार्वजनिक डेटा सेट को व्यवस्थित करना है, ताकि कोई भी व्यक्ति उन्हें ऐक्सेस कर सके और उनका इस्तेमाल कर सके. यह एक मुफ़्त सेवा है. खाता बनाने के बाद, एपीआई कुंजी का इस्तेमाल करके इसे ऐक्सेस किया जा सकता है.

एपीआई पासकोड बनाना

खाता बनाने के बाद, एपीआई पासकोड पाने के लिए यह तरीका अपनाएं:

  • Data Commons API Portal में साइन इन करें
  • सबसे ऊपर दाएं कोने में मौजूद, "मेरे ऐप्लिकेशन" बटन पर क्लिक करें
  • सबसे ऊपर दाएं कोने में, अपने उपयोगकर्ता नाम के नीचे मौजूद "+ नया ऐप्लिकेशन" बटन पर क्लिक करें
  • अपने ऐप्लिकेशन को कोई नाम दें. उदाहरण के लिए, "Codelab Agent MCP"
  • Data Commons API के लिए, "चालू करें" बटन पर क्लिक करें api.datacommons.org
  • सबसे नीचे दाएं कोने में मौजूद, "सेव करें" बटन पर क्लिक करें

इससे एक एपीआई पासकोड और सीक्रेट पासकोड बनता है. "एपीआई पासकोड कॉपी करें" के लिए, पासकोड की वैल्यू के बगल में मौजूद "कॉपी करें" आइकॉन पर क्लिक करें. DC_API_KEY एनवायरमेंट वैरिएबल सेट करने के लिए, वैल्यू को टर्मिनल कमांड में चिपकाएं.

# set api key env var
 export DC_API_KEY="YOUR_API_KEY_HERE"

एमसीपी सर्वर बनाना toolspec

एमसीपी सर्वर को मैन्युअल तरीके से रजिस्टर करते समय, रजिस्ट्रेशन के दौरान टूल स्पेसिफ़िकेशन फ़ाइल शामिल करनी होगी. toolspec.json फ़ाइल अपलोड करने से, एंडपॉइंट पर उपलब्ध सभी टूल की सूची दिखती है. साथ ही, इससे अन्य उपयोगकर्ताओं को इन टूल के बारे में पता चलता है.

agent-datacommons/ कोडबेस में शामिल test_mcp.py स्क्रिप्ट, टारगेट एमसीपी सर्वर (एसएसई या एचटीटीपी पर) से कनेक्ट करके toolspec.json फ़ाइल जनरेट करती है. साथ ही, सर्वर से उपलब्ध कराए गए सभी टूल को वापस पाने के लिए, list_tools() को कॉल करती है.

# generate toolspec for registry ingestion
uv --directory agent-datacommons run python3 test_mcp.py --toolspec=include --token="${DC_API_KEY}"

जनरेट किए गए toolspec आउटपुट से पता चलता है कि एजेंट गेटवे, ईग्रेस नीति के आकलन और उसे लागू करने के लिए, एमसीपी एट्रिब्यूट का इस्तेमाल कर सकता है.

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

एमसीपी सर्वर रजिस्टर करना

# register mcp server
gcloud agent-registry services create ${MCP_RESOURCE_NAME} \
  --location=${REGION} \
  --display-name="${MCP_DISPLAY_NAME}" \
  --description="mcp server for data commons" \
  --mcp-server-spec-type=tool-spec \
  --mcp-server-spec-content=agent-datacommons/toolspec.json \
  --interfaces=url=${MCP_URL},protocolBinding=JSONRPC
# 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_RESOURCE_NAME} --location=${REGION}
# fetch mcp server registry id
export MCP_REGISTRY_ID=$(gcloud agent-registry services describe ${MCP_RESOURCE_NAME} \
  --location=${REGION} \
  --format="value(registryResource.basename())")
echo ${MCP_REGISTRY_ID}

Data Commons का हिस्सा यहीं खत्म होता है... अब रनटाइम सेक्शन पर चलते हैं.

9. रनटाइम

Agent Runtime में डिप्लॉय किए गए agent-datacommons ADK एजेंट को, Agent Platform के साथ इंटिग्रेट करने के लिए डिप्लॉयमेंट स्क्रिप्ट में इन सेटिंग के साथ कॉन्फ़िगर किया जाता है:

  • "identity_type": types.IdentityType.AGENT_IDENTITY एजेंट के लिए, SPIFFE पर आधारित यूनीक प्रिंसिपल आइडेंटिटी उपलब्ध कराने के लिए
  • "agent_gateway_config": { "agent_to_anywhere_config": {"agent_gateway": } } का इस्तेमाल करके, एजेंट की ओर से शुरू किए गए सभी आउटबाउंड ट्रैफ़िक को नीति के उल्लंघन का आकलन करने और उसे लागू करने के लिए, एजेंट गेटवे पर भेजें

एजेंट को डिप्लॉय करना

# deploy agent runtime workload
uv --directory agent-datacommons 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 data commons stats" \
  --enable-telemetry \
  --enable-agent-identity \
  --agent-gateway-egress=${AGW_URI} \
  --env-var="DC_API_KEY=${DC_API_KEY}"

डिप्लॉयमेंट की परफ़ॉर्मेंस से जुड़ी अहम जानकारी फ़ेच करना

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

10. नीतियां

एजेंट गवर्नेंस की अनुमति देने वाली नीतियां, एआई एजेंट से आने वाले ट्रैफ़िक को एजेंट गेटवे के ज़रिए डेस्टिनेशन तक पहुंचने की अनुमति देती हैं. जैसे, SaaS ऐप्लिकेशन के लिए तीसरे पक्ष का एमसीपी सर्वर एंडपॉइंट. जब ट्रैफ़िक डेस्टिनेशन तक पहुंच जाता है, तो सेवा-स्तर या ऐप्लिकेशन-स्तर की सामान्य अनुमतियां, डेटा ऐक्सेस करने की अनुमति देती हैं.

एजेंट गेटवे से डेटा बाहर भेजने के लिए IAM रोल की अनुमतियां, ऐक्सेस की ऐसी नीतियां लागू करती हैं जिनसे एजेंट प्रिंसिपल आइडेंटिटी को, रजिस्टर किए गए डेस्टिनेशन संसाधनों का ऐक्सेस मिल जाता है. यह ऐक्सेस, एजेंट गेटवे के ज़रिए मिलता है. नीतियों को एजेंट गेटवे लेवल पर लागू किया जाता है. साथ ही, Identity-Aware Proxy (IAP) की IAM नीतियों का इस्तेमाल करके इनकी पुष्टि की जाती है.

एजेंट गेटवे से बाहर निकलने के लिए, एजेंट को IAM भूमिकाएं असाइन करना

Agent Gateway, आने वाले अनुरोधों की जांच करता है. इससे यह पुष्टि की जाती है कि कॉल करने वाले एजेंट की पहचान की पुष्टि हो गई है और उसके पास टारगेट संसाधन पर iap.webServiceVersions.egressViaIAP अनुमति है. यह अनुमति, roles/iap.egressor की भूमिका के तहत दी जाती है.

चुने गए डेस्टिनेशन रिसॉर्स पर, एजेंट आइडेंटिटी या एजेंट रनटाइम प्रिंसिपल सेट को roles/iap.egressor की अनुमति देने से, इस इग्रेस ट्रैफ़िक की अनुमति मिल जाती है. इस कोडलैब में, मुख्य एजेंट को भूमिका असाइन की गई है. इससे, एजेंट रनटाइम के किसी एजेंट को पहचान करने की अनुमति मिलती है.

IAM नीतियां, डेस्टिनेशन रिसॉर्स से जुड़ी होती हैं. इनके बारे में एजेंट रजिस्ट्री के डेटा मॉडल में बताया गया है. iap_web/agentRegistry संसाधन, IAM हैरारकी में "रजिस्ट्री-वाइड" लेवल को दिखाता है. यहां agentRegistry, agents, mcpServers, और endpoints के लिए अलग-अलग चाइल्ड रिसॉर्स के पैरंट के तौर पर काम करता है. इस कोडलैब में, IAM नीति को mcpServer और endpoint लेवल से जोड़ा गया है. इससे, खास चाइल्ड रिसॉर्स के लिए अनुमति लागू होती है.

शर्त के हिसाब से एमसीपी फ़िल्टर करने के बारे में जानकारी

Data Commons के एमसीपी सर्वर में दो टूल होते हैं:

  • search_indicators: यह विकल्प, उपलब्ध डेटा के बारे में क्वेरी करने, वैरिएबल खोजने या डेटा कवरेज को समझने के लिए होता है
  • get_observations: इसका इस्तेमाल, खास डेटा पॉइंट या टाइम सीरीज़ को वापस पाने के लिए की गई क्वेरी के लिए किया जाता है

एमसीपी सर्वर पर शर्तों के साथ लागू होने वाली गवर्नेंस नीतियां कॉन्फ़िगर करते समय, एमसीपी की कुछ स्टैंडर्ड कार्रवाइयों के बारे में पता होना चाहिए. एमसीपी क्लाइंट को search_indicators या get_observations के लिए tools/call करने से पहले, उसे प्रोटोकॉल हैंडशेक और डिस्कवरी के अनुरोध भेजने होंगे:

  • initialize
  • notifications/initialized
  • tools/list

शर्त के हिसाब से नीति फ़िल्टर करने की सुविधा दिखाने के लिए, नीति को इन शर्तों के लिए कॉन्फ़िगर किया जाएगा:

टेबल. एमसीपी अनुरोधों के लिए नीति का आकलन

अनुरोध / तरीका

mcp.toolName मान

सीईएल का आकलन

नतीजा

initialize

""

"" in ['search_indicators', '']

✅ अनुमति है (200)

tools/list

""

"" in ['search_indicators', '']

✅ अनुमति है (200)

search_indicators

"search_indicators"

"search_indicators" in [...]

✅ अनुमति है (200)

get_observations

"get_observations"

"get_observations" in [...]

❌ DENIED (403)

प्रोटोकॉल हैंडशेक और search_indicators टूल कॉल की अनुमति देने के लिए, शर्त के साथ लागू होने वाले नीति के नियम में "search_indicators" या "" (खाली स्ट्रिंग) के लिए अनुमति देने का विकल्प शामिल होता है.

रजिस्ट्री के आईएपी एमसीपी सर्वर के लिए आईएएम नीति कॉन्फ़िगर करना

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

ध्यान दें: etag: को डिफ़ॉल्ट ACAB वैल्यू दिखानी चाहिए, क्योंकि अब तक कोई नीति तय नहीं की गई है.

# 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}
# create policy config file
cat > cfg/iap-policy-dc-agent-to-dc-mcp-tool-1.json << EOF
{
  "bindings": [
    {
      "role": "roles/iap.egressor",
      "members": [
        "${RE_AGENT_IDENTITY}"
      ],
      "condition": {
        "title": "allow ${RE_AGENT_NAME} to use search_indicators tool for ${MCP_DISPLAY_NAME}",
        "expression": "api.getAttribute('iap.googleapis.com/mcp.toolName', '') in ['search_indicators', '']"
      }
    }
  ],
  "etag": "${IAP_ETAG}",
  "version": 3
}
EOF
# import policy file (bind iam policy)
gcloud beta iap web set-iam-policy cfg/iap-policy-dc-agent-to-dc-mcp-tool-1.json \
  --resource-type=agent-registry \
  --mcp-server=${MCP_REGISTRY_ID} \
  --region=${REGION}
# verify iap iam policy for mcp server
gcloud beta iap web get-iam-policy \
  --region=${REGION} \
  --resource-type=agent-registry \
  --mcp-server=${MCP_REGISTRY_ID}

नीतियों से जुड़ा सेक्शन यहीं खत्म होता है... अब ऑडिट सेक्शन पर चलते हैं.

11. ऑडिट

Agent Gateway authorization एक्सटेंशन, DRY_RUN मोड में काम कर रहा है. आउटबाउंड अनुरोधों को देखा और लॉग किया जाता है, लेकिन उन्हें ब्लॉक नहीं किया जाता.

एजेंट की क्वेरी की जांच करना

Google Cloud Console के यूज़र इंटरफ़ेस (यूआई) के लिए ब्राउज़र विंडो खोलें और यहां जाएं:

  • Agent Platform → Agents → Deployments → agent-datacommons
  • प्लेग्राउंड टैब चुनें

इसके अलावा, इस टर्मिनल कमांड को गूंजें और एजेंट के प्लेग्राउंड पर जाने के लिए लिंक पर क्लिक करें:

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

कुछ टेस्ट क्वेरी सबमिट करें....

  • What data do you have on water quality in Zimbabwe?
  • Compare the life expectancy, economic inequality, and GDP growth for BRICS nations

पुष्टि करें कि क्वेरी के जवाब सही हैं.

ऑडिट लॉग का विश्लेषण करना

लॉग देखें और नीति के उल्लंघन की जांच करने के लिए, ड्राई-रन के तौर पर किए गए आकलन की जांच करें.

# list unique urls with http status and iap authorization result
gcloud logging read \
  "resource.type=\"networkservices.googleapis.com/Gateway\" \
  AND httpRequest.requestUrl:*" \
  --project=${PROJ_ID} \
  --limit=200 \
  --format="value(httpRequest.status, jsonPayload.authzPolicyInfo.result, httpRequest.requestUrl)" | sort -u
200     ALLOWED https://api.datacommons.org/mcp
200     ALLOWED https://cloudresourcemanager.googleapis.com:443/google.cloud.resourcemanager.v3.Projects/GetProject
200     ALLOWED https://telemetry.googleapis.com/v1/traces
200     ALLOWED https://${REGION}-aiplatform.googleapis.com/v1beta1/projects/${PROJ_ID}/locations/${REGION}/publishers/google/models/gemini-2.5-flash:generateContent
200     ALLOWED https://${REGION}-aiplatform.googleapis.com/v1beta1/projects/${PROJ_ID}/locations/${REGION}/reasoningEngines/${RE_ENGINE_ID}/sessions/${RE_SESSION_ID}
200     ALLOWED https://${REGION}-aiplatform.googleapis.com/v1beta1/projects/${PROJ_ID}/locations/${REGION}/reasoningEngines/${RE_ENGINE_ID}/sessions/${RE_SESSION_ID}:appendEvent
200     ALLOWED https://${REGION}-aiplatform.googleapis.com/v1beta1/projects/${PROJ_ID}/locations/${REGION}/reasoningEngines/${RE_ENGINE_ID}/sessions/${RE_SESSION_ID}/events
202     ALLOWED https://api.datacommons.org/mcp

रजिस्ट्री के IAP एंडपॉइंट की आईएएम नीति अपडेट करना

टेलीमेट्री एंडपॉइंट के लिए, एजेंट को डेटा बाहर भेजने की अनुमतियां देना

# set var for endpoint display name
export ENDPOINT_1_DISPLAY_NAME="telemetry.googleapis.com"
echo ${ENDPOINT_1_DISPLAY_NAME}
# fetch endpoint registry id
export ENDPOINT_1_REGISTRY_ID=$(gcloud agent-registry services list \
  --location=${REGION} \
  --filter="displayName=${ENDPOINT_1_DISPLAY_NAME}" \
  --format="value(registryResource.basename())")
echo ${ENDPOINT_1_REGISTRY_ID}
# create policy config file
cat > cfg/iap-policy-re-agent-to-ep-1.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-re-agent-to-ep-1.json \
  --resource-type=agent-registry \
  --endpoint=${ENDPOINT_1_REGISTRY_ID} \
  --region=${REGION}
# verify iap iam policy for telemetry endpoint
gcloud beta iap web get-iam-policy \
  --region=${REGION} \
  --resource-type=agent-registry \
  --endpoint=${ENDPOINT_1_REGISTRY_ID}

aiplatform एंडपॉइंट के लिए, एजेंट को डेटा बाहर भेजने की अनुमतियां देना

# set var for endpoint display name
export ENDPOINT_2_DISPLAY_NAME="${REGION}-aiplatform.googleapis.com"
echo ${ENDPOINT_2_DISPLAY_NAME}
# fetch endpoint registry id
export ENDPOINT_2_REGISTRY_ID=$(gcloud agent-registry services list \
  --location=${REGION} \
  --filter="displayName=${ENDPOINT_2_DISPLAY_NAME}" \
  --format="value(registryResource.basename())")
echo ${ENDPOINT_2_REGISTRY_ID}
# create policy config file
cat > cfg/iap-policy-re-agent-to-ep-2.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-re-agent-to-ep-2.json \
  --resource-type=agent-registry \
  --endpoint=${ENDPOINT_2_REGISTRY_ID} \
  --region=${REGION}
# verify iap iam policy for aiplatform endpoint
gcloud beta iap web get-iam-policy \
  --region=${REGION} \
  --resource-type=agent-registry \
  --endpoint=${ENDPOINT_2_REGISTRY_ID}

cloudresourcemanager एंडपॉइंट के लिए, एजेंट को डेटा बाहर भेजने की अनुमतियां देना

# set var for endpoint display name
export ENDPOINT_3_DISPLAY_NAME="cloudresourcemanager.googleapis.com"
echo ${ENDPOINT_3_DISPLAY_NAME}
# fetch endpoint registry id
export ENDPOINT_3_REGISTRY_ID=$(gcloud agent-registry services list \
  --location=${REGION} \
  --filter="displayName=${ENDPOINT_3_DISPLAY_NAME}" \
  --format="value(registryResource.basename())")
echo ${ENDPOINT_3_REGISTRY_ID}
# create policy config file
cat > cfg/iap-policy-re-agent-to-ep-3.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-re-agent-to-ep-3.json \
  --resource-type=agent-registry \
  --endpoint=${ENDPOINT_3_REGISTRY_ID} \
  --region=${REGION}
# verify iap iam policy for cloudresourcemanager endpoint
gcloud beta iap web get-iam-policy \
  --region=${REGION} \
  --resource-type=agent-registry \
  --endpoint=${ENDPOINT_3_REGISTRY_ID}

ऑडिट का यह हिस्सा यहीं खत्म होता है... अब लागू करें सेक्शन पर जाएं.

12. लागू करें

एजेंट, DRY_RUN मोड में गेटवे के ज़रिए अनुरोध कर सका. अनुमति देने की नीति को अपडेट करके, Agent Gateway IAP के लिए अनुमति देने वाले एक्सटेंशन को ENFORCE मोड में बदलें.

अनुमति देने वाले एक्सटेंशन को अपडेट करना

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

अनुमति देने की शर्तों की पुष्टि करना

कंसोल के यूज़र इंटरफ़ेस (यूआई) में, एजेंट Playground पर वापस जाएं.

टेस्ट के लिए एक और क्वेरी सबमिट करें (अनुमति वालेsearch_indicators टूल को चालू करने की कोशिश करें)...

  • What data topics do you have for Peru?

ध्यान दें कि Gemini के फ़ाउंडेशन मॉडल (${REGION}-aiplatform.googleapis.com/...), टेलीमेट्री एपीआई (telemetry.googleapis.com/...), और Data Commons एमसीपी सर्वर एंडपॉइंट (api.datacommons.org/mcp) को एजेंट के अनुरोध, एचटीटीपी 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)"

देखें कि कोई अनुरोध ब्लॉक न किया गया हो. गेटवे के ऑडिट लॉग में, एचटीटीपी 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
  )"
# 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
  )"

शर्त के साथ अस्वीकार किए जाने की पुष्टि करना

टेस्ट के लिए एक और क्वेरी सबमिट करें (अस्वीकार किया गयाget_observations टूल को चालू करने की कोशिश करें)...

  • What are the diabetes levels in Peru compared to Slovakia?

एजेंट सबसे पहले search_indicators को देखेगा. इसके बाद, get_observations का इस्तेमाल करने की कोशिश करेगा. हालांकि, ऐसा नहीं हो पाएगा और एजेंट का जवाब अधूरा रह जाएगा.

# 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
  )"
TIMESTAMP            STATUS  IAP_AUTHZ  MCP_METHOD                 TOOL_NAME          URL
YYYY-MM-DDTHH:MM:SS  403     DENIED     tools/call                 get_observations   https://api.datacommons.org/mcp
YYYY-MM-DDTHH:MM:SS          ALLOWED    tools/call                 get_observations   https://api.datacommons.org/mcp
YYYY-MM-DDTHH:MM:SS  403     DENIED     tools/call                 get_observations   https://api.datacommons.org/mcp
YYYY-MM-DDTHH:MM:SS  200     ALLOWED    tools/call                 search_indicators  https://api.datacommons.org/mcp
YYYY-MM-DDTHH:MM:SS  200     ALLOWED    tools/list                                    https://api.datacommons.org/mcp
YYYY-MM-DDTHH:MM:SS  202     ALLOWED    notifications/initialized                     https://api.datacommons.org/mcp

इससे यह पुष्टि होती है कि गवर्नेंस से जुड़ी नीति उम्मीद के मुताबिक काम कर रही है!

ध्यान दें कि दूसरी लाइन में, स्टेटस के तौर पर ब्लैंक और ALLOWED दिख रहा है. यह सेकंडरी कनेक्शन को बंद करने वाला लॉग इवेंट है. इसे एजेंट गेटवे ने तब भेजा था, जब 403 रिस्पॉन्स भेजने के बाद सॉकेट बंद किया गया था. ऐसा इसलिए, क्योंकि कनेक्शन बंद करने वाले इवेंट में रिस्पॉन्स स्टेटस कोड नहीं होते. इसलिए, httpRequest.status ब्लैंक है.

नीति उल्लंघन ठीक करने से जुड़ा सेक्शन यहां खत्म होता है... अब सफ़ाई सेक्शन पर चलते हैं.

13. साफ़-सफ़ाई सेवा

# delete agent
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 storage bucket
gcloud -q storage rm --recursive gs://${STAGING_BUCKET}

# next
# clear policy on mcp server
export IAP_ETAG=$(gcloud beta iap web get-iam-policy --resource-type=agent-registry --mcp-server=${MCP_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 \
  --mcp-server=${MCP_REGISTRY_ID} \
  --region=${REGION}

# next
# clear policy on endpoint 1
export IAP_ETAG=$(gcloud beta iap web get-iam-policy --resource-type=agent-registry --endpoint=${ENDPOINT_1_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_1_REGISTRY_ID} \
  --region=${REGION}

# next
# clear policy on endpoint 2
export IAP_ETAG=$(gcloud beta iap web get-iam-policy --resource-type=agent-registry --endpoint=${ENDPOINT_2_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_2_REGISTRY_ID} \
  --region=${REGION}

# next
# clear policy on endpoint 3
export IAP_ETAG=$(gcloud beta iap web get-iam-policy --resource-type=agent-registry --endpoint=${ENDPOINT_3_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_3_REGISTRY_ID} \
  --region=${REGION}

# next
# remove manual registry entry
gcloud -q agent-registry services delete ${MCP_RESOURCE_NAME} --location=${REGION}
# delete gateway resources
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}

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

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

# next
# clean up local working directories and generated configs
rm -rf cfg agent-datacommons endpoints

# end

सफ़ाई का काम यहीं खत्म होता है... अब निष्कर्ष पर आते हैं!

14. नतीजा

बधाई हो! आपने Agent Gateway का इस्तेमाल करके टूल ऐक्सेस करने वाले एजेंट के लिए, आउटबाउंड कम्यूनिकेशन को सफलतापूर्वक डिप्लॉय और मैनेज कर लिया है!

cosmopup

Cosmopup को Codelabs बहुत पसंद हैं!

आगे क्या करना है?

इस फ़ीडबैक फ़ॉर्म का इस्तेमाल करके, बेझिझक कोई टिप्पणी करें, सवाल पूछें या सुधार के बारे में बताएं

धन्यवाद!