Gemini Enterprise में, एजेंट रजिस्ट्री का इस्तेमाल करके निजी कस्टम एमसीपी सर्वर पर एजेंट गेटवे से इग्रेस डेटा ट्रैफ़िक

1. परिचय

इस कोडलैब में, agent-to-anywhere (इग्रेस) मोड में Agent Gateway का इस्तेमाल करके, Gemini Enterprise के लिए निजी और नियंत्रित इग्रेस कनेक्टिविटी के बारे में बताया गया है. आपको Gemini Enterprise ऐप्लिकेशन को कॉन्फ़िगर करना होगा, ताकि वह Cloud Run पर होस्ट किए गए कस्टम मॉडल कॉन्टेक्स्ट प्रोटोकॉल (एमसीपी) सर्वर को सुरक्षित तरीके से चालू कर सके. इसके लिए, आपको Private Service Connect (पीएससी) इंटरफ़ेस का इस्तेमाल करके, ट्रैफ़िक को एजेंट गेटवे के ज़रिए रूट करना होगा. इससे वीपीसी नेटवर्क में Google APIs के लिए पीएससी एंडपॉइंट से कनेक्ट किया जा सकेगा.

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

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

  • एजेंट रजिस्ट्री एंडपॉइंट की पुष्टि के साथ, इग्रेस (agent-to-anywhere) मोड में काम करने वाला एजेंट गेटवे
  • Cloud Run सेवा, एक निजी स्ट्रीम करने लायक एचटीटीपी एमसीपी सर्वर (--ingress=internal) को होस्ट कर रही है. यह सर्वर, एजेंट रजिस्ट्री में अपने टूल के स्पेसिफ़िकेशन के साथ रजिस्टर किया गया है
  • Agent Gateway के लिए, Identity-Aware Proxy (IAP) की अनुमति देने वाला एक्सटेंशन
  • एमसीपी टूल को अनुमति देने के लिए, IAM की यूनिफ़ाइड ऐक्सेस नीतियां (यूएपी) और CEL की शर्तें
  • Gemini Enterprise ऐप्लिकेशन, एजेंट गेटवे से जुड़ा होना चाहिए. साथ ही, यह एजेंट रजिस्ट्री से इंपोर्ट किए गए कस्टम एमसीपी सर्वर डेटा स्टोर से कनेक्ट होना चाहिए
  • Google APIs के लिए वीपीसी नेटवर्क संसाधन, Cloud DNS ज़ोन, और पीएससी एंडपॉइंट
  • एजेंट गेटवे के प्राइवेट वीपीसी इग्रेस के लिए पीएससी नेटवर्क अटैचमेंट
  • VPC ट्रैफ़िक को सुरक्षित रखने के लिए, Cloud Next Generation Firewall (NGFW) की नीति से जुड़े नियम

figure1

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

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

  • Cloud Run पर सोर्स से, स्ट्रीम की जा सकने वाली निजी एचटीटीपी एमसीपी सर्वर को डिप्लॉय करने का तरीका. साथ ही, एजेंट रजिस्ट्री में इसके एंडपॉइंट और टूल स्कीमा को रजिस्टर करने का तरीका
  • अनुपालन करने वाली रजिस्ट्री एंट्री के साथ एजेंट गेटवे को कॉन्फ़िगर करने और Gemini Enterprise ऐप्लिकेशन के टूल कॉल को गेटवे के ज़रिए रूट करने का तरीका
  • पीएससी नेटवर्क अटैचमेंट और इंटरफ़ेस का इस्तेमाल करके, प्राइवेट वीपीसी इग्रेस कैसे सेट अप करें
  • Identity-Aware Proxy (IAP) को Agent Gateway की अनुमति देने का तरीका
  • एमसीपी टूल के इस्तेमाल पर पाबंदी लगाने के लिए, destination.agent_registry.* और destination.is_registered CEL एट्रिब्यूट का इस्तेमाल करके, IAM की यूनिफ़ाइड ऐक्सेस नीतियां (यूएपी) कैसे बनाई और बाइंड की जाती हैं
  • Cloud Logging का इस्तेमाल करके, नीति लागू होने और नेटवर्क इग्रेस की पुष्टि कैसे करें

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

  • बिलिंग की सुविधा वाला Google Cloud प्रोजेक्ट
  • Gemini Enterprise का चालू लाइसेंस या 30 दिनों के लिए मुफ़्त में आज़माने की सुविधा
  • नेटवर्किंग सेवाएं, Gemini Enterprise, और एजेंट प्लैटफ़ॉर्म के संसाधनों को चालू करने के लिए, आईएएम अनुमतियां
  • Google Cloud सीएलआई (gcloud), curl, और jq इंस्टॉल किया गया हो. साथ ही, POSIX के साथ काम करने वाला शेल (bash या zsh) हो

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

2. कॉन्सेप्ट

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

इस कोडलैब में, सबसे पहले इन्फ़्रास्ट्रक्चर को डिप्लॉय किया जाता है, ताकि एमसीपी टूल को Gemini Enterprise के साथ रजिस्टर और कनेक्ट करने से पहले, निजी नेटवर्क पाथ और गवर्नेंस कंट्रोल काम कर सकें:

  1. नेटवर्क इन्फ़्रास्ट्रक्चर: वीपीसी सबनेट, पीएससी एंडपॉइंट, पीएससी नेटवर्क अटैचमेंट, Cloud NGFW नीति के नियम, और निजी Cloud DNS ज़ोन उपलब्ध कराएं.
  2. एजेंट गेटवे: एजेंट रजिस्ट्री इंटिग्रेशन (registries) और प्राइवेट वीपीसी इग्रेस (networkAttachment) के साथ, एजेंट गेटवे को इग्रेस मोड में डिप्लॉय करें.
  3. अनुमति देने से जुड़ी नीतियां: destination.is_registered और destination.agent_registry.* CEL की शर्तों का इस्तेमाल करके, IAP की अनुमति देने वाले एक्सटेंशन, गेटवे की अनुमति देने से जुड़ी नीति, और IAM की यूनीफ़ाइड ऐक्सेस नीति (यूएपी) को कॉन्फ़िगर करें.
  4. एमसीपी सर्वर डिप्लॉय और रजिस्टर करें: सोर्स से Cloud Run (--ingress=internal) पर गणित से जुड़ा एमसीपी सर्वर डिप्लॉय करें. साथ ही, एजेंट रजिस्ट्री में सेवा और टूल की खास जानकारी (add और subtract) रजिस्टर करें.
  5. Gemini Enterprise ऐप्लिकेशन: Gemini Enterprise ऐप्लिकेशन (Engine) बनाएं, पहचान और निगरानी से जुड़ी सेटिंग कॉन्फ़िगर करें, और आउटबाउंड इग्रेस को एजेंट गेटवे (agentGatewaySetting) से बाइंड करें.
  6. कस्टम एमसीपी डेटा कनेक्टर इंपोर्ट करें: रजिस्टर किए गए एमसीपी सर्वर के बैकिंग डेटा स्टोर को Gemini Enterprise ऐप्लिकेशन से लिंक करने के लिए, REGISTRY_MCP डेटा कनेक्टर (:setUpDataConnector) बनाएँ और उसे चालू करें.
  7. पुष्टि करें: चैट में टूल के इस्तेमाल की अनुमति देने और अनुमति न देने की जांच करें. साथ ही, Agent Gateway, DNS, फ़ायरवॉल, और Cloud Run के लॉग में नीति लागू होने की पुष्टि करें.

Gemini Enterprise से डेटा बाहर भेजने की सुविधा

Gemini Enterprise, कस्टम एमसीपी सर्वर टूल के अनुरोधों को Agent Gateway पर तब रूट करता है, जब Engine पर agentGatewaySetting और DataConnector पर use_agent_gateway_egress: true, दोनों कॉन्फ़िगर किए गए हों.

figure2

दूसरी इमेज. Gemini Enterprise के डेटा को बाहर भेजने का आर्किटेक्चर

Gemini Enterprise ऐप्लिकेशन, टूल को चार मुख्य कैटगरी में व्यवस्थित करता है:

  1. विजेट (default_search_widget_config):
    • यह वेब क्लाइंट इंटरफ़ेस को दिखाता है. विजेट को उपयोगकर्ता से प्रॉम्प्ट मिलते हैं और यह चैट सेशन शुरू करता है.
  2. Core Assistant (assistants/default_assistant/agents/default/core_assistant):
    • यह इंजन में बातचीत के आधार पर तर्क देने वाला मुख्य एजेंट होता है. उपयोगकर्ता के सवाल का आकलन करते समय, Core Assistant यह तय करता है कि अंकगणित की गणना की ज़रूरत है या नहीं. साथ ही, उपलब्ध टूल की जांच करता है और काम को सिंथेसाइज़ किए गए Agent Gateway के सब-एजेंट को सौंपता है.
  3. डेटा स्टोर और डेटा कनेक्टर:
    • DataStore: :setUpDataConnector के चलने पर, इसे एक खास Collection में उपलब्ध कराया जाता है. यह इंपोर्ट किए गए एजेंट रजिस्ट्री टूल के स्कीमा (add, subtract), तर्क के टाइप, और एजेंट के निर्देशों को Gemini Enterprise Engine से लिंक (dataStoreIds) करता है.
    • DataConnector: यह रिमोट एमसीपी सर्वर (instance_uri) से REGISTRY_MCP ऐक्शन कनेक्शन (createBapConnection: true) को मैनेज करता है. साथ ही, एजेंट रजिस्ट्री एमसीपी सर्वर रिसॉर्स (registry_mcp_server_name) को हल करता है और एजेंट गेटवे इग्रेस (use_agent_gateway_egress: true) को चालू करता है.
  4. एजेंट की पहचान, एजेंट रजिस्ट्री, और एजेंट गेटवे:
    • जब डेटा कनेक्टर, आउटबाउंड टूल कॉल को डिसपैच करता है, तो वह ट्रैफ़िक को agentGatewaySetting में बताए गए गेटवे पर भेजता है. Core Assistant, SPIFFE आइडेंटिटी टोकन बनाता है. इससे उसकी पहचान की पुष्टि होती है: principal://agents.global.org-.../agents/default/core_assistant.
    • एजेंट गेटवे, एजेंट रजिस्ट्री के साथ इंटिग्रेट होता है. इसके लिए, registries फ़ील्ड का इस्तेमाल किया जाता है, ताकि डेस्टिनेशन एंडपॉइंट और रजिस्टर किए गए टूल स्कीमा को डाइनैमिक तरीके से हल किया जा सके. यह destination.is_registered और destination.agent_registry.* एट्रिब्यूट भरता है. साथ ही, इन्हें IAP v2 को पास करता है. इससे, वीपीसी नेटवर्क में ट्रांज़िट करने की अनुमति देने से पहले, IAM की यूनिफ़ाइड ऐक्सेस पॉलिसी (यूएपी) के सीएलई नियमों के हिसाब से इनका आकलन किया जा सकता है.

गेटवे वीपीसी कनेक्टिविटी

एजेंट गेटवे, दो YAML फ़ील्ड का इस्तेमाल करके निजी वीपीसी नेटवर्क कनेक्टिविटी चालू करता है:

  • networkConfig.egress.networkAttachment: यह प्राइवेट आईपी ट्रैफ़िक को पीएससी नेटवर्क अटैचमेंट के ज़रिए वीपीसी नेटवर्क में रूट करता है.
  • dnsPeeringConfig.domains: पीयर, वीपीसी नेटवर्क के Cloud DNS ज़ोन के साथ डीएनएस रिज़ॉल्यूशन करता है. इससे टारगेट होस्टनेम (*.run.app), वीपीसी नेटवर्क में तय किए गए निजी पीएससी एंडपॉइंट के आईपी पते पर रिज़ॉल्व हो जाते हैं.

सीमाएं और ज़रूरी शर्तें

  • सिर्फ़ StreamableHTTP के लिए: लेगसी Server-Sent Events (SSE) ट्रांसपोर्ट काम नहीं करता. एमसीपी सर्वर को StreamableHTTP का इस्तेमाल करना होगा.
  • Public CA TLS ज़रूरी है: एमसीपी एंडपॉइंट को Public CA से हस्ताक्षर किए गए टीएलएस सर्टिफ़िकेट का इस्तेमाल करना होगा. भले ही, उन्हें पीएससी पर निजी तौर पर ऐक्सेस किया गया हो.
  • संगठन की नीति को अनदेखा करना: डेटा स्टोर रजिस्टर करने से पहले, आपको कस्टम एमसीपी डेटा स्टोर के लिए संगठन की नीति को अनदेखा करना होगा.

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

3. सेटअप

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

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

डोमेन

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

प्रोजेक्ट और IAM

roles/orgpolicy.policyAdmin
roles/resourcemanager.projectIamAdmin
roles/iam.accessPolicyAdmin
roles/serviceusage.serviceUsageAdmin
roles/iam.serviceAccountUser

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

roles/networkservices.admin
roles/networksecurity.admin
roles/serviceextensions.admin
roles/compute.networkAdmin
roles/dns.admin

Gemini Enterprise और रजिस्ट्री

roles/discoveryengine.admin
roles/agentregistry.admin (या roles/apphub.admin)

वर्कलोड और बिल्ड

roles/run.admin
roles/cloudbuild.builds.editor
roles/artifactregistry.writer
roles/storage.admin

जांचने की क्षमता

roles/logging.viewer
roles/logging.logWriter

इसके अलावा, roles/orgpolicy.policyAdmin के साथ roles/owner जैसी कोई बुनियादी भूमिका इस्तेमाल करें. ऐसा इसलिए, क्योंकि 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"

