การออกของ Agent Gateway จาก Agent Runtime ไปยัง MCP ภายนอก

1. บทนำ

Codelab นี้จะสำรวจการกำกับดูแลขาออกของ Agent Gateway สำหรับ Agent AI ที่เข้าถึงเซิร์ฟเวอร์ Model Context Protocol (MCP) ภายนอกที่โฮสต์อยู่นอก Google Cloud

แอป AI ตั้งแต่แชทบอทแบบสแตนด์อโลนไปจนถึงระบบอัตโนมัติที่มีเวิร์กโฟลว์แบบหลายเอเจนต์สามารถเรียกใช้เครื่องมือภายนอกแบบไดนามิกได้ การให้สิทธิ์เข้าถึงที่ควบคุมแก่เอเจนต์เพื่อค้นหาฐานข้อมูล ดึงเนื้อหาเว็บ และดำเนินการต่างๆ เป็นสิ่งจำเป็นสำหรับเอเจนต์ที่ปลอดภัยและมีประสิทธิภาพ อย่างไรก็ตาม ในสภาพแวดล้อมขององค์กร การรักษาความปลอดภัยในการดำเนินการเครื่องมือของเอเจนต์เป็นเรื่องที่ท้าทาย หากตัวแทนมีสิทธิ์เข้าถึงเครือข่ายโดยตรง การโจมตีแบบแทรกพรอมต์หรือการหลอนของโมเดลอาจทำให้ตัวแทนขโมยข้อมูลที่ละเอียดอ่อนหรือเรียกใช้คำสั่งที่เป็นอันตรายได้

Agent Gateway มีจุดบังคับใช้แบบรวมศูนย์และแบบ Zero Trust ที่ผสานรวมเข้ากับสถาปัตยกรรมแพลตฟอร์มตัวแทนโดยตรงเพื่อจัดการตัวแทนอัตโนมัติในวงกว้าง Agent Gateway จะให้การกำหนดเส้นทางเครือข่าย การกำกับดูแล Agent และการรักษาความปลอดภัยขณะรันไทม์ที่บังคับใช้ในระดับแพลตฟอร์ม แทนที่จะอาศัยการติดตั้งใช้งานที่กำหนดเองซึ่งไม่ซ้ำกันในโค้ดแอปพลิเคชันหรือ Agent แต่ละรายการ

เมื่อ Agent Gateway ทำงานในโหมดขาออก (agent-to-anywhere) ระบบจะพร็อกซีคำขอขาออกทั้งหมดจากเอเจนต์ที่กำหนดค่าให้ใช้เกตเวย์ ระบบจะตรวจสอบสิทธิ์คำขอภาระงานของเอเจนต์แต่ละรายการโดยใช้ข้อมูลประจำตัวของเอเจนต์ที่ไม่ซ้ำกัน และให้สิทธิ์โดยใช้นโยบาย Identity-Aware Proxy (IAP) การเรียกใช้เครื่องมือ MCP จะได้รับการถอดรหัสและตรวจสอบแบบไดนามิกเพื่อการบังคับใช้นโยบาย ผู้ดูแลระบบความปลอดภัยสามารถบังคับใช้สิทธิ์แบบละเอียดจากส่วนกลางเพื่อให้มั่นใจว่าตัวแทนจะเรียกใช้ได้เฉพาะปลายทางและวิธีการที่ได้รับอนุมัติเท่านั้น

สิ่งที่คุณสร้าง

  • Agent Gateway ในโหมดขาออก (agent-to-anywhere)
  • ส่วนขยายการให้สิทธิ์ Identity-Aware Proxy (IAP)
  • Agent ADK ของ Agent Runtime ที่มีข้อมูลระบุตัวตนของ Agent
  • Agent Registry ที่มี API ของ Google และปลายทาง MCP
  • การเชื่อมต่อเครื่องมือ MCP ภายนอกกับชุดข้อมูลสาธารณะของ Data Commons
  • นโยบายการให้สิทธิ์ที่มีการควบคุมการเข้าถึง IAM

