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
รูปที่ 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 นี้ใช้ลำดับการติดตั้งใช้งานต่อไปนี้
- เริ่มต้นในโหมด
DRY_RUN: ตรวจสอบว่าคำขอของตัวแทนมาถึงเกตเวย์และผ่านไปได้สำเร็จ (โหมดตรวจสอบเท่านั้น) - ลงทะเบียนบริการทั้งหมด: ลงทะเบียนคอมโพเนนต์เอเจนต์ทั้งหมดในรีจิสทรีของเอเจนต์และยืนยันสิทธิ์เข้าถึงเครื่องมือของเอเจนต์
- สร้างนโยบายการให้สิทธิ์: สร้างและใช้นโยบายการให้สิทธิ์เพื่ออนุญาตให้มีการรับส่งข้อมูลขาออกจากเอเจนต์ไปยังเซิร์ฟเวอร์และปลายทางของ MCP
- เปลี่ยนไปใช้โหมด
ENFORCED: อัปเดตนโยบายส่วนขยายการให้สิทธิ์เพื่อบังคับใช้นโยบายและบล็อกการรับส่งข้อมูลขาออกที่ไม่ได้รับอนุญาต
รูปที่ 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)
รูปที่ 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
รูปที่ 4 การตรวจสอบ MCP ของ Agent Gateway
นิพจน์ CEL ที่ใช้ในเงื่อนไข IAM ของ IAP จะใช้รูปแบบมาตรฐาน api.getAttribute('iap.googleapis.com/ATTRIBUTE_NAME', 'DEFAULT_VALUE')== 'DESIRED_VALUE'
ตารางนี้อธิบายแอตทริบิวต์การกํากับดูแลขาออกของ Agent Gateway ที่ใช้กับคําขอของเซิร์ฟเวอร์ MCP ได้
แอตทริบิวต์ | วิธีการ / ตำแหน่ง MCP | คำอธิบาย |
|
| ตัวระบุเครื่องมือเป้าหมายที่ขอในเพย์โหลด RPC (เช่น |
| Agent Registry ( | ระบุว่าเครื่องมือเป็นแบบอ่านอย่างเดียว (ไม่แก้ไขสภาพแวดล้อม) |
| Agent Registry ( | ระบุว่าการเรียกใช้เครื่องมืออาจทำให้เกิดการแก้ไขที่ไม่สามารถย้อนกลับได้หรือข้อมูลสูญหายหรือไม่ |
| Agent Registry ( | ระบุว่าการเรียกใช้เครื่องมือซ้ำๆ ด้วยอาร์กิวเมนต์ที่เหมือนกันจะทำให้เกิดสถานะเดียวกันทุกประการหรือไม่ |
| Agent Registry ( | ระบุว่าเครื่องมือเข้าถึงระบบภายในที่จำกัดไปยังอินเทอร์เน็ตสาธารณะที่ไม่จำกัดหรือไม่ |
ส่วนนี้เป็นส่วนของแนวคิด... ต่อไปจะเป็นส่วนการตั้งค่า
3. ตั้งค่า
บทบาท IAM ที่จำเป็น
คุณต้องมีบทบาทต่อไปนี้เพื่อสร้างทรัพยากรใน Codelab นี้
หมวดหมู่ | บทบาท IAM (รหัส) ที่ต้องมี | คำอธิบาย |
การจัดการ API |
| เปิดใช้บริการ Google Cloud API |
เครือข่ายและเกตเวย์ |
| จัดสรร Agent Gateway |
ส่วนขยายบริการ |
| กำหนดค่าส่วนขยายการกำหนดเส้นทาง |
การรักษาความปลอดภัยของเครือข่าย |
| ติดตั้งใช้งานนโยบายการให้สิทธิ์ |
Agent Registry |
| โฮสต์ที่อนุญาตของแคตตาล็อก |
Vertex AI และเอเจนต์ |
| ทำให้ภาระงาน Agent Runtime ใช้งานได้ |
นโยบายขาออก |
| ใช้นโยบาย |
Cloud Storage |
| จัดการที่เก็บข้อมูลการจัดเตรียมการทำให้ใช้งานได้ |
บันทึกและการตรวจสอบ |
| ตรวจสอบการติดตามและบันทึกการตรวจสอบ |
หรือจะใช้บทบาทพื้นฐานแบบกว้าง เช่น roles/admin หรือบทบาทเดิม roles/owner ก็ได้
เข้าถึงโปรเจ็กต์
Codelab นี้ใช้โปรเจ็กต์ที่อยู่ในระบบคลาวด์ของ Google เดียว ขั้นตอนการกำหนดค่าใช้คำสั่ง CLI ของ gcloud และคำสั่ง Shell ของ Linux
เริ่มต้นด้วยการเข้าถึงบรรทัดคำสั่งของโปรเจ็กต์ที่อยู่ในระบบคลาวด์ของ Google โดยทำดังนี้
- Cloud Shell ที่
shell.cloud.google.comหรือ - เทอร์มินัลในเครื่องที่
gcloudCLI ติดตั้งแล้ว
ตั้งค่ารหัสโปรเจ็กต์
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
อัปเดต gcloud cli (แนะนำ)
หากเรียกใช้การติดตั้ง 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
- ขั้นตอนการมอบสิทธิ์: เมื่อ Agent พยายามเรียกใช้ปลายทางภายนอกหรือเซิร์ฟเวอร์ MCP ระบบจะกำหนดเส้นทางคำขอไปยัง Agent Gateway เกตเวย์จะใช้ส่วนขยายการให้สิทธิ์เพื่อส่งการเรียกใช้ไปยังบริการประเมิน IAP แทนการประเมินการเข้าถึงในเครื่อง IAP จะประเมินข้อมูลระบุตัวตนของเอเจนต์ (อิงตาม SPIFFE) กับนโยบาย IAM ของทรัพยากรเป้าหมายใน Agent Registry IAP จะส่งการตัดสินใจ
ALLOWหรือDENYกลับไปยังเกตเวย์ ซึ่งจะส่งต่อการเข้าชมหรือบล็อกการเข้าชมด้วยรหัสสถานะ HTTP403 Forbidden - โหมดการบังคับใช้: ในโหมด
DRY_RUNIAP จะประเมินคำขอและบันทึกการตัดสินใจใน Cloud Logging โดยไม่บล็อกการรับส่งข้อมูล ในโหมดENFORCEระบบจะบล็อกคำขอจากเอเจนต์ที่ไม่ได้รับอนุญาตหรือคำขอที่ส่งไปยังเป้าหมายที่ไม่ได้ลงทะเบียนทันที - เลเยอร์การเชื่อมโยง: ส่วนขยายบริการเชื่อมต่อกับ 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 ได้ ไคลเอ็นต์จะต้องส่งคำขอแฮนด์เชคและคำขอการค้นหาโปรโตคอลก่อน
initializenotifications/initializedtools/list
หากต้องการแสดงการกรองนโยบายแบบมีเงื่อนไข เราจะกำหนดค่านโยบายสำหรับเงื่อนไขต่อไปนี้
ตาราง การประเมินนโยบายสำหรับคำขอ MCP
คำขอ / วิธีการ | ค่า | การประเมิน CEL | ผลลัพธ์ |
|
|
| ✅ อนุญาต (200) |
|
|
| ✅ อนุญาต (200) |
|
|
| ✅ อนุญาต (200) |
|
|
| ❌ ถูกปฏิเสธ (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 คิดว่า Codelabs เป็นสิ่งที่ยอดเยี่ยมที่สุด!
ขั้นตอนถัดไป
- ดูฟีเจอร์ขั้นสูงและบทแนะนำได้ในเอกสารประกอบแพลตฟอร์ม Agent ของ Gemini Enterprise
- กำหนดค่าขอบเขตความปลอดภัยของ Model Armor ใน Agent Gateway เพื่อความปลอดภัยเพิ่มเติมของ AI
- ดูนโยบายการกำกับดูแลเชิงความหมายเพื่อบังคับใช้กฎทางธุรกิจและการปฏิบัติตามข้อกำหนดสำหรับคำค้นหาที่เป็นภาษาธรรมชาติ
โปรดแสดงความคิดเห็น ถามคำถาม หรือแก้ไขโดยใช้แบบฟอร์มความคิดเห็นนี้
ขอขอบคุณ