echo ${SLUG}
echo ${REGION}
# 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 for agent platform (automatic)
export AGW_NAME="agw-${SLUG}-${REGION}-ata"
export AGW_URI="projects/${PROJ_ID}/locations/${REGION}/agentGateways/${AGW_NAME}"
export UAP_POLICY_NAME="uap-policy-${SLUG}"
export UAP_BINDING_NAME="uap-binding-${SLUG}"
export MCP_NAME="math-wizard"
export MCP_URL="https://${MCP_NAME}-${PROJ_NO}.${REGION}.run.app/mcp"

echo ${AGW_NAME}
echo ${AGW_URI}
echo ${UAP_POLICY_NAME}
echo ${UAP_BINDING_NAME}
echo ${MCP_NAME}
echo ${MCP_URL}
# create resource vars for gemini enterprise (automatic)
export GE_APP_DISPLAY_NAME="Codelab app"
export GE_APP_ORG_NAME="${SLUG}, Inc."
export GE_LOCATION="global"
export GE_APP_NAME="app-${SLUG}-${GE_LOCATION}"
export GE_APP_INIT="${GE_APP_NAME}_$(date +%s)"

echo ${GE_APP_DISPLAY_NAME}
echo ${GE_APP_ORG_NAME}
echo ${GE_LOCATION}
echo ${GE_APP_NAME}
echo ${GE_APP_INIT}

एजेंट की पहचान के लिए भरोसेमंद डोमेन सेट करना

if-then-else स्टेटमेंट से यह पता चलता है कि प्रोजेक्ट किसी संगठन का है या नहीं. इससे प्रिंसिपल एजेंट की पहचान के लिए सही भरोसेमंद डोमेन सेट किया जा सकता है.

# set var for trust domain
if [[ -n "${ORG_ID}" ]]; then
  export TRUST_DOMAIN="agents.global.org-${ORG_ID}.system.id.goog"
else
  export TRUST_DOMAIN="agents.global.proj-${PROJ_NO}.system.id.goog"
fi

echo "trust domain: ${TRUST_DOMAIN}"

बिलिंग और कोटा प्रोजेक्ट सेट करना

# set cli quota project
gcloud config set billing/quota_project ${PROJ_ID}
# set api quota project
gcloud auth application-default set-quota-project ${PROJ_ID}

कॉन्फ़िगरेशन फ़ाइलों के लिए लोकल डायरेक्ट्री बनाना

# create config folder
mkdir -p cfg

अगर Google Cloud SDK को खुद से मैनेज किया जा रहा है (यानी कि Cloud Shell के बाहर), तो कॉम्पोनेंट को नए वर्शन में अपडेट करें.

# update gcloud cli
gcloud components update

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

# enable google apis (part 1)
gcloud services enable \
  agentregistry.googleapis.com \
  agentidentity.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 \
  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 (part 2)
gcloud services enable \
  artifactregistry.googleapis.com \
  cloudbuild.googleapis.com \
  discoveryengine.googleapis.com \
  dns.googleapis.com \
  orgpolicy.googleapis.com \
  run.googleapis.com \
  saasservicemgmt.googleapis.com \
  securitycenter.googleapis.com \
  storage.googleapis.com \
  telemetry.googleapis.com \
  texttospeech.googleapis.com

संगठन की नीतियां

Google Cloud की डिफ़ॉल्ट मैनेज की गई संगठन की नीति की शर्तों के तहत, इस कोडलैब में इस्तेमाल की गई सुविधाओं पर पाबंदी लगाई गई है:

  • discoveryengine.managed.disableCustomMcpServerConnector:
    • यह सेटिंग, कस्टम एमसीपी सर्वर (custom_mcp) को डेटा सोर्स के तौर पर इस्तेमाल करने वाले डेटा कनेक्टर बनाने पर पाबंदी लगाती है. यह सेटिंग डिफ़ॉल्ट रूप से लागू होती है.
  • iam.managed.disableAccessPolicyBinding:
    • यह नीति, IAM v3 की ऐक्सेस नीति के बाइंडिंग को संसाधनों तक सीमित करती है. यह डिफ़ॉल्ट रूप से लागू होती है.
  • discoveryengine.managed.allowedEgressFqdns:
    • जब वीपीसी सर्विस कंट्रोल (VPC-SC) चालू हो या प्रोजेक्ट को संगठन के enforcedProjects पैरामीटर में शामिल किया गया हो, तब यह कुकी डेटा कनेक्टर के लिए आउटबाउंड इग्रेस डोमेन (instance_uri FQDN) को सीमित करती है.
  • discoveryengine.managed.allowedDataSources:
    • वीपीएसी-एससी चालू होने पर या प्रोजेक्ट को संगठन के enforcedProjects पैरामीटर में शामिल किए जाने पर, डेटा कनेक्टर के इस्तेमाल की अनुमति वाले टाइप (dataSource) को सीमित करता है.

प्रोजेक्ट लेवल पर, संगठन की नीति से जुड़ी पाबंदियों को ओवरराइड करें. इसके लिए, enforce: false को साफ़ तौर पर सेट करें.

कस्टम एमसीपी की पाबंदी बंद करना

# disable data connector constraint (allow custom mcp servers)
gcloud org-policies set-policy /dev/stdin << EOF
name: projects/${PROJ_NO}/policies/discoveryengine.managed.disableCustomMcpServerConnector
spec:
  rules:
  - enforce: false
EOF
# verify org policy constraint on project
gcloud org-policies describe discoveryengine.managed.disableCustomMcpServerConnector \
  --project=${PROJ_ID} --effective

ऐक्सेस की नीति से जुड़ी पाबंदी को बंद करना

# disable iam v3 constraint (allow v3 access policies)
gcloud org-policies set-policy /dev/stdin << EOF
name: projects/${PROJ_NO}/policies/iam.managed.disableAccessPolicyBinding
spec:
  rules:
  - enforce: false
EOF
# verify org policy constraint on project
gcloud org-policies describe iam.managed.disableAccessPolicyBinding \
  --project=${PROJ_ID} --effective

कंडिशनल डेटा कनेक्टर की पाबंदियों की जांच करना और उन्हें बंद करना

डिफ़ॉल्ट रूप से, discoveryengine.managed.allowedEgressFqdns और discoveryengine.managed.allowedDataSources सिर्फ़ तब कनेक्टर बनाने की सुविधा को ब्लॉक करते हैं, जब आपका प्रोजेक्ट वीपीसी सर्विस कंट्रोल (वीपीसी एससी) पेरीमीटर के अंदर हो या किसी संगठन के एडमिन ने आपके प्रोजेक्ट को enforcedProjects में जोड़ा हो.

सबसे पहले, अपने प्रोजेक्ट पर लागू होने वाली नीतियों की जांच करें:

# check effective egress fqdn constraint on project
gcloud org-policies describe discoveryengine.managed.allowedEgressFqdns \
  --project=${PROJ_ID} --effective
# check effective data source constraint on project
gcloud org-policies describe discoveryengine.managed.allowedDataSources \
  --project=${PROJ_ID} --effective

~~IF~~ ये पाबंदियां लागू हैं, तो यह पक्का करने के लिए कि ये VPC SC या नीति से जुड़ी पाबंदियों वाले संगठन में custom_mcp कनेक्टर के सेटअप को ब्लॉक न करें, अपने प्रोजेक्ट के लिए दोनों नीतियों पर enforce: false सेट करें:

# disable egress fqdn constraint on project
gcloud org-policies set-policy /dev/stdin << EOF
name: projects/${PROJ_NO}/policies/discoveryengine.managed.allowedEgressFqdns
spec:
  rules:
  - enforce: false
EOF
# disable allowed data sources constraint on project
gcloud org-policies set-policy /dev/stdin << EOF
name: projects/${PROJ_NO}/policies/discoveryengine.managed.allowedDataSources
spec:
  rules:
  - enforce: false
EOF
# verify both constraints are disabled on project
gcloud org-policies describe discoveryengine.managed.allowedEgressFqdns \
  --project=${PROJ_ID} --effective

gcloud org-policies describe discoveryengine.managed.allowedDataSources \
  --project=${PROJ_ID} --effective

IAM अनुमतियां

अपने उपयोगकर्ता खाते और Cloud Build के लिए इस्तेमाल किए जाने वाले Compute Engine के डिफ़ॉल्ट सेवा खाते को, आईएएम की ज़रूरी भूमिकाएं असाइन करें:

  • उपयोगकर्ता खाता (${USER_IDENTITY}):
    • इसके लिए, Cloud Run सेवाओं (roles/run.admin, roles/run.invoker, roles/iam.serviceAccountUser) को डिप्लॉय और लागू करने, कंटेनर इमेज (roles/cloudbuild.builds.editor) बनाने, Gemini Enterprise (roles/discoveryengine.admin) को मैनेज करने, और यूनिफ़ाइड ऐक्सेस नीतियां (roles/iam.accessPolicyAdmin) बनाने की अनुमतियां ज़रूरी हैं.
  • Compute Engine का डिफ़ॉल्ट सेवा खाता(${PROJ_NO}-compute@developer.gserviceaccount.com):
    • इस कुकी का इस्तेमाल Cloud Build करता है. इससे Cloud Storage (roles/storage.admin) में सोर्स कोड को स्टेज किया जाता है, Artifact Registry (roles/artifactregistry.writer) में इमेज पुश की जाती हैं, और बिल्ड लॉग (roles/logging.logWriter) लिखे जाते हैं.

भूमिकाएं असाइन करने के लिए, ये कमांड चलाएं:

# grant roles to user account
gcloud projects add-iam-policy-binding ${PROJ_ID} \
  --member="user:${USER_IDENTITY}" \
  --role="roles/run.admin"

gcloud projects add-iam-policy-binding ${PROJ_ID} \
  --member="user:${USER_IDENTITY}" \
  --role="roles/iam.serviceAccountUser"

gcloud projects add-iam-policy-binding ${PROJ_ID} \
  --member="user:${USER_IDENTITY}" \
  --role="roles/run.invoker"

gcloud projects add-iam-policy-binding ${PROJ_ID} \
  --member="user:${USER_IDENTITY}" \
  --role="roles/discoveryengine.admin"

gcloud projects add-iam-policy-binding ${PROJ_ID} \
  --member="user:${USER_IDENTITY}" \
  --role="roles/iam.accessPolicyAdmin"

gcloud projects add-iam-policy-binding ${PROJ_ID} \
  --member="user:${USER_IDENTITY}" \
  --role="roles/cloudbuild.builds.editor"
# grant roles to default compute (cloud build) service account
gcloud projects add-iam-policy-binding ${PROJ_ID} \
  --member="serviceAccount:${PROJ_NO}-compute@developer.gserviceaccount.com" \
  --role="roles/storage.admin"

gcloud projects add-iam-policy-binding ${PROJ_ID} \
  --member="serviceAccount:${PROJ_NO}-compute@developer.gserviceaccount.com" \
  --role="roles/artifactregistry.writer"

gcloud projects add-iam-policy-binding ${PROJ_ID} \
  --member="serviceAccount:${PROJ_NO}-compute@developer.gserviceaccount.com" \
  --role="roles/logging.logWriter"

IAM अनुमतियों की पुष्टि करना

उपयोगकर्ता खाते पर छह (6) भूमिकाओं के बाइंडिंग की जांच करें.

# show iam policy on project for user account
gcloud projects get-iam-policy ${PROJ_ID} \
  --flatten="bindings[].members" \
  --filter="bindings.members:${USER_IDENTITY}" \
  --format="table(bindings.role:label=ROLE, bindings.members:label=PRINCIPAL_IDENTITY)"

Compute के डिफ़ॉल्ट सेवा खाते पर, तीन (3) भूमिकाओं के बाइंडिंग की जांच करें.

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

सेवा एजेंट के बाइंडिंग की पुष्टि करें (एहतियाती तौर पर)

नए प्रोजेक्ट में, networkservices.googleapis.com को पहली बार चालू करने पर, Google Cloud अपने-आप Agent Gateway सेवा एजेंट को उपलब्ध कराता है और उसे roles/agentgateway.serviceAgent की अनुमति देता है. अगर किसी ऐसे मौजूदा प्रोजेक्ट का फिर से इस्तेमाल किया जा रहा है जिसमें पहले की गई क्लीनअप प्रोसेस की वजह से, डिफ़ॉल्ट सेवा एजेंट के बाइंडिंग हटा दिए गए हैं, तो यह पक्का करने के लिए कि पहचान और भूमिका की बाइंडिंग बरकरार हैं, फ़ेल-सेफ़ के तौर पर ये कमांड चलाएं:

# ensure network services service account has been created
gcloud beta services identity create \
  --service=networkservices.googleapis.com \
  --project="${PROJ_ID}"

# ensure network services service account has service agent roles applied
gcloud projects add-iam-policy-binding "${PROJ_ID}" \
  --member="serviceAccount:service-${PROJ_NO}@gcp-sa-agentgateway.iam.gserviceaccount.com" \
  --role="roles/agentgateway.serviceAgent"

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

4. नेटवर्क

इस सेक्शन में, कस्टम मोड का इस्तेमाल करके वीपीसी नेटवर्क डिप्लॉय किया जाएगा. इसमें एक डेडीकेटेड /28 सबनेट (192.168.10.0/28) होगा. यह पीएससी नेटवर्क अटैचमेंट के साथ काम करेगा. इससे एजेंट गेटवे नेटवर्क से वीपीसी नेटवर्क में नेटवर्क इग्रेस किया जा सकेगा.