figure1

รูปที่ 1 สถาปัตยกรรม Codelab

สิ่งที่คุณจะได้เรียนรู้

  • วิธีติดตั้งใช้งาน Agent Gateway ในลําดับการกําหนดค่าที่มีโครงสร้าง
  • วิธีเปลี่ยนนโยบายการให้สิทธิ์จากโหมดทดลองเรียกใช้เป็นโหมดบังคับใช้
  • วิธีลงทะเบียนปลายทาง Google API และเซิร์ฟเวอร์ MCP ใน Agent Registry
  • วิธีใช้นโยบายการให้สิทธิ์แบบมีเงื่อนไขตามแอตทริบิวต์โปรโตคอล MCP
  • วิธีตรวจสอบบันทึกของ Agent Gateway เพื่อตรวจสอบการควบคุมการออก

สิ่งที่ต้องมี

  • โปรเจ็กต์ Google Cloud ที่เปิดใช้การเรียกเก็บเงิน
  • สิทธิ์ IAM ในการจัดสรรบริการเครือข่ายและทรัพยากร Agent Platform
  • Shell ที่เข้ากันได้กับ POSIX (bash หรือ zsh) ที่ติดตั้ง Google Cloud CLI (คอมโพเนนต์ gcloud และ bq)
  • เครื่องมือบรรทัดคำสั่ง: git, curl, jq (ตัวประมวลผล JSON), Python 3 และ uv (ตัวจัดการแพ็กเกจ Python)
  • คีย์ Data Commons API ฟรีสำหรับเข้าถึงชุดข้อมูลทดสอบการค้นหา

2. แนวคิด

ลำดับการติดตั้งใช้งาน

Codelab นี้จะทำตามลำดับการกำหนดค่าที่มีโครงสร้างเพื่อให้ตัวแทนเข้าถึงทรัพยากรที่จำเป็นได้เมื่อเริ่มต้น และยืนยันการเชื่อมต่อได้ก่อนที่จะใช้นโยบายการเข้าถึงที่บังคับใช้

Codelab นี้ใช้ลำดับการติดตั้งใช้งานต่อไปนี้

  1. เริ่มต้นในโหมด DRY_RUN: ตรวจสอบว่าคำขอของตัวแทนมาถึงเกตเวย์และผ่านไปได้สำเร็จ (โหมดตรวจสอบเท่านั้น)
  2. ลงทะเบียนบริการทั้งหมด: ลงทะเบียนคอมโพเนนต์เอเจนต์ทั้งหมดในรีจิสทรีของเอเจนต์และยืนยันสิทธิ์เข้าถึงเครื่องมือของเอเจนต์
  3. สร้างนโยบายการให้สิทธิ์: สร้างและใช้นโยบายการให้สิทธิ์เพื่ออนุญาตให้มีการรับส่งข้อมูลขาออกจากเอเจนต์ไปยังเซิร์ฟเวอร์และปลายทางของ MCP
  4. เปลี่ยนไปใช้โหมด ENFORCED: อัปเดตนโยบายส่วนขยายการให้สิทธิ์เพื่อบังคับใช้นโยบายและบล็อกการรับส่งข้อมูลขาออกที่ไม่ได้รับอนุญาต

figure2

รูปที่ 2 ลำดับการติดตั้งใช้งาน

โทโพโลยีการกำหนดเส้นทางขาออก

ขาออกของ Agent Gateway (agent-to-anywhere) ทำหน้าที่เป็นพร็อกซีขาออกแบบรวมศูนย์และแบบ Zero Trust สำหรับภาระงานที่เป็น Agent เมื่อเอเจนต์ส่งคำขอไปยังเครื่องมือหรือ API ภายนอก Agent Gateway จะสกัดกั้นคำขอขาออกและประเมินตามนโยบายการกำกับดูแลก่อนกำหนดเส้นทางไปยังปลายทาง ในสถาปัตยกรรม Google Cloud Agent Platform นั้น Agent Gateway จะให้การเชื่อมต่อ Data Plane กับบริการต่อไปนี้

  • เครือข่ายส่วนตัว (VPC): การรับส่งข้อมูลขาออกที่กำหนดเป้าหมายเป็น API ภายในขององค์กร, ไมโครเซอร์วิส, ฐานข้อมูลที่โฮสต์ภายใน VPC ส่วนตัว และเครือข่ายในองค์กรหรือข้ามระบบคลาวด์ที่เข้าถึงได้ผ่านการเชื่อมต่อแบบผสม
  • เครือข่ายภายนอก (อินเทอร์เน็ต): การรับส่งข้อมูลขาออกที่กำหนดเป้าหมายไปยังบริการเว็บของบุคคลที่สาม, API ของ SaaS หรือปลายทางสาธารณะ
  • บริการ AI และแพลตฟอร์มเอเจนต์: การรับส่งข้อมูลขาออกที่กำหนดเป้าหมายไปยัง Google Cloud API ที่มีการจัดการ, โมเดลพื้นฐาน, จุดปลายทาง Google MCP (เช่น BigQuery) และบริการการกำกับดูแลแพลตฟอร์ม (Agent Registry และนโยบาย IAP)

figure3

รูปที่ 3 โทโพโลยีการกำหนดเส้นทางขาออกของ Agent Gateway

Codelab นี้มุ่งเน้นที่การรับส่งข้อมูลขาออกจาก Agent ที่กำหนดเองใน Agent Runtime ซึ่งกำหนดเป้าหมายไปยังปลายทางเซิร์ฟเวอร์ MCP ของบุคคลที่สามภายนอกที่เข้าถึงได้ผ่านอินเทอร์เน็ต

การตรวจสอบโปรโตคอล MCP

การออกของ Agent Gateway (agent-to-anywhere) สามารถแยกวิเคราะห์เนื้อหาของคำขอ MCP และประเมินนโยบายการเข้าถึงตามแอตทริบิวต์โปรโตคอลแบบละเอียด นโยบายขาออกจากเซิร์ฟเวอร์ของตัวแทนไปยัง MCP สามารถมีเงื่อนไขที่แสดงใน Common Expression Language (CEL) ซึ่งบังคับใช้ในรันไทม์กับทุกคำขอ

โดยปกติแล้วการเรียก MCP จะใช้รูปแบบโปรโตคอลแบบมีสาย JSON-RPC และการรับส่ง HTTP รายละเอียดของเมธอด MCP ที่เรียกใช้ (เช่น tools/call) ชื่อเครื่องมือเป้าหมาย และอาร์กิวเมนต์ใดๆ จะอยู่ในเพย์โหลด JSON ในเนื้อหา HTTP

Agent Gateway จะดึงแอตทริบิวต์ iap.googleapis.com/mcp.toolName โดยการแยกวิเคราะห์เนื้อหา JSON เพื่อหารหัสเครื่องมือที่ระบุในคำขอ

โดยปกติแล้ว ระบบจะไม่ส่งแอตทริบิวต์ เช่น iap.googleapis.com/mcp.tool.isReadOnly และ mcp.tool.isDestructive ในเนื้อหาคำขอแต่ละรายการ แต่จะเป็นคำอธิบายประกอบ (ข้อมูลเมตา) ที่เชื่อมโยงกับเครื่องมือแทน ดังนั้นเมื่อ Agent Gateway ดึง toolName จากเนื้อหา ระบบจะค้นหาคำจำกัดความของเครื่องมือและพร็อพเพอร์ตี้ที่เชื่อมโยงจาก Agent Registry ซึ่งเป็นที่ที่ลงทะเบียนเนื้อหา toolspec.json

figure4

รูปที่ 4 การตรวจสอบ MCP ของ Agent Gateway

นิพจน์ CEL ที่ใช้ในเงื่อนไข IAM ของ IAP จะใช้รูปแบบมาตรฐาน api.getAttribute('iap.googleapis.com/ATTRIBUTE_NAME', 'DEFAULT_VALUE')== 'DESIRED_VALUE'