Google APIs के लिए पीएससी एंडपॉइंट को एक /32ग्लोबल इंटरनल IPv4 पते (172.16.20.20) का इस्तेमाल करके डिप्लॉय किया जाता है. इससे Google APIs और सेवाओं को निजी तौर पर ऐक्सेस किया जा सकता है. इस कोडलैब में, एजेंट गेटवे, Cloud DNS पियरिंग की मदद से run.app. डोमेन को हल करके, पीएससी एंडपॉइंट का इस्तेमाल करके Cloud Run को टारगेट करता है.

नेटवर्क बनाना

ग्लोबल वीपीसी नेटवर्क बनाएं.

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

Agent Gateway PSC नेटवर्क अटैचमेंट के लिए सबनेट बनाएं:

# 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

फ़ायरवॉल के नियम बनाना

लॉगिंग की सुविधा चालू करके, सभी इग्रेस ट्रैफ़िक की अनुमति देने के लिए फ़ायरवॉल नीति बनाएं. इसका इस्तेमाल, एजेंट गेटवे से वीपीसी नेटवर्क पर जाने वाले ट्रैफ़िक को मॉनिटर करने के लिए किया जाएगा. Cloud NGFW, नेटवर्क सुरक्षा और ट्रैफ़िक मॉनिटरिंग के लिए Essentials और Standard, दोनों टियर के साथ काम करता है.

# 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
# bind fw policy to network
gcloud compute network-firewall-policies associations create \
  --name=fw-policy-bind-${SLUG} \
  --firewall-policy=fw-policy-${SLUG} \
  --network=vnet-${SLUG} \
  --global-firewall-policy

पीएसएसी नेटवर्क अटैचमेंट बनाना

Private Service Connect (PSC) नेटवर्क अटैचमेंट बनाएं. इसे इस तरह कॉन्फ़िगर करें कि यह एजेंट गेटवे से मिलने वाले कनेक्शन को अपने-आप स्वीकार कर ले. नेटवर्क अटैचमेंट, कंज्यूमर वीपीसी नेटवर्क के कनेक्शन को सेट अप करता है, ताकि आउटबाउंड इग्रेस ट्रैफ़िक के लिए, एजेंट गेटवे प्रोड्यूसर के साथ सुरक्षित तरीके से लिंक किया जा सके. सबनेट की ज़रूरी शर्तों और आईपी पते की रेंज के बारे में ज़्यादा जानने के लिए, वीपीसी कनेक्टिविटी कॉन्फ़िगर करना लेख पढ़ें.

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

पीएसटीएन कैरियर के नेटवर्क अटैचमेंट की पुष्टि करना

# show psc network attachment details
gcloud compute network-attachments describe psc-na-${REGION}-agw --region=${REGION}

पीएसटी नेटवर्क अटैचमेंट का संसाधन यूआरआई पाएं और उसे PSC_NA_URI एनवायरमेंट वैरिएबल में सेव करें. इस यूआरआई का रेफ़रंस, एजेंट गेटवे कॉन्फ़िगरेशन (networkConfig.egress.networkAttachment) में दिया जाएगा. इससे वीपीसी नेटवर्क में नेटवर्क इग्रेस के लिए, पीएससी इंटरफ़ेस को प्रोविज़न किया जा सकेगा:

# fetch psc network attachment 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}

पीएससी एंडपॉइंट बनाना

Google APIs के लिए Private Service Connect (PSC) एंडपॉइंट का इस्तेमाल, Agent Gateway के लिए किया जाता है. इससे Cloud Run MCP सर्वर से इंटरनल नेटवर्क पाथ पर प्राइवेट कनेक्टिविटी सेट अप की जा सकती है. इससे ट्रैफ़िक को सार्वजनिक इंटरनेट पर नहीं भेजा जाता. एजेंट गेटवे से वीपीसी नेटवर्क में जाने वाले आउटबाउंड टूल कॉल, टारगेट Cloud Run सेवा के यूआरएल (*.run.app) को इस प्राइवेट एंडपॉइंट आईपी पते पर हल करेंगे.

पीएससी एंडपॉइंट के लिए, ग्लोबल इंटरनल IPv4 पता रिज़र्व करें. चुना गया आईपी पता, ऐसा /32 पता होना चाहिए जो आपके वीपीसी नेटवर्क में मौजूद किसी भी सबनेट से मेल न खाता हो:

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

all-apis बंडल का इस्तेमाल करके, Google API के लिए पीएससी एंडपॉइंट बनाएं. इसमें 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

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

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

डीएनएस ज़ोन और रिकॉर्ड बनाना

Cloud DNS का इस्तेमाल, Cloud Run पर होस्ट किए गए एमसीपी सर्वर के साथ निजी तौर पर कम्यूनिकेट करने के लिए, एजेंट गेटवे को चालू करने के लिए किया जाता है. जब एजेंट गेटवे, Cloud Run को टारगेट करने वाले आउटबाउंड टूल के अनुरोधों का आकलन करता है, तो वह *.run.app के लिए डीएनएस क्वेरी को हल करने के लिए, डीएनएस पीयरिंग (dnsPeeringConfig.domains) का इस्तेमाल करता है. इसके लिए, वह आपके वीपीसी नेटवर्क से जुड़े निजी Cloud DNS ज़ोन का इस्तेमाल करता है. निजी डीएनएस रिकॉर्ड, क्वेरी को इंटरनल पीएससी एंडपॉइंट आईपी पते (172.16.20.20) के साथ दिखाता है. इससे एमसीपी टूल के अनुरोधों को निजी नेटवर्क पाथ से रूट किया जा सकता है.

run.app. डोमेन के लिए, Cloud DNS का मैनेज किया गया प्राइवेट ज़ोन बनाएं:

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

पीएससी एंडपॉइंट के आईपी पते पर ले जाने वाले *.run.app. के लिए, वाइल्डकार्ड डीएनएस A रिकॉर्ड बनाएं:

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

डीएनएस क्वेरी लॉगिंग की सुविधा चालू करने के लिए, Cloud DNS नीति बनाएं. डीएनएस लॉगिंग, आपके वीपीसी नेटवर्क में मौजूद एजेंट गेटवे से मिले डोमेन रिज़ॉल्यूशन के अनुरोधों को कैप्चर करती है. इससे ऑडिट करने की सुविधा मिलती है. साथ ही, यह पुष्टि की जा सकती है कि *.run.app टूल के अनुरोध, इंटरनल पीएससी एंडपॉइंट पर सही तरीके से हल हो रहे हैं:

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

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

5. एजेंट गेटवे

एजेंट गेटवे, एजेंट रजिस्ट्री इंस्टेंस के लिए registries तय करता है. साथ ही, networkConfig फ़ील्ड भी तय करता है. ये फ़ील्ड, प्राइवेट वीपीसी कनेक्टिविटी के लिए पीएससी नेटवर्क अटैचमेंट और डीएनएस पीयरिंग की सेटिंग कॉन्फ़िगर करते हैं:

  • registries: यह गेटवे को एजेंट रजिस्ट्री के ज़्यादा से ज़्यादा दो इंस्टेंस से जोड़ता है: एक रीजनल (../locations/${REGION}) और एक ग्लोबल (../locations/global). इससे एजेंट गेटवे को एजेंट रजिस्ट्री के साथ इंटिग्रेट किया जाता है, ताकि रीजनल डिप्लॉयमेंट (जैसे कि ${REGION} में Cloud Run MCP सर्वर) और ग्लोबल संसाधनों (जैसे कि Gemini Enterprise एजेंट और ग्लोबल एंडपॉइंट) को हल किया जा सके. ऐसा IAP v2 की नीति को बेहतर तरीके से लागू करने के लिए किया जाता है. डेस्टिनेशन यूआरएल को हल करते समय, ग्लोबल एंट्री के मुकाबले रीजनल एंट्री को प्राथमिकता दी जाती है.
  • networkAttachment: यह पीएससी नेटवर्क अटैचमेंट (psc-na-${REGION}-agw) की ओर इशारा करता है. यह प्राइवेट इग्रेस के लिए, एजेंट गेटवे को आपके वीपीसी नेटवर्क से कनेक्ट करता है.
  • dnsPeeringConfig.domains: यह run.app. को कॉन्फ़िगर करता है, ताकि Cloud Run सेवाओं के लिए Agent Gateway से शुरू होने वाली डीएनएस क्वेरी, डीएनएस पियरिंग का इस्तेमाल करके होस्टनेम को Google APIs के निजी पीएससी एंडपॉइंट आईपी पते (172.16.20.20) में बदल सकें. यह आईपी पता, आपके Cloud DNS के निजी ज़ोन में कॉन्फ़िगर किया गया होता है.

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

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

# create agent gateway config file
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 registries and network config
gcloud network-services agent-gateways describe ${AGW_NAME} \
  --location=${REGION} \
  --format="yaml(registries,networkConfig)"

अनुमानित आउटपुट:

networkConfig:
  dnsPeeringConfig:
    domains:
    - run.app.
    targetNetwork: projects/${PROJ_ID}/global/networks/vnet-${SLUG}
    targetProject: ${PROJ_ID}
  egress:
    networkAttachment: projects/${PROJ_ID}/regions/${REGION}/networkAttachments/psc-na-${REGION}-agw
registries:
- //agentregistry.googleapis.com/projects/${PROJ_ID}/locations/${REGION}

पुष्टि करें कि आउटपुट में कॉन्फ़िगरेशन की ज़रूरी जानकारी दिख रही है या नहीं:

  • registries: इसमें, गेटवे से जुड़ा क्षेत्रीय (${REGION}) एजेंट रजिस्ट्री यूआरआई दिखता है.
  • egress.networkAttachment: यह VPC से बाहर निकलने के लिए, पीएससी नेटवर्क अटैचमेंट यूआरआई के बारे में बताता है.
  • dnsPeeringConfig.domains: इसमें run.app. होता है, जो निजी डोमेन रिज़ॉल्यूशन के लिए targetNetwork की ओर इशारा करता है.

गेटवे कनेक्शन की पुष्टि करने के लिए, पीएससी नेटवर्क अटैचमेंट की जांच करें:

# show psc network attachment details
gcloud compute network-attachments describe psc-na-${REGION}-agw \
  --region=${REGION} \
  --format="yaml(connectionEndpoints)"

देखें कि कोई ऐसा कनेक्शन एंडपॉइंट मौजूद हो जिसे स्वीकार किया गया हो:

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

अनुमति देने का अधिकार किसी और को सौंपना

Agent Gateway, Identity-Aware Proxy (IAP) की यूनिफ़ाइड ऐक्सेस नीतियों (यूएपी) के साथ इंटिग्रेट की गई अनुमति देने से जुड़ी नीतियों (networksecurity.authzPolicies) का इस्तेमाल करके, आउटबाउंड टूल ट्रैफ़िक को सुरक्षित करता है और उसे मैनेज करता है.

Agent Gateway में, बुनियादी इनलाइन ALLOW और DENY नियमों का पालन किया जाता है. हालांकि, एंटरप्राइज़ एनवायरमेंट के लिए, एक ही जगह से पहचान के हिसाब से गवर्नेंस की ज़रूरत होती है. IAM की यूनिफ़ाइड ऐक्सेस नीतियों (या ऐक्सेस नीतियों) की मदद से, स्टैंडर्ड IAM v3 ऐक्सेस नीतियों का इस्तेमाल करके, डेटा बाहर भेजने के ऐक्सेस से जुड़े नियमों को मैनेज किया जाता है.

figure3

तीसरी इमेज. अनुमति देने से जुड़ा आर्किटेक्चर

अनुमति देने की प्रोसेस में तीन कॉम्पोनेंट शामिल होते हैं:

  1. गेटवे ऑथराइज़ेशन से जुड़ी नीति (authzPolicy):
    • एजेंट गेटवे को टारगेट करने वाला रीजनल संसाधन.
    • इसे policyProfile: REQUEST_AUTHZ और action: CUSTOM के साथ कॉन्फ़िगर किया गया है, ताकि बाहर जाने वाले सभी पुष्टि करने के अनुरोधों को IAP Authz एक्सटेंशन पर भेजा जा सके.
  2. IAP सेवा का एक्सटेंशन (authzExtension):
    • यह एक रीजनल रिसोर्स है, जो अनुरोध को Identity-Aware Proxy (iap.googleapis.com) को ऑथराइज़ करने का अधिकार देता है.
    • यह कुकी, V2 मोड में नीतियों का आकलन करती है. इसके लिए, नीति के वर्शन V2 का इस्तेमाल किया जाता है.ENFORCE
  3. आईएम की यूनिफ़ाइड ऐक्सेस नीति और बाइंडिंग (accessPolicy & policyBinding):
    • ग्लोबल IAM v3 के ऐसे संसाधन जिनमें ऐक्सेस के बारे में ज़्यादा जानकारी देने वाले नियम शामिल हैं.
    • यह फ़ंक्शन, कॉल करने वाले एजेंट की एसपीआईएफ़ई प्रिंसिपल आइडेंटिटी की पुष्टि करता है. साथ ही, यूनिवर्सल iap.googleapis.com/resources.egressViaIAP अनुमति की पुष्टि करता है. इसके अलावा, यह डेस्टिनेशन एट्रिब्यूट के हिसाब से कॉमन एक्सप्रेशन लैंग्वेज (सीईएल) की शर्तों का आकलन करता है.

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

service-extensions ऑथराइज़ेशन एक्सटेंशन का ऐसा कॉन्फ़िगरेशन बनाएं जो ऑथराइज़ेशन से जुड़े फ़ैसले लेने का अधिकार, IAP सेवा को सौंपता हो:

# create authz extension config file
cat > cfg/${AGW_NAME}-svc-ext-authz-iap.yaml << EOF
name: ${AGW_NAME}-svc-ext-authz-iap
service: iap.googleapis.com
failOpen: false
timeout: 1s
metadata:
  iapPolicyVersion: "V2"
EOF
# import iap authz extension (create authz extension)
gcloud service-extensions authz-extensions import ${AGW_NAME}-svc-ext-authz-iap \
  --source=cfg/${AGW_NAME}-svc-ext-authz-iap.yaml \
  --location=${REGION}

अनुमति की समयसीमा बढ़ाने की पुष्टि करना

देखें कि ऑथराइज़ेशन एक्सटेंशन चालू है या नहीं:

# list authz extensions
gcloud service-extensions authz-extensions list \
  --location=${REGION} \
  --format="table(
    name.basename():label=NAME,
    createTime.date(tz=LOCAL):label=CREATED,
    updateTime.date(tz=LOCAL):label=MODIFIED,
    service:label=SERVICE,
    metadata:label=METADATA,
    timeout:label=TIMEOUT
  )"

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

network-security अनुमति देने से जुड़ी नीति का ऐसा कॉन्फ़िगरेशन बनाएं जो एजेंट गेटवे को टारगेट करता हो. साथ ही, अनुरोध की पुष्टि करने की ज़िम्मेदारी, IAP के लिए अनुमति देने वाले एक्सटेंशन को सौंपता हो:

# create authz policy config file
cat > cfg/${AGW_NAME}-authz-policy-iap.yaml << EOF
name: ${AGW_NAME}-authz-policy-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"
EOF
# import authz policy config file (create authz policy)
gcloud network-security authz-policies import ${AGW_NAME}-authz-policy-iap \
  --source=cfg/${AGW_NAME}-authz-policy-iap.yaml \
  --location=${REGION}

अनुमति देने से जुड़ी नीति की पुष्टि करना

देखें कि अनुमति देने से जुड़ी नीति लागू है या नहीं:

# list authz policies
gcloud network-security authz-policies list \
  --location=${REGION} \
  --format="table(
    name.basename():label=NAME,
    action:label=ACTION,
    customProvider.list().sub('\W.*', ''):label=CUSTOM_PROVIDER_TYPE,
    policyProfile:label=POLICY_PROFILE,
    customProvider.authzExtension.resources[0].basename():label=CUSTOM_PROVIDER_RESOURCE
  )"

IAM ऐक्सेस से जुड़ी नीतियां बनाना

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

IAP, CEL एट्रिब्यूट एक्सप्रेशन का आकलन, एजेंट रजिस्ट्री के इन डेस्टिनेशन एट्रिब्यूट के आधार पर करता है:

  • रजिस्टर किए गए स्टेटस (destination.is_registered):
    • बूलियन (true/false), इससे पता चलता है कि एजेंट रजिस्ट्री में डेस्टिनेशन को कैटलॉग किया गया है या नहीं.
  • एमसीपी सर्वर का नाम (destination.agent_registry.mcp_server.name):
    • कैननिकल एमसीपी सर्वर का संसाधन नाम, एजेंट रजिस्ट्री में रजिस्टर किया गया है.
  • एमसीपी तरीका (destination.agent_registry.mcp_server.method):
    • एमसीपी के जिस तरीके का इस्तेमाल किया जा रहा है (जैसे, tools/call, tools/list, initialize).
  • टूल का नाम (destination.agent_registry.mcp_server.tool.name):
    • जिस टूल को चालू किया गया है उसका नाम (जैसे, subtract या add). इससे रजिस्टर किए गए एमसीपी सर्वर पर, टूल के हिसाब से अनुमति दी जा सकती है.

आईएएम ऐक्सेस नीति का नियम तय करना

आईएएम नीति के नियम मेनिफ़ेस्ट में यह जानकारी दी गई होती है:

  • प्रिंसिपल: यह SPIFFE प्रिंसिपल आइडेंटिटी है. यह Gemini Enterprise के कोर असिस्टेंट एजेंट को दिखाती है.
  • अनुमतियां: IAP के तहत आने वाले सभी इग्रेस ट्रैफ़िक के लिए, यूनिवर्सल iap.googleapis.com/resources.egressViaIAP अनुमति ज़रूरी है.
  • शर्तें: एक सीईएल एक्सप्रेशन (destination.is_registered == true), जो यह पक्का करता है कि एजेंट सिर्फ़ Agent Registry में कैटलॉग किए गए एंडपॉइंट को चालू कर सकता है.

नीति के नियम की मेनिफ़ेस्ट फ़ाइल बनाएं:

# create access policy rule file
cat > cfg/${UAP_POLICY_NAME}-rules.json << EOF
[
  {
    "description": "allow ge assistant to any registered service",
    "effect": "ALLOW",
    "principals": [
      "principal://${TRUST_DOMAIN}/resources/discoveryengine/projects/${PROJ_NO}/locations/global/engines/${GE_APP_INIT}/assistants/default_assistant/agents/default/core_assistant"
    ],
    "operation": {
      "permissions": [
        "iap.googleapis.com/resources.egressViaIAP"
      ]
    },
    "conditions": {
      "iap.googleapis.com": {
        "expression": \
        "destination.is_registered == true"
      }
    }
  }
]
EOF

आईएएम ऐक्सेस नीति डिप्लॉय करना

मैनिफ़ेस्ट फ़ाइल में तय किए गए नियमों का इस्तेमाल करके, ग्लोबल आईएएम ऐक्सेस नीति बनाएं:

# create iam access policy
gcloud iam access-policies create ${UAP_POLICY_NAME} \
  --details-rules=cfg/${UAP_POLICY_NAME}-rules.json \
  --project=${PROJ_ID} \
  --location=global

आईएएम ऐक्सेस नीति की पुष्टि करना

देखें कि IAM ऐक्सेस नीति सही तरीके से बनाई गई है या नहीं. साथ ही, नियम की जानकारी की जांच करें:

# show iam access policy details
gcloud iam access-policies describe ${UAP_POLICY_NAME} \
  --project=${PROJ_ID} \
  --location=global

अनुमानित आउटपुट:

details:
  rules:
  - conditions:
      iap.googleapis.com:
        expression: destination.is_registered == true
    description: allow ge assistant to any registered service
    effect: ALLOW
    operation:
      permissions:
      - iap.googleapis.com/resources.egressViaIAP
    principals:
    - principal://agents.global.org-${ORG_ID}.system.id.goog/resources/discoveryengine/projects/${PROJ_NO}/locations/global/engines/${GE_APP_INIT}/assistants/default_assistant/agents/default/core_assistant
name: projects/${PROJ_ID}/locations/global/accessPolicies/${UAP_POLICY_NAME}

आईएएम ऐक्सेस नीति को प्रोजेक्ट से बाइंड करना

अपने प्रोजेक्ट में मौजूद सभी एजेंट गेटवे पर नीति लागू करने के लिए, एक नीति बाइंडिंग बनाएं. इससे आईएएम ऐक्सेस नीति को प्रोजेक्ट संसाधन से जोड़ा जा सकेगा:

# bind iam access policy to project resource
gcloud iam policy-bindings create ${UAP_BINDING_NAME} \
  --policy="projects/${PROJ_ID}/locations/global/accessPolicies/${UAP_POLICY_NAME}" \
  --target-resource="//cloudresourcemanager.googleapis.com/projects/${PROJ_ID}" \
  --project=${PROJ_ID} \
  --location=global

आईएएम ऐक्सेस नीति के बाइंड होने की पुष्टि करना

नीति के लागू होने के चालू पॉइंट की जांच करें, ताकि यह पक्का किया जा सके कि वे सही नीति और टारगेट से जुड़े हों:

# show policy binding details
gcloud iam policy-bindings describe ${UAP_BINDING_NAME} \
  --project=${PROJ_ID} \
  --location=global

अनुमानित आउटपुट:

name: projects/${PROJ_ID}/locations/global/policyBindings/${UAP_BINDING_NAME}
policy: projects/${PROJ_ID}/locations/global/accessPolicies/${UAP_POLICY_NAME}
policyKind: ACCESS
target:
  resource: //cloudresourcemanager.googleapis.com/projects/${PROJ_ID}

इसके साथ, एजेंट गेटवे वाला सेक्शन पूरा होता है... अब एमसीपी सर्वर सेक्शन पर जाएं.

6. एमसीपी सर्वर

इस सेक्शन में, add और subtract टूल दिखाने वाला कस्टम FastMCP सर्वर बनाया जाएगा. साथ ही, इसे सोर्स से सीधे Cloud Run पर डिप्लॉय किया जाएगा. सोर्स डिप्लॉयमेंट (--source) के दौरान, Cloud Build, शामिल किए गए Dockerfile और uv का इस्तेमाल करके कंटेनर इमेज को पैकेज करेगा. , pyproject.toml में तय की गई डिपेंडेंसी इंस्टॉल करता है और server.py लॉन्च करता है.

Cloud Run सेवा डिप्लॉय होने के बाद, एमसीपी सर्वर को एजेंट रजिस्ट्री में रजिस्टर करें. साथ ही, इसके टूल स्पेसिफ़िकेशन (toolspec.json) को भी रजिस्टर करें, ताकि Gemini Enterprise इसके टूल ढूंढ सके और उन्हें चालू कर सके.

एमसीपी सर्वर ऐप्लिकेशन बनाना

ऐप्लिकेशन कोड के लिए, math-wizard प्रोजेक्ट डायरेक्ट्री बनाएं:

# create directory for code
mkdir -p math-wizard

Python प्रोजेक्ट की मेनिफ़ेस्ट फ़ाइल लिखें:

# create python project manifest file
cat > math-wizard/pyproject.toml << 'EOF'
[project]
name = "math-wizard"
version = "0.1.0"
description = "math wizard mcp server"
requires-python = ">=3.12"
dependencies = [
    "fastmcp==2.13.1",
]
EOF

कोड में कुछ और इंस्ट्रूमेंटेशन फ़ंक्शन शामिल किए गए हैं. इनका इस्तेमाल, Cloud Logging और Cloud Trace की पुष्टि के लिए, आने वाले एचटीटीपी हेडर (mcp-session-id, x-forwarded-for, user-agent, और x-cloud-trace-context) को कैप्चर करने के लिए किया जाता है.

ऐप्लिकेशन की कोड फ़ाइल लिखें:

# create mcp server application code
cat > math-wizard/server.py << 'EOF'
import asyncio
import json
import logging
import os
from fastmcp import FastMCP
from fastmcp.server.dependencies import get_http_headers
from mcp.types import ToolAnnotations

logger = logging.getLogger(__name__)
logging.basicConfig(format="[%(levelname)s]: %(message)s", level=logging.INFO)

mcp = FastMCP("math wizard mcp server")

def log_network_context(tool_name: str, a: int, b: int) -> None:
    headers = get_http_headers()
    print(json.dumps({
        "severity": "INFO",
        "message": f">>> 🛠️ Tool: '{tool_name}' called with numbers '{a}' and '{b}'",
        "tool": tool_name,
        "mcp_session_id": headers.get("mcp-session-id"),
        "x_forwarded_for": headers.get("x-forwarded-for"),
        "user_agent": headers.get("user-agent"),
        "trace_header": headers.get("x-cloud-trace-context"),
    }), flush=True)

@mcp.tool(
    annotations=ToolAnnotations(
        readOnlyHint=True,
    )
)
def add(a: int, b: int) -> int:
    """Use this to add two numbers together.

    Args:
        a: The first number.
        b: The second number.

    Returns:
        The sum of the two numbers.
    """
    logger.info(f">>> 🛠️ Tool: 'add' called with numbers '{a}' and '{b}'")
    log_network_context("add", a, b)
    return a + b

@mcp.tool(
    annotations=ToolAnnotations(
        readOnlyHint=True,
    )
)
def subtract(a: int, b: int) -> int:
    """Use this to subtract two numbers.

    Args:
        a: The first number.
        b: The second number.

    Returns:
        The difference of the two numbers.
    """
    logger.info(f">>> 🛠️ Tool: 'subtract' called with numbers '{a}' and '{b}'")
    log_network_context("subtract", a, b)
    return a - b

if __name__ == "__main__":
    logger.info(f"🚀 MCP server started on port {os.getenv('PORT', 8080)}")
    asyncio.run(
        mcp.run_async(
            transport="streamable-http",
            host="0.0.0.0",
            port=int(os.getenv("PORT", 8080)),
        )
    )
EOF

कंटेनर इमेज बनाने के निर्देशों और स्टार्टअप कमांड को तय करने के लिए, Dockerfile लिखें:

# create dockerfile
cat > math-wizard/Dockerfile << 'EOF'
# use official python 3.12 image
FROM python:3.12-slim

# install uv
COPY --from=ghcr.io/astral-sh/uv:latest /uv /uvx /bin/

# install the project into /app
COPY . /app
WORKDIR /app

# allow statements and log messages to immediately appear in the logs
ENV PYTHONUNBUFFERED=1

# install dependencies
RUN uv sync

EXPOSE 8080

# run the mcp server
CMD ["uv", "run", "server.py"]
EOF

Cloud Run पर सेवा डिप्लॉय करना

Cloud Build का इस्तेमाल करके, सोर्स से एमसीपी सर्वर डिप्लॉय करें. Cloud Build, प्रोजेक्ट के डिफ़ॉल्ट कंप्यूट सेवा खाते ${PROJ_NO}-compute@developer.gserviceaccount.com का इस्तेमाल करता है:

# deploy cloud run service
gcloud run deploy ${MCP_NAME} \
  --source math-wizard \
  --region=${REGION} \
  --no-invoker-iam-check \
  --ingress=internal \
  --quiet

Cloud Run डिप्लॉयमेंट की पुष्टि करना

Cloud Run सेवा की जानकारी देखें, ताकि यह पुष्टि की जा सके कि उसका कॉन्फ़िगरेशन चालू है:

# show cloud run service details
gcloud run services describe ${MCP_NAME} --region=${REGION}

अनुमानित आउटपुट:

<snip>
✔ Service math-wizard in region ${REGION}

URL:     https://math-wizard-${PROJ_NO}.${REGION}.run.app
Ingress: internal
Traffic:
  100% LATEST (currently math-wizard-00001-<id>)
</snip>

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

एमसीपी सर्वर पर उपलब्ध टूल के बारे में Gemini Enterprise को सटीक जानकारी देने के लिए, एजेंट रजिस्ट्री में रजिस्ट्रेशन के दौरान टूल स्पेसिफ़िकेशन फ़ाइल (toolspec.json) उपलब्ध करानी होगी.

एमसीपी टूल की खास जानकारी बनाना

# create tool spec file
cat > cfg/toolspec.json << 'EOF'
{
  "tools": [
    {
      "name": "add",
      "description": "Use this to add two numbers together.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "a": { "type": "integer", "description": "The first number." },
          "b": { "type": "integer", "description": "The second number." }
        },
        "required": ["a", "b"]
      },
      "isReadOnly": true,
      "isDestructive": false,
      "isIdempotent": true,
      "isOpenWorld": false
    },
    {
      "name": "subtract",
      "description": "Use this to subtract two numbers.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "a": { "type": "integer", "description": "The first number." },
          "b": { "type": "integer", "description": "The second number." }
        },
        "required": ["a", "b"]
      },
      "isReadOnly": true,
      "isDestructive": false,
      "isIdempotent": true,
      "isOpenWorld": false
    }
  ]
}
EOF

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

# register mcp server in agent registry
gcloud agent-registry services create ${MCP_NAME} \
  --project=${PROJ_ID} \
  --location=${REGION} \
  --display-name="${MCP_NAME}-${PROJ_NO}.${REGION}.run.app" \
  --description="MANDATORY MATH & ARITHMETIC AGENT: You MUST ALWAYS invoke \
this tool for ANY mathematical calculation, addition (+), subtraction (-), \
sum, difference, or arithmetic question (including simple questions like \
'what is 67 + 345?'). NEVER compute arithmetic yourself and NEVER transfer \
math queries to file_and_coding_agent / code interpreter. Always delegate \
every math question to this tool." \
  --mcp-server-spec-type=tool-spec \
  --mcp-server-spec-content=cfg/toolspec.json \
  --interfaces=protocolBinding=JSONRPC,url="${MCP_URL}"

एजेंट रजिस्ट्री में एमसीपी सर्वर की पुष्टि करना

पुष्टि करें कि डिप्लॉय की गई Cloud Run सेवा, उस क्षेत्र में रजिस्टर किए गए एमसीपी सर्वर के तौर पर लिस्ट की गई हो. साथ ही, यह भी पुष्टि करें कि उसमें एंडपॉइंट यूआरएल और उपलब्ध टूल शामिल हों:

# list registered mcp servers in agent registry
gcloud agent-registry mcp-servers list \
  --location=${REGION} \
  --project=${PROJ_ID} \
  --format="table(
    name.basename():label=REGISTRY_ID,
    displayName:label=DISPLAY_NAME,
    interfaces[0].url:label=ENDPOINT_URL,
    tools[].name.list():label=TOOLS
  )"

अनुमानित आउटपुट:

REGISTRY_ID                                         DISPLAY_NAME                                  ENDPOINT_URL                                              TOOLS
agentregistry-00000000-0000-0000-0012-3456789abcde  math-wizard-${PROJ_NO}.${REGION}.run.app      https://math-wizard-${PROJ_NO}.${REGION}.run.app/mcp      add,subtract

सेवा के कॉन्फ़िगरेशन की खास जानकारी देखें. इससे पता चलेगा कि हर टूल के लिए, टूल की सटीक परिभाषाएं, इनपुट स्कीमा, और व्यवहार के एनोटेशन रजिस्टर किए गए हैं या नहीं:

# describe mcp server tool specs
gcloud agent-registry services describe ${MCP_NAME} \
  --location=${REGION} \
  --project=${PROJ_ID} \
  --format="yaml(mcpServerSpec.content.tools)"

एमसीपी सर्वर वाला सेक्शन यहां खत्म होता है... अब Gemini Enterprise सेक्शन पर चलते हैं.

7. Gemini Enterprise

इस सेक्शन में, आपको Gemini Enterprise ऐप्लिकेशन और उससे लिंक की गई कस्टम एमसीपी सर्वर डेटा स्टोर रिसोर्स बनाना और कॉन्फ़िगर करना होगा.

Discovery Engine का रिसॉर्स मॉडल

Gemini Enterprise ऐप्लिकेशन (Discovery Engine API में इसे Engine संसाधन के तौर पर दिखाया गया है) एक सेंट्रल ऑर्केस्ट्रेशन लेयर है. साथ ही, यह असली उपयोगकर्ताओं के लिए बातचीत वाला इंटरफ़ेस है. यह उपयोगकर्ता के चैट सेशन मैनेज करता है, एंटरप्राइज़ डेटा के आधार पर जनरेटिव मॉडल तैयार करता है, और डाइनैमिक टूल के इस्तेमाल को मैनेज करता है.

Gemini Enterprise के ऐप्लिकेशन, डेटा स्टोर के ज़रिए डेटा और सिस्टम के साथ इंटरैक्ट करते हैं:

  • नॉलेज डेटा स्टोर: इसमें स्टैटिक कॉन्टेंट (जैसे, Cloud Storage, Google Drive, BigQuery) को इंडेक्स किया जाता है, ताकि उसे आसानी से खोजा जा सके.
  • डेटा कनेक्टर (कार्रवाई करने वाली कंपनियां): डाइनैमिक तीसरे पक्ष या कस्टम एपीआई से कनेक्ट करें. कस्टम एमसीपी सर्वर डेटा स्टोर, मॉडल कॉन्टेक्स्ट प्रोटोकॉल (एमसीपी) के ज़रिए तय किए गए टूल दिखाता है. इससे मॉडल को बातचीत के दौरान, बाहरी फ़ंक्शन को डाइनैमिक तरीके से कॉल करने की सुविधा मिलती है.

एजेंट गेटवे के ज़रिए इग्रेस रूटिंग

डिफ़ॉल्ट रूप से, Gemini Enterprise, कनेक्टर और टूल के इस्तेमाल से जुड़े ट्रैफ़िक को सार्वजनिक नेटवर्क पर भेजता है. हालांकि, प्राइवेट वीपीसी वर्कलोड और ज़ीरो-ट्रस्ट गवर्नेंस के लिए, इंजन को एजेंट गेटवे के ज़रिए इग्रेस डेटा ट्रैफ़िक को रूट करने के लिए कॉन्फ़िगर किया जा सकता है:

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

Gemini Enterprise ऐप्लिकेशन बनाना

यहां दिए गए तरीके में, Gemini Enterprise ऐप्लिकेशन के संसाधन और कॉन्फ़िगरेशन बनाने के लिए discoveryengine.googleapis.com API का इस्तेमाल किया जाता है. Google Cloud Console के यूज़र इंटरफ़ेस (यूआई) का इस्तेमाल करके कॉन्फ़िगर करने के लिए, निर्देशों के लिए ऐप्लिकेशन बनाना लेख पढ़ें.

# create engine (ge app)
curl -s -X POST "https://${GE_LOCATION}-discoveryengine.googleapis.com/v1/projects/${PROJ_ID}/locations/${GE_LOCATION}/collections/default_collection/engines?engineId=${GE_APP_INIT}" \
  -H "Authorization: Bearer $(gcloud auth application-default print-access-token)" \
  -H "X-Goog-User-Project: ${PROJ_ID}" -H "Content-Type: application/json" \
  -d @- <<EOF
{
  "displayName": "${GE_APP_DISPLAY_NAME}",
  "dataStoreIds": [],
  "solutionType": "SOLUTION_TYPE_SEARCH",
  "industryVertical": "GENERIC",
  "appType": "APP_TYPE_INTRANET",
  "searchEngineConfig": {
    "searchTier": "SEARCH_TIER_ENTERPRISE",
    "searchAddOns": [
      "SEARCH_ADD_ON_LLM"
    ]
  },
  "commonConfig": {
    "companyName": "${GE_APP_ORG_NAME}"
  }
}
EOF

ऐप्लिकेशन बनाने की पुष्टि करना

# fetch engine (ge app) id
export GE_APP_ID=$(curl -s "https://${GE_LOCATION}-discoveryengine.googleapis.com/v1/projects/${PROJ_ID}/locations/${GE_LOCATION}/collections/default_collection/engines" \
  -H "Authorization: Bearer $(gcloud auth application-default print-access-token)" -H "X-Goog-User-Project: ${PROJ_ID}" \
  | jq -r --arg name "${GE_APP_DISPLAY_NAME}" '.engines[] | select(.displayName==$name) | .name | split("/") | last')

echo "engine (ge app) id: ${GE_APP_ID}"

बनाया गया कॉन्फ़िगरेशन देखने के लिए, इंजन की जानकारी देखें:

# get engine (ge app) details
curl -s "https://${GE_LOCATION}-discoveryengine.googleapis.com/v1/projects/${PROJ_ID}/locations/${GE_LOCATION}/collections/default_collection/engines/${GE_APP_ID}" \
  -H "Authorization: Bearer $(gcloud auth application-default print-access-token)" \
  -H "X-Goog-User-Project: ${PROJ_ID}"

JSON रिस्पॉन्स में, सर्वर से भरी गई इन प्रॉपर्टी पर ध्यान दें:

  • name: कैननिकल रिसॉर्स पाथ (projects/${PROJ_NO}/locations/global/collections/default_collection/engines/${GE_APP_ID}).
  • sessionConfig.sessionManagementPolicy: यह डिफ़ॉल्ट रूप से "VERTEX_AI_MANAGED" पर सेट होता है. यह Agent Platform (पहले इसे Vertex AI के नाम से जाना जाता था) में, सिलसिलेवार बातचीत और टूल-कॉल की स्थिति को बनाए रखता है.
  • observabilityConfig.observabilityEnabled: बेसलाइन मेट्रिक के लिए, डिफ़ॉल्ट रूप से true पर सेट होता है. हालांकि, बाद के चरण में प्रॉम्प्ट और टूल पेलोड की पूरी जानकारी लॉग करने की सुविधा चालू की जाती है.

आइडेंटिटी प्रोवाइडर चालू करना

Gemini Enterprise ऐप्लिकेशन पर, असली उपयोगकर्ता की पुष्टि करने के लिए, Google Identity को आइडेंटिटी प्रोवाइडर के तौर पर चालू करें.

यहां दिए गए तरीके में, Gemini Enterprise ऐप्लिकेशन के आइडेंटिटी प्रोवाइडर को कॉन्फ़िगर करने के लिए, discoveryengine.googleapis.com API का इस्तेमाल किया जाता है. Google Cloud Console के यूज़र इंटरफ़ेस (यूआई) का इस्तेमाल करके कॉन्फ़िगर करने के लिए, निर्देशों के लिए आइडेंटिटी प्रोवाइडर कॉन्फ़िगर करना लेख पढ़ें.

# set identity provider
curl -s -X PATCH "https://${GE_LOCATION}-discoveryengine.googleapis.com/v1/projects/${PROJ_ID}/locations/${GE_LOCATION}/aclConfig" \
  -H "Authorization: Bearer $(gcloud auth application-default print-access-token)" \
  -H "X-Goog-User-Project: ${PROJ_ID}" -H "Content-Type: application/json" \
  -d @- <<EOF
{
  "idpConfig": {
    "idpType": "GSUITE"
  }
}
EOF

पहचान की पुष्टि करने वाली कंपनी की पुष्टि करना

# show identity provider
curl -s "https://${GE_LOCATION}-discoveryengine.googleapis.com/v1/projects/${PROJ_ID}/locations/${GE_LOCATION}/aclConfig" \
  -H "Authorization: Bearer $(gcloud auth application-default print-access-token)" \
  -H "X-Goog-User-Project: ${PROJ_ID}"

आउटपुट "idpType": "GSUITE", Google आइडेंटिटी प्रोवाइडर से जुड़ा होता है.

(ज़रूरी नहीं) Gemini Enterprise के ट्रायल लाइसेंस को चालू करें

अगर किसी ऐसे प्रोजेक्ट का इस्तेमाल किया जा रहा है जिसे Gemini Enterprise के लाइसेंस असाइन किए गए हैं, तो इस चरण को छोड़ दें. अगर बिना लाइसेंस के किसी नए प्रोजेक्ट का इस्तेमाल किया जा रहा है, तो आगे बढ़ें और यह तरीका अपनाएं.

Gemini Enterprise के लिए लाइसेंस कॉन्फ़िगरेशन रिसॉर्स बनाएं, ताकि उपयोगकर्ताओं को 30 दिनों के लिए Gemini Enterprise का ऐक्सेस दिया जा सके. इससे, नए ट्रायल के लिए डिफ़ॉल्ट लाइसेंस सेट हो जाएगा. इसलिए, लॉगिन करने वाले किसी भी उपयोगकर्ता को सीट अपने-आप मिल जाएगी:

# configure free trial subscription
curl -s -X POST "https://${GE_LOCATION}-discoveryengine.googleapis.com/v1/projects/${PROJ_ID}/locations/${GE_LOCATION}/licenseConfigs?licenseConfigId=free_trial_gemini" \
  -H "Authorization: Bearer $(gcloud auth application-default print-access-token)" \
  -H "X-Goog-User-Project: ${PROJ_ID}" -H "Content-Type: application/json" \
  -d @- <<EOF
{
  "subscriptionTier": "SUBSCRIPTION_TIER_SEARCH_AND_ASSISTANT",
  "freeTrial": true
}
EOF

पुष्टि करें कि लाइसेंस लागू हो गया है

# show license config
curl -s "https://${GE_LOCATION}-discoveryengine.googleapis.com/v1/projects/${PROJ_ID}/locations/${GE_LOCATION}/licenseConfigs/free_trial_gemini" \
  -H "Authorization: Bearer $(gcloud auth application-default print-access-token)" \
  -H "X-Goog-User-Project: ${PROJ_ID}"

"subscriptionTerm": "SUBSCRIPTION_TERM_ONE_MONTH" और "freeTrial": true देखें.

# verify auto-registration enabled on default user store
curl -s "https://${GE_LOCATION}-discoveryengine.googleapis.com/v1/projects/${PROJ_ID}/locations/${GE_LOCATION}/userStores/default_user_store" \
  -H "Authorization: Bearer $(gcloud auth application-default print-access-token)" \
  -H "X-Goog-User-Project: ${PROJ_ID}"

../free_trial_gemini" और "enableLicenseAutoRegister": true देखें.

जांचने की क्षमता से जुड़ी सेटिंग चालू करना

Gemini Enterprise ऐप्लिकेशन (इंजन) के लेवल पर निगरानी की सुविधा चालू करने से, आपको Metrics Explorer में मेट्रिक डेटा के साथ मुख्य असिस्टेंट के इंटरैक्शन देखने की सुविधा मिलती है. साथ ही, Cloud Trace में एंड-टू-एंड ट्रेस को कोरिलेट करने की सुविधा मिलती है.

# set observability on engine (ge app)
curl -s -X PATCH "https://${GE_LOCATION}-discoveryengine.googleapis.com/v1/projects/${PROJ_ID}/locations/${GE_LOCATION}/collections/default_collection/engines/${GE_APP_ID}?updateMask=observabilityConfig" \
  -H "Authorization: Bearer $(gcloud auth application-default print-access-token)" \
  -H "X-Goog-User-Project: ${PROJ_ID}" -H "Content-Type: application/json" \
  -d @- <<EOF
{
  "observabilityConfig": {
    "observabilityEnabled": true,
    "sensitiveLoggingEnabled": true
  }
}
EOF

निगरानी से जुड़ी सेटिंग की पुष्टि करना

# verify observability is enabled on engine (ge app)
curl -s "https://${GE_LOCATION}-discoveryengine.googleapis.com/v1/projects/${PROJ_ID}/locations/${GE_LOCATION}/collections/default_collection/engines/${GE_APP_ID}" \
  -H "Authorization: Bearer $(gcloud auth application-default print-access-token)" \
  -H "X-Goog-User-Project: ${PROJ_ID}" \
  | jq '{observabilityConfig: .observabilityConfig}'

"sensitiveLoggingEnabled": true देखें.

एजेंट गेटवे से बाइंड करना

Gemini Enterprise से भेजे जाने वाले आउटबाउंड ट्रैफ़िक को Agent Gateway के ज़रिए रूट करने से, एआई एजेंट के टूल को इस्तेमाल करने के सभी अनुरोधों के लिए, ज़ीरो-ट्रस्ट गवर्नेंस और सुरक्षा लागू करने की सीमा तय की जा सकती है:

  • नीति लागू करने की केंद्रीकृत सुविधा: Agent Gateway, एक इनलाइन प्रॉक्सी के तौर पर काम करता है. यह एजेंट एनवायरमेंट से ट्रैफ़िक के बाहर जाने से पहले, टूल के आउटबाउंड अनुरोधों का आकलन करता है. इसके लिए, यह अनुमति देने से जुड़ी नीतियों और गवर्नेंस कंट्रोल का इस्तेमाल करता है.
  • निजी नेटवर्क इग्रेस: Gemini Enterprise को Agent Gateway से बाइंड करने पर, Cloud Run पर मौजूद निजी एमसीपी सर्वर को टारगेट करने वाले टूल कॉल, Private Service Connect (पीएससी) के ज़रिए सुरक्षित तरीके से रूट होते हैं. इससे, सार्वजनिक इंटरनेट को बायपास किया जा सकता है.
  • यूनिफ़ाइड ऑडिट की सुविधा: इससे कनेक्ट किए गए सभी एमसीपी सर्वर और बाहरी टूल के लिए, अनुरोध लॉगिंग, टेलीमेट्री, और ऑडिट ट्रेल की सुविधा एक ही जगह पर मिलती है.

Gemini Enterprise ऐप्लिकेशन पर agentGatewaySetting को कॉन्फ़िगर करने पर, एंड-यूज़र की क्वेरी से शुरू होने वाले आउटबाउंड टूल और एजेंट कॉल (जैसे, एजेंट रजिस्ट्री और A2A एजेंट से इंपोर्ट किए गए कस्टम एमसीपी सर्वर को कॉल) अपने-आप एजेंट गेटवे से रूट हो जाते हैं.

इंजन agentGatewaySetting को पैच करके, ये सुविधाएं चालू करें:

# bind engine (ge app) to agent gateway
curl -s -X PATCH "https://${GE_LOCATION}-discoveryengine.googleapis.com/v1/projects/${PROJ_ID}/locations/${GE_LOCATION}/collections/default_collection/engines/${GE_APP_ID}?updateMask=agentGatewaySetting.defaultEgressAgentGateway.name" \
  -H "Authorization: Bearer $(gcloud auth application-default print-access-token)" \
  -H "X-Goog-User-Project: ${PROJ_ID}" -H "Content-Type: application/json" \
  -d @- <<EOF
{
  "agentGatewaySetting": {
    "defaultEgressAgentGateway": {
      "name": "projects/${PROJ_ID}/locations/${REGION}/agentGateways/${AGW_NAME}"
    }
  }
}
EOF

एजेंट गेटवे बाइंडिंग की पुष्टि करना

agentGatewaySetting बाइंडिंग की पुष्टि करने के लिए, ऐप्लिकेशन कॉन्फ़िगरेशन वापस पाएं:

# verify engine (ge app) agent gateway configuration
curl -s "https://${GE_LOCATION}-discoveryengine.googleapis.com/v1/projects/${PROJ_ID}/locations/${GE_LOCATION}/collections/default_collection/engines/${GE_APP_ID}" \
  -H "Authorization: Bearer $(gcloud auth application-default print-access-token)" \
  -H "X-Goog-User-Project: ${PROJ_ID}" \
  | jq '{name: .name, displayName: .displayName, agentGatewaySetting: .agentGatewaySetting}'

अनुमानित आउटपुट:

{
  "name": "projects/${PROJ_NO}/locations/${GE_LOCATION}/collections/default_collection/engines/${GE_APP_ID}",
  "displayName": "${GE_APP_DISPLAY_NAME}",
  "agentGatewaySetting": {
    "defaultEgressAgentGateway": {
      "name": "projects/${PROJ_ID}/locations/${REGION}/agentGateways/${AGW_NAME}"
    }
  }
}

कस्टम एमसीपी सर्वर डेटा स्टोर बनाना

इस सेक्शन में, आपको एमसीपी सर्वर को Gemini Enterprise से कनेक्ट करना होगा. इसके लिए, आपको कस्टम एमसीपी डेटा स्टोर बनाना होगा.

Discovery Engine API का इस्तेमाल करके, इस प्रोसेस को दो चरणों में पूरा किया जा सकता है:

  1. बनाएं (:setUpDataConnector): यह एक खास Collection संसाधन (${MCP_NAME}-%timestamp-collection) बनाता है, DataConnector (custom_mcp) को अटैच करता है, और इसके बैकअप के लिए DataStore (..._mcp_data) उपलब्ध कराता है.
  2. चालू करें (PATCH .../dataConnector?updateMask=actionConfig): यह कनेक्टर के ऐक्शन रनटाइम (actionState: "ACTIVE") को चालू करता है. इसके लिए, एजेंट रजिस्ट्री टूल स्पेसिफ़िकेशन का इस्तेमाल किया जाता है. साथ ही, यह DataStore (dataStoreIds) को आपके Gemini Enterprise Engine से बाइंड करता है.
# fetch mcp server agent registry resource name
export MCP_REGISTRY_URI=$(gcloud agent-registry mcp-servers list \
  --location=${REGION} \
  --project=${PROJ_ID} \
  --filter="displayName:${MCP_NAME}" \
  --format="value(name)")

echo "mcp registry name: ${MCP_REGISTRY_URI}"
echo "mcp url: ${MCP_URL}"

डेटा कनेक्टर बनाना

# create custom mcp data connector from agent registry and link to engine
curl -s -X POST "https://${GE_LOCATION}-discoveryengine.googleapis.com/v1alpha/projects/${PROJ_ID}/locations/${GE_LOCATION}:setUpDataConnector" \
  -H "Authorization: Bearer $(gcloud auth application-default print-access-token)" \
  -H "X-Goog-User-Project: ${PROJ_ID}" \
  -H "Content-Type: application/json" \
  -d @- <<EOF
{
  "collectionId": "${MCP_NAME}-$(date +%s)-collection",
  "collectionDisplayName": "${MCP_NAME}-collection",
  "dataConnector": {
    "dataSource": "custom_mcp",
    "dataSourceVersion": 1,
    "params": {
      "oauth_access_token": "unused"
    },
    "refreshInterval": "86400s",
    "entities": [
      {
        "entityName": "mcp_data"
      }
    ],
    "connectorModes": [
      "FEDERATED"
    ],
    "actionConfig": {
      "isActionConfigured": true,
      "createBapConnection": true,
      "actionParams": {
        "auth_type": "NO_AUTH",
        "instance_uri": "${MCP_URL}",
        "mcp_server_source": "REGISTRY_MCP",
        "registry_mcp_server_name": "${MCP_REGISTRY_URI}",
        "mcp_agent_instructions": "MANDATORY MATH & ARITHMETIC AGENT: Always invoke this tool for any mathematical calculation, addition (+), subtraction (-), sum, or difference.",
        "use_agent_gateway_egress": true,
        "agent_gateway_engine": "projects/${PROJ_ID}/locations/global/collections/default_collection/engines/${GE_APP_ID}"
      }
    }
  }
}
EOF

डेटा कनेक्टर बनाने की पुष्टि करना

# fetch collection id
export GE_COLLECTION_ID=$(curl -s "https://${GE_LOCATION}-discoveryengine.googleapis.com/v1alpha/projects/${PROJ_ID}/locations/${GE_LOCATION}/collections" \
  -H "Authorization: Bearer $(gcloud auth application-default print-access-token)" \
  -H "X-Goog-User-Project: ${PROJ_ID}" \
  | jq -r --arg dname "${MCP_NAME}-collection" '.collections[] | select(.displayName == $dname) | .name | split("/") | last' | head -n 1)

echo "ge collection id: ${GE_COLLECTION_ID}"

देखें कि "registry_mcp_server_name" फ़ील्ड में, एमसीपी सर्वर के लिए एजेंट रजिस्ट्री का यूयूआईडी मौजूद हो:

# show data connector details
curl -s "https://${GE_LOCATION}-discoveryengine.googleapis.com/v1alpha/projects/${PROJ_ID}/locations/${GE_LOCATION}/collections/${GE_COLLECTION_ID}/dataConnector" \
  -H "Authorization: Bearer $(gcloud auth application-default print-access-token)" \
  -H "X-Goog-User-Project: ${PROJ_ID}" \
  | jq '{name, state, actionState, connectorModes, bapConfig, registry_mcp_server_name: .actionConfig.actionParams.registry_mcp_server_name}'

Google Cloud Console के यूज़र इंटरफ़ेस (यूआई) में, एमसीपी सर्वर की रजिस्ट्री एंट्री देखें:

echo "mcp server registry page url: https://console.cloud.google.com/agent-platform/agent-registry/mcp-servers/${REGION}/${MCP_REGISTRY_URI##*/}/overview?project=${PROJ_ID}"

डेटा कनेक्टर चालू करना

# activate and bind data connector
curl -s -X PATCH "https://discoveryengine.googleapis.com/v1alpha/projects/${PROJ_ID}/locations/global/collections/${GE_COLLECTION_ID}/dataConnector?updateMask=actionConfig" \
  -H "Authorization: Bearer $(gcloud auth application-default print-access-token)" \
  -H "X-Goog-User-Project: ${PROJ_ID}" \
  -H "Content-Type: application/json" \
  -d @- <<EOF
{
  "name": "projects/${PROJ_ID}/locations/global/collections/${GE_COLLECTION_ID}/dataConnector",
  "actionConfig": {
    "isActionConfigured": true,
    "createBapConnection": true,
    "actionParams": {
      "auth_type": "NO_AUTH",
      "instance_uri": "${MCP_URL}",
      "mcp_server_source": "REGISTRY_MCP",
      "registry_mcp_server_name": "${MCP_REGISTRY_URI}",
      "mcp_agent_instructions": "MANDATORY MATH & ARITHMETIC AGENT: Always invoke this tool for any mathematical calculation, addition (+), subtraction (-), sum, or difference.",
      "use_agent_gateway_egress": true,
      "agent_gateway_engine": "projects/${PROJ_ID}/locations/global/collections/default_collection/engines/${GE_APP_ID}"
    }
  }
}
EOF