ตารางนี้อธิบายแอตทริบิวต์การกํากับดูแลขาออกของ Agent Gateway ที่ใช้กับคําขอของเซิร์ฟเวอร์ MCP ได้

แอตทริบิวต์

วิธีการ / ตำแหน่ง MCP

คำอธิบาย

mcp.toolName

tools/call (เนื้อหา)

ตัวระบุเครื่องมือเป้าหมายที่ขอในเพย์โหลด RPC (เช่น "delete_instance")

mcp.tool.isReadOnly

Agent Registry (toolspec.json)

ระบุว่าเครื่องมือเป็นแบบอ่านอย่างเดียว (ไม่แก้ไขสภาพแวดล้อม)

mcp.tool.isDestructive

Agent Registry (toolspec.json)

ระบุว่าการเรียกใช้เครื่องมืออาจทำให้เกิดการแก้ไขที่ไม่สามารถย้อนกลับได้หรือข้อมูลสูญหายหรือไม่

mcp.tool.isIdempotent

Agent Registry (toolspec.json)

ระบุว่าการเรียกใช้เครื่องมือซ้ำๆ ด้วยอาร์กิวเมนต์ที่เหมือนกันจะทำให้เกิดสถานะเดียวกันทุกประการหรือไม่

mcp.tool.isOpenWorld

Agent Registry (toolspec.json)

ระบุว่าเครื่องมือเข้าถึงระบบภายในที่จำกัดไปยังอินเทอร์เน็ตสาธารณะที่ไม่จำกัดหรือไม่

ส่วนนี้เป็นส่วนของแนวคิด... ต่อไปจะเป็นส่วนการตั้งค่า

3. ตั้งค่า

บทบาท IAM ที่จำเป็น

คุณต้องมีบทบาทต่อไปนี้เพื่อสร้างทรัพยากรใน Codelab นี้

หมวดหมู่

บทบาท IAM (รหัส) ที่ต้องมี

คำอธิบาย

การจัดการ API

roles/serviceusage.serviceUsageAdmin

เปิดใช้บริการ Google Cloud API

เครือข่ายและเกตเวย์

roles/networkservices.admin

จัดสรร Agent Gateway

ส่วนขยายบริการ

roles/serviceextensions.admin

กำหนดค่าส่วนขยายการกำหนดเส้นทาง

การรักษาความปลอดภัยของเครือข่าย

roles/networksecurity.admin

ติดตั้งใช้งานนโยบายการให้สิทธิ์

Agent Registry

roles/agentregistry.admin

โฮสต์ที่อนุญาตของแคตตาล็อก

Vertex AI และเอเจนต์

roles/aiplatform.admin

ทำให้ภาระงาน Agent Runtime ใช้งานได้

นโยบายขาออก

roles/iap.admin

ใช้นโยบาย roles/iap.egressor

Cloud Storage

roles/storage.admin

จัดการที่เก็บข้อมูลการจัดเตรียมการทำให้ใช้งานได้

บันทึกและการตรวจสอบ

roles/logging.viewer

ตรวจสอบการติดตามและบันทึกการตรวจสอบ

หรือจะใช้บทบาทพื้นฐานแบบกว้าง เช่น roles/admin หรือบทบาทเดิม roles/owner ก็ได้

เข้าถึงโปรเจ็กต์

Codelab นี้ใช้โปรเจ็กต์ที่อยู่ในระบบคลาวด์ของ Google เดียว ขั้นตอนการกำหนดค่าใช้คำสั่ง CLI ของ gcloud และคำสั่ง Shell ของ Linux

เริ่มต้นด้วยการเข้าถึงบรรทัดคำสั่งของโปรเจ็กต์ที่อยู่ในระบบคลาวด์ของ Google โดยทำดังนี้

ตั้งค่ารหัสโปรเจ็กต์

gcloud config set project SET_YOUR_PROJECT_ID_HERE

ตรวจสอบสิทธิ์เซสชัน

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

ตั้งค่าตัวแปรสภาพแวดล้อมของ Shell

# set custom var for slug (eg, "foo") and region preference
export SLUG="foo"
export REGION="us-central1"
export MREGION="us"
echo ${SLUG}
echo ${REGION}
echo ${MREGION}
# create project vars (automatic)
export PROJ_ID=$(gcloud config list --format="value(core.project)")
export PROJ_NO=$(gcloud projects describe ${PROJ_ID} --format="value(projectNumber)")
export ORG_ID=$(gcloud projects get-ancestors ${PROJ_ID} --format="value(id)" | tail -n 1)
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

เปิดใช้บริการ API

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

ส่วนการตั้งค่าก็มีเพียงเท่านี้... ต่อไปเราจะไปที่ส่วนเกตเวย์

4. เกตเวย์

ก่อนบังคับใช้การควบคุมการเข้าถึง ให้ติดตั้งใช้งาน Agent Gateway และกำหนดค่าส่วนขยายการให้สิทธิ์ในโหมด 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. การให้สิทธิ์

ส่วนขยายการให้สิทธิ์ Agent Gateway สำหรับ Identity-Aware Proxy (IAP) เป็นส่วนขยายบริการประเภทหนึ่งที่ใช้ในการมอบสิทธิ์การตัดสินใจด้านการให้สิทธิ์สำหรับการสื่อสารทั้งหมดของแพลตฟอร์ม Agent

  1. ขั้นตอนการมอบสิทธิ์: เมื่อ Agent พยายามเรียกใช้ปลายทางภายนอกหรือเซิร์ฟเวอร์ MCP ระบบจะกำหนดเส้นทางคำขอไปยัง Agent Gateway เกตเวย์จะใช้ส่วนขยายการให้สิทธิ์เพื่อส่งการเรียกใช้ไปยังบริการประเมิน IAP แทนการประเมินการเข้าถึงในเครื่อง IAP จะประเมินข้อมูลระบุตัวตนของเอเจนต์ (อิงตาม SPIFFE) กับนโยบาย IAM ของทรัพยากรเป้าหมายใน Agent Registry IAP จะส่งการตัดสินใจ ALLOW หรือ DENY กลับไปยังเกตเวย์ ซึ่งจะส่งต่อการเข้าชมหรือบล็อกการเข้าชมด้วยรหัสสถานะ HTTP 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. ฐานของโค้ด

เราดูแลโค้ดของ Agent และสคริปต์การลงทะเบียนปลายทางที่ใช้สำหรับ Codelab นี้ในที่เก็บ Google Cloud GitHub ระยะไกล ขั้นตอนต่อไปนี้จะโคลนที่เก็บในเครื่อง คัดลอกไฟล์ที่จำเป็นไปยังโครงสร้างไดเรกทอรีการทำงานปัจจุบัน แล้วล้างไฟล์ชั่วคราว

ระบบจะสร้างที่เก็บข้อมูลชั่วคราวสำหรับ Agent Runtime เพื่ออัปโหลด สร้าง และทำให้โค้ดของแอปพลิเคชัน Agent ที่แพ็กเกจไว้และอาร์ติแฟกต์ของทรัพยากร Dependency ใช้งานได้

ดึงข้อมูลอาร์ติแฟกต์ระยะไกล

# 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

สร้าง Bucket สำหรับการทดสอบ

# 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 Registry คือพื้นที่เก็บข้อมูลส่วนกลางของเอเจนต์ เซิร์ฟเวอร์ MCP และปลายทาง (API) ทั้งหมดในระบบนิเวศ AI นอกจากนี้ ยังเป็นแคตตาล็อกที่ใช้เพื่อแสดง ค้นหา และค้นพบเครื่องมือและบริการอื่นๆ ที่ลงทะเบียนไว้สำหรับแอปพลิเคชัน AI ได้ด้วย โหมดขาออกของ Agent Gateway (agent-to-anywhere) ใช้รูปแบบข้อมูลรีจิสทรีเป็นกรอบการกำกับดูแลเพื่อบังคับใช้การควบคุมการเข้าถึงขาออก ระบบจะตรวจสอบการให้บทบาท IAM สำหรับผู้ใช้หลักที่เรียกใช้เอเจนต์กับนโยบายที่เชื่อมโยงกับทรัพยากรรีจิสทรี