कस्टम एमसीपी सर्वर के लिंक की पुष्टि करना

# show engine (ge app) details
curl -s "https://${GE_LOCATION}-discoveryengine.googleapis.com/v1/projects/${PROJ_ID}/locations/${GE_LOCATION}/collections/default_collection/engines/${GE_APP_ID}" \
  -H "Authorization: Bearer $(gcloud auth application-default print-access-token)" \
  -H "X-Goog-User-Project: ${PROJ_ID}" \
  | jq '{name: .name, dataStoreIds: .dataStoreIds, agentGatewaySetting: .agentGatewaySetting}'

लिंक किए गए डेटा स्टोर "dataStoreIds": "collection-math-wizard-_mcp_data" की जांच करें.

# show collection details
curl -s "https://${GE_LOCATION}-discoveryengine.googleapis.com/v1alpha/projects/${PROJ_ID}/locations/${GE_LOCATION}/collections" \
  -H "Authorization: Bearer $(gcloud auth application-default print-access-token)" \
  -H "X-Goog-User-Project: ${PROJ_ID}" \
  | jq --arg app "${GE_APP_ID}" '.collections[] | select(.dataConnector.actionConfig.actionParams.agent_gateway_engine // "" | endswith($app)) | .dataConnector | {name: .name, state: .state, actionState: .actionState, connectorModes: .connectorModes, actionParams: .actionConfig.actionParams}'

"state": "ACTIVE" की जांच करें. इसमें सभी पैरामीटर की वैल्यू मौजूद होनी चाहिए.

टूल से जुड़ी कार्रवाइयां

Gemini Enterprise के डैशबोर्ड में math-wizard-collection डेटा स्टोर की जांच करने पर, आपको दिखेगा कि कार्रवाइयां टैब का इस्तेमाल नहीं किया गया है और ↻ कस्टम कार्रवाइयों को फिर से लोड करें बटन बंद है. ऐसा होना आम बात है.

Google Cloud Console के यूज़र इंटरफ़ेस (यूआई) में, डेटा स्टोर की ज़्यादा जानकारी वाला पेज देखें:

echo "data store details page url: https://console.cloud.google.com/gemini-enterprise/locations/${GE_LOCATION}/collections/${GE_COLLECTION_ID}/connector/details?project=${PROJ_ID}"

कस्टम एमसीपी सर्वर को Gemini Enterprise से कनेक्ट करने के तरीके के आधार पर, टूल डिस्कवरी और गवर्नेंस को इन दो तरीकों में से किसी एक तरीके से मैनेज किया जाता है:

  • कस्टम एमसीपी को सीधे तौर पर कॉन्फ़िगर करना (BYO_MCP वर्कफ़्लो): अगर आपने एजेंट रजिस्ट्री के बिना, Gemini Enterprise में सीधे तौर पर कस्टम एमसीपी सर्वर को कॉन्फ़िगर किया है, तो डेटा स्टोर खुद टूल कैटलॉग (connectorModes: ["FEDERATED", "ACTIONS"]) को मैनेज करता है. आपको कार्रवाइयां टैब खोलना होगा. इसके बाद, tools/list स्कीमा को फ़ेच करने के लिए, ↻ कस्टम कार्रवाइयां फिर से लोड करें पर क्लिक करना होगा. साथ ही, यूज़र इंटरफ़ेस (यूआई) में अलग-अलग टूल (add और subtract) को मैन्युअल तरीके से चालू या बंद करना होगा.
  • एजेंट रजिस्ट्री से इंपोर्ट करना (REGISTRY_MCP इस कोडलैब में इस्तेमाल किया गया वर्कफ़्लो): एजेंट रजिस्ट्री से एमसीपी सर्वर इंपोर्ट करने पर, एजेंट रजिस्ट्री, एमसीपी एंडपॉइंट, उसके इंटरफ़ेस मेटाडेटा, और उसके टूल कैटलॉग (connectorModes: ["FEDERATED"]) के लिए भरोसेमंद सोर्स के तौर पर काम करती है. Gemini Enterprise, इंजन के एजेंट गेटवे के ज़रिए, रजिस्टर किए गए एमसीपी टूल को रनटाइम में अपने-आप चालू कर देता है. इसके लिए, आपको डेटा स्टोर के यूज़र इंटरफ़ेस (यूआई) में मैन्युअल तरीके से रीलोड करने या टॉगल करने की ज़रूरत नहीं होती.

Gemini Enterprise ऐप्लिकेशन के बारे में जानकारी यहां खत्म होती है... अब पुष्टि करें सेक्शन पर जाएं.

8. पुष्टि करें

इस सेक्शन में, Gemini Enterprise के वेब ऐप्लिकेशन से एमसीपी टूल के लाइव कॉल ट्रिगर किए जाएंगे. साथ ही, एजेंट गेटवे, Cloud DNS, वीपीसी फ़ायरवॉल, और Cloud Run के लॉग में अनुरोध के फ़्लो को ट्रेस किया जाएगा. इसके बाद, IAM की यूनिफ़ाइड ऐक्सेस नीति को ज़्यादा पाबंदियों वाला बना दिया जाएगा, ताकि subtract को अनुमति दी जा सके और add को ब्लॉक किया जा सके. इससे गेटवे पर ज़ीरो-ट्रस्ट एनफ़ोर्समेंट की पुष्टि हो जाएगी.

उपयोगकर्ता ऐक्सेस

Gemini Enterprise के वेब ऐप्लिकेशन का यूआरएल बनाएं:

# fetch app user url
export GE_WIDGET_ID=$(curl -s "https://${GE_LOCATION}-discoveryengine.googleapis.com/v1/projects/${PROJ_ID}/locations/${GE_LOCATION}/collections/default_collection/engines/${GE_APP_ID}/widgetConfigs/default_search_widget_config" \
  -H "Authorization: Bearer $(gcloud auth application-default print-access-token)" \
  -H "X-Goog-User-Project: ${PROJ_ID}" \
  -H "Content-Type: application/json" \
  | jq -r '.configId')

export GE_APP_USER_URL="https://vertexaisearch.cloud.google.com/home/cid/${GE_WIDGET_ID}"

echo "app user url: ${GE_APP_USER_URL}"

अपने ब्राउज़र में Gemini Enterprise के वेब ऐप्लिकेशन का चैट इंटरफ़ेस खोलने के लिए, लिंक पर जाएं. इसके बाद, शुरू करें पर क्लिक करें.

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

चैट के यूज़र इंटरफ़ेस (यूआई) में, चैट बॉक्स में सबसे नीचे मौजूद कनेक्टर के लिए पज़ल पीस आइकॉन पर क्लिक करके पुष्टि करें कि math-wizard-collection डेटा कनेक्टर चालू है. आपको एक टॉगल बटन दिखेगा, जो चालू (रंग में दिखता है) होगा.

यहां दी गई टेस्ट क्वेरी आज़माएं:

what is 2342345 - 98234798324?
what is 72347234 + 234234?

पुष्टि करें कि Assistant सही जवाब दे रही हो. साथ ही, हर जवाब के नीचे कार्रवाई के उद्धरण वाला इंटरैक्टिव बैज (जैसे कि Math Calculation (8s) 🤖 Agentgateway Agent) दिखा रही हो. इससे यह पुष्टि होती है कि टूल का इस्तेमाल किया गया है.

Cloud Logging में लॉग की जांच करना

Cloud Logging में लॉग की जांच करके पुष्टि करें कि Gemini Enterprise ने टूल कॉल को एजेंट गेटवे और निजी वीपीसी नेटवर्क के ज़रिए रूट किया है.

1. एजेंट गेटवे और आईएपी की अनुमति की पुष्टि करना

पुष्टि करें कि एजेंट गेटवे ने अनुरोध को इंटरसेप्ट किया है, एजेंट रजिस्ट्री में टारगेट को हल किया है, IAP को अनुमति दी है, और टूल कॉल की अनुमति दी है:

# show agent gateway logs
gcloud logging read 'resource.type="networkservices.googleapis.com/Gateway"' \
  --project=${PROJ_ID} \
  --limit=5 \
  --format="table( \
    timestamp.date(tz=LOCAL):label=TIMESTAMP, \
    httpRequest.status:label=STATUS, \
    httpRequest.serverIp:label=SERVER_IP, \
    jsonPayload.agentGatewayInfo.mcpInfo.method:label=MCP_METHOD, \
    jsonPayload.agentGatewayInfo.mcpInfo.parameter:label=TOOL, \
    jsonPayload.authzPolicyInfo.result:label=AUTHZ, \
    jsonPayload.agentGatewayInfo.agentRegistryResource.basename():label=REGISTRY_MCP
  )"

पुष्टि करें कि आउटपुट में ये शामिल हैं:

  • STATUS: 200 (सफल तरीके से लागू किया गया) और 202 (notifications/initialized हैंडशेक).
  • SERVER_IP: Google APIs PSC एंडपॉइंट आईपी (172.16.20.20:443).
  • MCP_METHOD और TOOL: एमसीपी प्रोटोकॉल सीक्वेंस (notifications/initialized, tools/list, और tools/call के साथ add या subtract).
  • AUTHZ: ALLOWED (IAP ऑथराइज़ेशन के लिए, डेटा को बाहर भेजने की अनुमति है).
  • REGISTRY_MCP: एजेंट रजिस्ट्री के हल किए गए संसाधन का आईडी (agentregistry-...).

2. डीएनएस और फ़ायरवॉल ट्रांज़िट की पुष्टि करना

पुष्टि करें कि Cloud DNS ने होस्टनेम को पीएससी एंडपॉइंट में बदल दिया हो और फ़ायरवॉल ने एजेंट गेटवे इंटरफ़ेस से ट्रैफ़िक को अनुमति दी हो:

# show dns logs
gcloud logging read 'resource.type="dns_query"' \
  --project=${PROJ_ID} \
  --limit=5 \
  --format="table( \
    timestamp.date(tz=LOCAL):label=TIMESTAMP, \
    jsonPayload.queryName:label=QUERY_NAME, \
    jsonPayload.queryType:label=TYPE, \
    jsonPayload.responseCode:label=RCODE, \
    jsonPayload.rdata:label=RDATA
  )"
# show firewall logs
gcloud logging read 'logName:"compute.googleapis.com%2Ffirewall"' \
  --project=${PROJ_ID} \
  --limit=5 \
  --format="table( \
    timestamp.date(tz=LOCAL):label=TIMESTAMP, \
    jsonPayload.connection.src_ip:label=SRC_IP, \
    jsonPayload.connection.dest_ip:label=DEST_IP, \
    jsonPayload.connection.dest_port:label=PORT, \
    jsonPayload.rule_details.reference.basename():label=RULE, \
    jsonPayload.disposition:label=DISPOSITION
  )"

इन वैल्यू की पुष्टि करें:

  • डीएनएस QUERY_NAME & RDATA: math-wizard-...run.app. (A रिकॉर्ड, NOERROR) को 172.16.20.20 में बदलता है.
  • फ़ायरवॉल SRC_IP और DEST_IP: 192.168.10.2 (एजेंट गेटवे पीएससी इंटरफ़ेस आईपी) से 172.16.20.20:443.
  • फ़ायरवॉल RULE और DISPOSITION: firewallPolicy:fw-policy-..., ALLOWED से मेल खाता है.

3. Cloud Run टूल के एक्ज़ीक्यूशन की पुष्टि करना

पुष्टि करें कि Cloud Run कंटेनर को टूल कॉल मिला और उसने उसे प्रोसेस किया:

# show cloud run logs
gcloud logging read 'resource.type="cloud_run_revision"
  AND textPayload:"Tool:"' \
  --project=${PROJ_ID} \
  --limit=5 \
  --format="value(timestamp.date(tz=LOCAL), textPayload)"

पुष्टि करें कि textPayload में टूल के इस्तेमाल की एंट्री दिख रही हैं. जैसे, >>> 🛠️ Tool: 'subtract' called with numbers '[x]' and '[y]'.

कम से कम अधिकारों वाली नीति को लागू करने की जांच करना

IAM की शुरुआती ऐक्सेस नीति में, किसी भी तरीके या टूल का इस्तेमाल करने की अनुमति थी. हालांकि, इसके लिए ज़रूरी था कि डेस्टिनेशन रजिस्टर किया गया हो (destination.is_registered == true). इस चरण में, नीति को अपडेट करें, ताकि कम से कम विशेषाधिकार लागू किए जा सकें. इसके लिए, सिर्फ़ subtract टूल को अनुमति दें और add को ब्लॉक करें.

IAM ऐक्सेस नीति अपडेट करना

एमसीपी टूल के एक्ज़ीक्यूशन को सीमित करते समय, दो नियमों वाले पैटर्न का इस्तेमाल करें:

  1. पहला नियम (एमसीपी की खोज और हैंडशेक): यह टूल कॉल के अलावा, एमसीपी के लाइफ़साइकल के तरीकों (destination.is_registered == true और destination.agent_registry.mcp_server.method != 'tools/call') को अनुमति देता है. Gemini Enterprise, टूल को चालू करने से पहले स्ट्रीम सेटअप और खोज (initialize, notifications/initialized, tools/list) के बारे में बातचीत करता है. साथ ही, destination.agent_registry.mcp_server.tool.name सिर्फ़ tools/call के दौरान दिखता है. इसलिए, सेशन शुरू करने और कैटलॉग की खोज करने की सुविधा को चालू रखने के लिए, पहला नियम ज़रूरी है.
  2. नियम 2 (टूल-लेवल पर पाबंदी): यह tools/call के इस्तेमाल पर पाबंदी लगाता है, ताकि सिर्फ़ subtract टूल का इस्तेमाल किया जा सके (destination.is_registered == true, destination.agent_registry.mcp_server.method == 'tools/call', और destination.agent_registry.mcp_server.tool.name == 'subtract').