ในการเริ่มต้นสภาพแวดล้อมและสนับสนุนตัวแทนที่ใช้ Google APIs และบริการต่างๆ จะมีการใช้สคริปต์เพื่อลงทะเบียนชุดปลายทาง 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 เพื่อจัดระเบียบชุดข้อมูลสาธารณะและทำให้ทุกคนเข้าถึงและใช้ประโยชน์จากข้อมูลได้ เป็นบริการฟรีและเข้าถึงได้โดยใช้คีย์ API หลังจากสร้างบัญชี

สร้างคีย์ API

หลังจากสร้างบัญชีแล้ว ให้ทำตามขั้นตอนต่อไปนี้เพื่อรับคีย์ API

  • ลงชื่อเข้าใช้พอร์ทัล API ของ Data Commons
  • คลิกปุ่ม "แอปของฉัน" ที่มุมขวาบน
  • คลิกปุ่ม "+ แอปใหม่" ที่มุมขวาบนใต้ชื่อผู้ใช้
  • ตั้งชื่อแอป (เช่น "Codelab Agent MCP")
  • คลิกปุ่ม "เปิดใช้" สำหรับ Data Commons API api.datacommons.org
  • คลิกปุ่ม "บันทึก" ที่มุมขวาล่าง

ซึ่งจะสร้างคีย์ API และรหัสลับ คลิกไอคอน "คัดลอก" ข้างค่าคีย์เพื่อ "คัดลอกคีย์ API" วางค่าลงในคำสั่งเทอร์มินัลเพื่อตั้งค่าตัวแปรสภาพแวดล้อม DC_API_KEY

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

สร้างเซิร์ฟเวอร์ MCP toolspec

เมื่อลงทะเบียนเซิร์ฟเวอร์ MCP ด้วยตนเอง คุณต้องรวมไฟล์ข้อกำหนดของเครื่องมือในระหว่างการลงทะเบียน การอัปโหลดtoolspec.jsonจะแสดงรายการเครื่องมือทั้งหมดที่ปลายทางจัดเตรียมไว้ให้ และช่วยให้ผู้ใช้รายอื่นค้นพบเครื่องมือเหล่านั้น

test_mcp.py สคริปต์ที่รวมอยู่ในagent-datacommons/โค้ดเบสจะสร้างไฟล์ toolspec.json โดยเชื่อมต่อกับเซิร์ฟเวอร์ MCP เป้าหมาย (ผ่าน SSE หรือ HTTP) และเรียกใช้ list_tools() เพื่อดึงเครื่องมือทั้งหมดที่เซิร์ฟเวอร์แสดง

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

การดูเอาต์พุต toolspec ที่สร้างขึ้นจะแสดงแอตทริบิวต์ MCP ที่ Agent Gateway ใช้ในการประเมินและบังคับใช้นโยบายขาออกได้

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

ลงทะเบียนเซิร์ฟเวอร์ MCP

# 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-datacommons Agent ADK ที่ติดตั้งใช้งานใน Agent Runtime จะได้รับการกำหนดค่าด้วยการตั้งค่าต่อไปนี้ในสคริปต์การติดตั้งใช้งานเพื่อผสานรวมกับ Agent Platform

  • "identity_type": types.IdentityType.AGENT_IDENTITY เพื่อจัดสรรข้อมูลประจำตัวหลักที่ไม่ซ้ำกันซึ่งอิงตาม SPIFFE สำหรับตัวแทน
  • "agent_gateway_config": { "agent_to_anywhere_config": {"agent_gateway": } } เพื่อนำการรับส่งข้อมูลทั้งหมดที่เอเจนต์เริ่มต้นขาออกไปยัง Agent Gateway เพื่อการประเมินและการบังคับใช้นโยบาย

ติดตั้งใช้งาน Agent

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

ดึงข้อมูล Vitals ของการทำให้ใช้งานได้

# 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. นโยบาย

นโยบายการให้สิทธิ์การกำกับดูแลของ Agent อนุญาตให้การเข้าชมจาก Agent AI ผ่าน Agent Gateway และไปยังปลายทาง (เช่น ปลายทางเซิร์ฟเวอร์ MCP ของบุคคลที่สามสำหรับแอปพลิเคชัน SaaS) เมื่อการรับส่งข้อมูลไปถึงปลายทาง สิทธิ์ระดับบริการหรือระดับแอปพลิเคชันปกติจะให้สิทธิ์เข้าถึงข้อมูล

การให้สิทธิ์บทบาท IAM สำหรับขาออกของ Agent Gateway จะเปิดใช้นโยบายการเข้าถึงที่อนุญาตให้สิทธิ์เข้าถึงข้อมูลประจำตัวหลักของ Agent เข้าถึงทรัพยากรปลายทางที่ลงทะเบียนผ่าน Agent Gateway ระบบจะบังคับใช้นโยบายที่ระดับเกตเวย์ของตัวแทนและตรวจสอบโดยใช้นโยบาย IAM ของ Identity-Aware Proxy (IAP)

มอบบทบาท IAM ของ Agent สำหรับขาออกของ Agent Gateway

Agent Gateway จะตรวจสอบคำขอขาเข้าเพื่อยืนยันว่าตัวแทนที่เรียกใช้มีสิทธิ์ iap.webServiceVersions.egressViaIAP (ได้รับจากบทบาท roles/iap.egressor) ในทรัพยากรเป้าหมาย

การให้สิทธิ์ roles/iap.egressor แก่ข้อมูลประจำตัวของ Agent หรือชุดหลักของ Agent Runtime ในทรัพยากรปลายทางที่เลือกจะอนุญาตการรับส่งข้อมูลขาออกนี้ ใน Codelab นี้ บทบาทจะใช้กับเอเจนต์หลัก ซึ่งให้สิทธิ์แก่ข้อมูลประจำตัวของเอเจนต์ Agent Runtime ที่เฉพาะเจาะจง

นโยบาย IAM จะเชื่อมโยงกับทรัพยากรปลายทางตามที่กำหนดไว้ในโมเดลข้อมูลของรีจิสทรีตัวแทน iap_web/agentRegistry ทรัพยากรแสดงถึงระดับ "ทั่วทั้งรีจิสทรี" ในลำดับชั้น IAM โดย agentRegistry จะเป็นทรัพยากรหลักของทรัพยากรย่อยแต่ละรายการสำหรับ agents, mcpServers และ endpoints ในโค้ดแล็บนี้ นโยบาย IAM จะเชื่อมโยงกับระดับ mcpServer และ endpoint ซึ่งจะใช้สิทธิ์กับทรัพยากรย่อยที่เฉพาะเจาะจง

เกี่ยวกับการกรอง MCP แบบมีเงื่อนไข

เซิร์ฟเวอร์ MCP ของ Data Commons มีเครื่องมือ 2 อย่าง ได้แก่

  • search_indicators: สำหรับคำถามเกี่ยวกับการค้นหาข้อมูลที่มีอยู่ การค้นหาตัวแปร หรือการทำความเข้าใจความครอบคลุมของข้อมูล
  • get_observations: สำหรับคำค้นหาเพื่อดึงจุดข้อมูลหรืออนุกรมเวลาที่เฉพาะเจาะจง