ऐक्सेस की नीति के नियम वाली मेनिफ़ेस्ट फ़ाइल को इन दोनों नियमों के साथ अपडेट करें:

# create access policy rule file (update: allow subtract only)
cat > cfg/${UAP_POLICY_NAME}-rule-update.json << EOF
[
  {
    "description": "allow ge assistant to any registered endpoint to perform mcp discovery and handshake",
    "effect": "ALLOW",
    "principals": [
      "principal://${TRUST_DOMAIN}/resources/discoveryengine/projects/${PROJ_NO}/locations/global/engines/${GE_APP_ID}/assistants/default_assistant/agents/default/core_assistant"
    ],
    "operation": {
      "permissions": [
        "iap.googleapis.com/resources.egressViaIAP"
      ]
    },
    "conditions": {
      "iap.googleapis.com": {
        "expression": \
        "destination.is_registered == true && \
         destination.agent_registry.mcp_server.method != 'tools/call'"
      }
    }
  },
  {
    "description": "allow ge assistant to any registered mcp server with tool call subtract",
    "effect": "ALLOW",
    "principals": [
      "principal://${TRUST_DOMAIN}/resources/discoveryengine/projects/${PROJ_NO}/locations/global/engines/${GE_APP_ID}/assistants/default_assistant/agents/default/core_assistant"
    ],
    "operation": {
      "permissions": [
        "iap.googleapis.com/resources.egressViaIAP"
      ]
    },
    "conditions": {
      "iap.googleapis.com": {
        "expression": \
        "destination.is_registered == true && \
         destination.agent_registry.mcp_server.method == 'tools/call' && \
         destination.agent_registry.mcp_server.tool.name == 'subtract'"
      }
    }
  }
]
EOF

IAM ऐक्सेस की नीति में अपडेट किए गए नियमों को लागू करें:

# update iam access policy
gcloud iam access-policies update ${UAP_POLICY_NAME} \
  --details-rules=cfg/${UAP_POLICY_NAME}-rule-update.json \
  --project=${PROJ_ID} \
  --location=global

आईएएम ऐक्सेस नीति की पुष्टि करना

देखें कि नई IAM ऐक्सेस नीति लागू हो गई हो और सिर्फ़ घटाने वाले टूल को अनुमति मिली हो:

# show iam access policy details
gcloud iam access-policies describe ${UAP_POLICY_NAME} \
  --project=${PROJ_ID} \
  --location=global \
  --flatten="details.rules[]" \
  --format="table( \
    details.rules.principals[0].scope(engines).sub('assistants/default_assistant/agents/default', '...'):label=PRINCIPAL, \
    details.rules.effect:label=EFFECT, \
    details.rules.conditions.'iap.googleapis.com'.expression.sub('\s*&&\s*', '\n&& ').sub('\s*\|\|\s*', '\n|| '):label=EXPRESSION
  )"

प्रतिबंधित टूल कॉल की जांच करना

Gemini Enterprise के वेब ऐप्लिकेशन के चैट यूज़र इंटरफ़ेस (यूआई) पर वापस जाएं और कोई दूसरी टेस्ट क्वेरी आज़माएँ:

what is 100 plus 20?

Assistant, add को चालू करने की कोशिश करता है. हालांकि, Agent Gateway और IAP, IAM नीति की शर्त को false के तौर पर देखते हैं और HTTP 403 Forbidden के साथ एग़््रेस अनुरोध को अस्वीकार कर देते हैं. चैट यूज़र इंटरफ़ेस (यूआई) में, आपको असिस्टेंट डिसप्ले Calculate Sum दिखेगा. साथ ही, ब्लॉक किए गए टूल कॉल को फिर से करने पर, 🤖 Agentgateway Agent ... Working on it. स्पिन होता दिखेगा. ऐसा होना आम बात है. इससे पुष्टि होती है कि Agent Gateway और IAP, नेटवर्क लेवल पर उन टूल को इंटरसेप्ट कर रहे हैं जिन्हें इस्तेमाल करने की अनुमति नहीं है. साथ ही, उन्हें एक्ज़ीक्यूट करने से रोक रहे हैं.

Cloud Logging में लॉग की फिर से जांच करना

Agent Gateway की लॉग एंट्री देखें. साथ ही, add टूल कॉल की अनुमति न होने से जुड़ी नई 403 एंट्री देखें:

# show agent gateway logs
gcloud logging read 'resource.type="networkservices.googleapis.com/Gateway"' \
  --project=${PROJ_ID} \
  --limit=5 \
  --format="table( \
    timestamp.date(tz=LOCAL):label=TIMESTAMP, \
    httpRequest.status:label=STATUS, \
    httpRequest.serverIp:label=SERVER_IP, \
    jsonPayload.agentGatewayInfo.mcpInfo.method:label=MCP_METHOD, \
    jsonPayload.agentGatewayInfo.mcpInfo.parameter:label=TOOL, \
    jsonPayload.authzPolicyInfo.result:label=AUTHZ, \
    jsonPayload.agentGatewayInfo.agentRegistryResource.basename():label=REGISTRY_MCP
  )"

अनुमानित आउटपुट:

TIMESTAMP            STATUS  SERVER_IP         MCP_METHOD                 TOOL  AUTHZ    REGISTRY_MCP
YYYY-MM-DDTHH:MM:SS  403                       tools/call                 add   DENIED   agentregistry-00000000-0000-0000-0012-3456789abcde
YYYY-MM-DDTHH:MM:SS  403
YYYY-MM-DDTHH:MM:SS  202     172.16.20.20:443  notifications/initialized        ALLOWED  agentregistry-00000000-0000-0000-0012-3456789abcde
YYYY-MM-DDTHH:MM:SS          172.16.20.20:443                                   ALLOWED  agentregistry-00000000-0000-0000-0012-3456789abcde
YYYY-MM-DDTHH:MM:SS  200     172.16.20.20:443  initialize                       ALLOWED  agentregistry-00000000-0000-0000-0012-3456789abcde

देखें कि अतिरिक्त अनुरोध, Cloud Run बैकएंड तक न पहुंचा हो:

# show cloud run logs
gcloud logging read 'resource.type="cloud_run_revision"
  AND textPayload:"Tool:"' \
  --project=${PROJ_ID} \
  --limit=5 \
  --format="value(timestamp.date(tz=LOCAL), textPayload)"

इस कमांड से कोई नई एंट्री नहीं मिलती है. इससे पुष्टि होती है कि एजेंट गेटवे ने IAM ऐक्सेस नीति को लागू कर दिया है.

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

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

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

Gemini Enterprise के कॉम्पोनेंट हटाना

# delete gemini enterprise engine (app)
curl -s -X DELETE "https://${GE_LOCATION}-discoveryengine.googleapis.com/v1/projects/${PROJ_ID}/locations/${GE_LOCATION}/collections/default_collection/engines/${GE_APP_ID}" \
  -H "Authorization: Bearer $(gcloud auth application-default print-access-token)" \
  -H "X-Goog-User-Project: ${PROJ_ID}"

# delete custom mcp collection, data connector, and backing data store
curl -s -X DELETE "https://${GE_LOCATION}-discoveryengine.googleapis.com/v1alpha/projects/${PROJ_ID}/locations/${GE_LOCATION}/collections/${GE_COLLECTION_ID}" \
  -H "Authorization: Bearer $(gcloud auth application-default print-access-token)" \
  -H "X-Goog-User-Project: ${PROJ_ID}"

# reset identity provider configuration
curl -s -X PATCH "https://${GE_LOCATION}-discoveryengine.googleapis.com/v1/projects/${PROJ_ID}/locations/${GE_LOCATION}/aclConfig" \
  -H "Authorization: Bearer $(gcloud auth application-default print-access-token)" \
  -H "X-Goog-User-Project: ${PROJ_ID}" \
  -H "Content-Type: application/json" \
  -d '{"idpConfig":{"idpType":"IDP_TYPE_UNSPECIFIED"}}'

एमसीपी सर्वर के कॉम्पोनेंट हटाना

# delete agent registry service
gcloud -q agent-registry services delete ${MCP_NAME} \
  --location=${REGION} \
  --project=${PROJ_ID}

# delete cloud run service, source-deploy artifact registry repo, and staging bucket
gcloud -q run services delete ${MCP_NAME} \
  --region=${REGION} \
  --project=${PROJ_ID}

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

gcloud -q storage rm --recursive gs://run-sources-${PROJ_ID}-${REGION} \
  --project=${PROJ_ID}

एजेंट गेटवे और आईएएम ऐक्सेस नीतियों को हटाना

# delete gateway authorization policy, iap extension, and agent gateway
gcloud -q network-security authz-policies delete ${AGW_NAME}-authz-policy-iap \
  --location=${REGION} \
  --project=${PROJ_ID}

gcloud -q service-extensions authz-extensions delete ${AGW_NAME}-svc-ext-authz-iap \
  --location=${REGION} \
  --project=${PROJ_ID}

gcloud -q network-services agent-gateways delete ${AGW_NAME} \
  --location=${REGION} \
  --project=${PROJ_ID}
# delete iam policy binding and access policy
gcloud -q iam policy-bindings delete ${UAP_BINDING_NAME} \
  --location=global \
  --project=${PROJ_ID}

gcloud -q iam access-policies delete ${UAP_POLICY_NAME} \
  --location=global \
  --project=${PROJ_ID}

डीएनएस और फ़ायरवॉल कॉम्पोनेंट हटाना

# delete dns record set, managed zone, and policy
gcloud -q dns record-sets delete "*.run.app." \
  --type=A \
  --zone=priv-zone-run \
  --project=${PROJ_ID}

gcloud -q dns managed-zones delete priv-zone-run \
  --project=${PROJ_ID}

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

gcloud -q dns policies delete dns-policy-${SLUG} \
  --project=${PROJ_ID}
# delete firewall policy association, rule, and policy
gcloud -q compute network-firewall-policies associations delete \
  --name=fw-policy-bind-${SLUG} \
  --firewall-policy=fw-policy-${SLUG} \
  --global-firewall-policy \
  --project=${PROJ_ID}

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

gcloud -q compute network-firewall-policies delete fw-policy-${SLUG} \
  --global \
  --project=${PROJ_ID}

पीएसएसी और वीपीसी नेटवर्क कॉम्पोनेंट हटाना

# delete psc forwarding rule and internal ip address
gcloud -q compute forwarding-rules delete psc2gapis \
  --global \
  --project=${PROJ_ID}

gcloud -q compute addresses delete ip-psc2gapis \
  --global \
  --project=${PROJ_ID}
# delete psc network attachment, subnet, and vpc network
gcloud -q compute network-attachments delete psc-na-${REGION}-agw \
  --region=${REGION} \
  --project=${PROJ_ID}

gcloud -q compute networks subnets delete subnet-${REGION}-agw \
  --region=${REGION} \
  --project=${PROJ_ID}

gcloud -q compute networks delete vnet-${SLUG} \
  --project=${PROJ_ID}

संगठन की नीति के उल्लंघन और डिवाइस पर मौजूद फ़ाइलों को हटाना

# delete project-level organization policy overrides
gcloud -q org-policies delete discoveryengine.managed.disableCustomMcpServerConnector --project=${PROJ_ID}
gcloud -q org-policies delete iam.managed.disableAccessPolicyBinding --project=${PROJ_ID}
# remove local project files
rm -rf cfg math-wizard

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

10. नतीजा

बधाई हो! आपने एक ऐसा एंड-टू-एंड आर्किटेक्चर बनाया है जिसकी मदद से, Gemini Enterprise ऐप्लिकेशन, निजी कस्टम एमसीपी सर्वर पर मौजूद टूल को सुरक्षित तरीके से ढूंढ सकता है और उन्हें चालू कर सकता है:

  • कस्टम एमसीपी सर्वर और एजेंट रजिस्ट्री: Cloud Run (--ingress=internal) पर एक निजी FastMCP सेवा डिप्लॉय की गई है. साथ ही, इसके एंडपॉइंट और टूल स्कीमा (add और subtract) को एजेंट रजिस्ट्री में रजिस्टर किया गया है.
  • Gemini Enterprise इंटिग्रेशन: Gemini Enterprise ऐप्लिकेशन उपलब्ध कराया गया है. साथ ही, आउटबाउंड टूल के ट्रैफ़िक को Agent Gateway से बाइंड किया गया है. इसके अलावा, रजिस्टर किए गए एमसीपी सर्वर को REGISTRY_MCP डेटा कनेक्टर के तौर पर अटैच किया गया है.
  • प्राइवेट वीपीसी इग्रेस और ज़ीरो-ट्रस्ट गवर्नेंस: पीएससी (172.16.20.20) पर निजी तौर पर टूल एक्ज़ीक्यूशन को रूट किया गया और आईएपी और आईएएम की यूनिफ़ाइड ऐक्सेस नीतियों (destination.agent_registry.*) का इस्तेमाल करके, टूल-लेवल पर कम से कम ज़रूरी अनुमतियां लागू की गईं.

cosmopup

Cosmpup को लगता है कि कोडलैब बहुत अच्छे हैं!

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

इस सुझाव/राय देने या शिकायत करने वाले फ़ॉर्म का इस्तेमाल करके, बेझिझक टिप्पणियां करें, सवाल पूछें या सुधार के बारे में बताएं.

धन्यवाद!