การดำเนินการ MCP มาตรฐานบางอย่างที่ควรทราบเมื่อกำหนดค่านโยบายการกำกับดูแลแบบมีเงื่อนไขในเซิร์ฟเวอร์ MCP มีดังนี้ ก่อนที่ไคลเอ็นต์ MCP จะส่ง tools/call สำหรับ search_indicators หรือ get_observations ได้ ไคลเอ็นต์จะต้องส่งคำขอแฮนด์เชคและคำขอการค้นหาโปรโตคอลก่อน

  • initialize
  • notifications/initialized
  • tools/list

หากต้องการแสดงการกรองนโยบายแบบมีเงื่อนไข เราจะกำหนดค่านโยบายสำหรับเงื่อนไขต่อไปนี้

ตาราง การประเมินนโยบายสำหรับคำขอ MCP

คำขอ / วิธีการ

ค่า mcp.toolName

การประเมิน CEL

ผลลัพธ์

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 [...]

❌ ถูกปฏิเสธ (403)

หากต้องการอนุญาตการแฮนด์เชคโปรโตคอลและการเรียกใช้เครื่องมือ search_indicators กฎนโยบายแบบมีเงื่อนไขจะมี "อนุญาต" สำหรับ "search_indicators" หรือ "" (สตริงว่าง)

กำหนดค่านโยบาย IAM ของเซิร์ฟเวอร์ MCP ของ IAP ของรีจิสทรี

# 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 ทำงานในโหมด DRY_RUN ระบบจะสังเกตและบันทึกคำขอขาออก แต่จะไม่บล็อก

ทดสอบการค้นหาของ Agent

เปิดหน้าต่างเบราว์เซอร์ไปยัง UI ของคอนโซล Google Cloud แล้วไปที่

  • แพลตฟอร์มตัวแทน → ตัวแทน → การติดตั้งใช้งาน → agent-datacommons
  • เลือกแท็บสนามเด็กเล่น

หรือใช้คำสั่งเทอร์มินัลนี้แล้วคลิกลิงก์เพื่อไปยังสนามเด็กเล่นของ Agent

# 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

อัปเดตนโยบาย IAM ของปลายทาง 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 ได้สำเร็จ เปลี่ยนส่วนขยายการให้สิทธิ์ IAP ของ Agent Gateway เป็นโหมด 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 ของเอเจนต์ใน UI ของคอนโซล

ส่งคำค้นหาทดสอบเพิ่มเติม (พยายามเรียกใช้เครื่องมือ allowedsearch_indicators)...

  • What data topics do you have for Peru?

สังเกตว่าคำขอของเอเจนต์ไปยังโมเดลพื้นฐานของ Gemini (${REGION}-aiplatform.googleapis.com/...), Telemetry API (telemetry.googleapis.com/...) และอุปกรณ์ปลายทางของเซิร์ฟเวอร์ MCP ของ Data Commons (api.datacommons.org/mcp) จะส่งผ่านด้วยรหัสสถานะ HTTP 200 OK

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

ตรวจสอบว่าไม่มีคำขอที่ถูกบล็อก มองหาความพยายามในการออกที่ถูกปฏิเสธด้วยรหัสสถานะ HTTP 403 Forbidden ในบันทึกการตรวจสอบเกตเวย์

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

ซึ่งเป็นการยืนยันว่านโยบายการกำกับดูแลทำงานได้ตามที่คาดไว้

โปรดทราบว่าแถวที่ 2 ซึ่งระบุสถานะว่างเปล่าและ ALLOWED คือเหตุการณ์บันทึกการสิ้นสุดการเชื่อมต่อรองที่ Agent Gateway ปล่อยออกมาเมื่อปิดซ็อกเก็ตหลังจากส่งการตอบกลับ 403 (เนื่องจากเหตุการณ์ connection-close ไม่มีรหัสสถานะการตอบกลับ 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 เป็นสิ่งที่ยอดเยี่ยมที่สุด!

ขั้นตอนถัดไป

โปรดแสดงความคิดเห็น ถามคำถาม หรือแก้ไขโดยใช้แบบฟอร์มความคิดเห็นนี้

ขอขอบคุณ