1. บทนำ
Codelab นี้จะสำรวจการควบคุมการออกของ Agent Gateway สำหรับ AI Agent ที่เข้าถึงปลายทางระยะไกลผ่านเครือข่าย VPC ส่วนตัว Agent Gateway ที่ทำงานในโหมดขาออก (agent-to-anywhere) รองรับการเชื่อมต่อส่วนตัวกับเครือข่าย VPC โดยใช้อินเทอร์เฟซ Private Service Connect (PSC) ในสถานการณ์นี้ Agent Runtime จะใช้ Agent Gateway เพื่อเข้าถึงเซิร์ฟเวอร์ HTTP MCP ที่สตรีมได้จากระยะไกลซึ่งโฮสต์อยู่ใน Cloud Run โดยใช้ปลายทาง Private Service Connect (PSC) สำหรับ Google API ในเครือข่าย VPC
แอป 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
- เซิร์ฟเวอร์ MCP HTTP ที่สตรีมได้ของ Cloud Run
- Agent Registry ที่มี Google API และปลายทาง MCP ที่กำหนดเอง
- นโยบายการให้สิทธิ์ที่มีการควบคุมการเข้าถึง IAM
- ทรัพยากรเครือข่าย VPC, โซน Cloud DNS และปลายทาง PSC สำหรับ Google API
- การแนบเครือข่าย PSC สำหรับขาออกของ Agent Gateway
- กฎนโยบายไฟร์วอลล์ของ Cloud Next Generation Firewall (NGFW)
รูปที่ 1 สถาปัตยกรรม Codelab
สิ่งที่คุณจะได้เรียนรู้
- วิธีติดตั้งใช้งาน Agent Gateway ในลําดับการกําหนดค่าที่มีโครงสร้าง
- วิธีกำหนดค่า Agent Gateway ด้วยการเชื่อมต่อเครือข่าย VPC ส่วนตัว
- วิธีเปลี่ยนนโยบายการให้สิทธิ์จากโหมดทดลองเรียกใช้เป็นโหมดบังคับใช้
- วิธีลงทะเบียนปลายทาง Google API และเซิร์ฟเวอร์ MCP ใน Agent Registry
- วิธีตรวจสอบบันทึกของ Agent Gateway เพื่อตรวจสอบการควบคุมการออก
- วิธีตรวจสอบการรับส่งขาออกจาก Agent Gateway โดยใช้บันทึกของ Cloud NGFW
สิ่งที่ต้องมี
- โปรเจ็กต์ Google Cloud ที่เปิดใช้การเรียกเก็บเงิน
- สิทธิ์ IAM ในการจัดสรรบริการเครือข่าย ชุดข้อมูล BigQuery และทรัพยากร Agent Platform
- Shell ที่เข้ากันได้กับ POSIX (
bashหรือzsh) ที่ติดตั้ง Google Cloud CLI (คอมโพเนนต์gcloudและbq) - เครื่องมือบรรทัดคำสั่ง:
git,curl,jq(ตัวประมวลผล JSON), Python 3 และuv(ตัวจัดการแพ็กเกจ Python)
2. แนวคิด
ลำดับการติดตั้งใช้งาน
Codelab นี้จะทำตามลำดับการกำหนดค่าที่มีโครงสร้างเพื่อให้ตัวแทนเข้าถึงทรัพยากรที่จำเป็นในการเริ่มต้น และยืนยันการเชื่อมต่อได้ก่อนที่จะใช้นโยบายการเข้าถึงบังคับใช้
Codelab นี้ใช้ลำดับการติดตั้งใช้งานต่อไปนี้
- เริ่มต้นในโหมด
DRY_RUN: ตรวจสอบว่าคำขอของตัวแทนมาถึงเกตเวย์และผ่านไปได้สำเร็จ (โหมดตรวจสอบเท่านั้น) - ลงทะเบียนบริการทั้งหมด: ลงทะเบียนคอมโพเนนต์เอเจนต์ทั้งหมดในรีจิสทรีของเอเจนต์และยืนยันสิทธิ์เข้าถึงเครื่องมือของเอเจนต์ ใช้ Cloud Logging และแดชบอร์ดการตรวจสอบของ Agent Gateway เพื่อดูการค้นหาใน Agent Registry
- สร้างนโยบายการให้สิทธิ์: สร้างและใช้นโยบายการให้สิทธิ์เพื่ออนุญาตให้มีการรับส่งข้อมูลขาออกจากเอเจนต์ไปยังเซิร์ฟเวอร์และปลายทางของ 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 Runtime ซึ่งกำหนดเป้าหมายไปยัง PSC สำหรับปลายทาง Google API ที่ติดตั้งใช้งานในเครือข่าย VPC สถาปัตยกรรมนี้ช่วยให้เข้าถึงเซิร์ฟเวอร์ MCP ที่โฮสต์ใน Cloud Run แบบส่วนตัวได้โดยใช้การแนบเครือข่าย PSC สำหรับขาออกของ Agent Gateway
การเชื่อมต่อ VPC
การออกของ Agent Gateway (agent-to-anywhere) สามารถเชื่อมต่อกับเครือข่าย VPC ได้โดยการระบุ networkConfig: egress: networkAttachment: [URI] ในไฟล์กำหนดค่า YAML ของการติดตั้งใช้งาน การตั้งค่านี้จะกำหนดค่ากฎการกำหนดเส้นทางใน Agent Gateway เพื่อส่งการรับส่งข้อมูลที่เปลี่ยนเป็นที่อยู่ IP ส่วนตัวผ่านไฟล์แนบเครือข่าย PSC ไปยังเครือข่าย VPC
รูปที่ 4 การเชื่อมต่อ VPC ของ Agent Gateway
เกตเวย์ของเอเจนต์สามารถแก้ปัญหาชื่อโฮสต์ DNS ส่วนตัวได้โดยใช้การเพียร์ Cloud DNS กับโปรเจ็กต์เป้าหมายและเครือข่าย VPC ที่ระบุ โซนส่วนตัวที่แสดงในการกำหนดค่า dnsPeeringConfig: domains: [NAME] จะใช้ระเบียน Cloud DNS ในโปรเจ็กต์เป้าหมาย คำค้นหา DNS อื่นๆ จะใช้รีโซลเวอร์สาธารณะของ Cloud DNS ใน VPC เริ่มต้น
ส่วนนี้เป็นส่วนของแนวคิด... ต่อไปจะเป็นส่วนการตั้งค่า
3. ตั้งค่า
บทบาท IAM ที่จำเป็น
คุณต้องมีบทบาทต่อไปนี้เพื่อสร้างทรัพยากรใน Codelab นี้
หมวดหมู่ | บทบาท IAM ที่ต้องมี (รหัส) | คำอธิบาย |
การจัดการ API |
| เปิดใช้บริการ Google Cloud API |
เครือข่ายและเกตเวย์ |
| จัดสรร Agent Gateway |
ส่วนขยายบริการ |
| กำหนดค่าส่วนขยายการกำหนดเส้นทาง |
การรักษาความปลอดภัยของเครือข่าย |
| ติดตั้งใช้งานนโยบายการให้สิทธิ์ |
Agent Registry |
| โฮสต์ที่อนุญาตของแคตตาล็อก |
Vertex AI และเอเจนต์ |
| ทำให้ภาระงานรันไทม์ Agent ใช้งานได้ |
นโยบายขาออก |
| ใช้นโยบาย |
Cloud Storage |
| จัดการที่เก็บข้อมูลการจัดเตรียมการทำให้ใช้งานได้ |
บันทึกและการตรวจสอบ |
| ตรวจสอบการติดตามและบันทึกการตรวจสอบ |
นักพัฒนาซอฟต์แวร์ Cloud Run |
| ติดตั้งใช้งานบริการ Cloud Run |
ผู้อ่าน Artifact Registry |
| ดึงอิมเมจคอนเทนเนอร์ |
ผู้ดูแลระบบเครือข่ายคอมพิวเตอร์ |
| จัดการทรัพยากรเครือข่าย VPC |
ผู้ดูแลระบบ DNS |
| จัดการโซนและระเบียน Cloud DNS |
หรือจะใช้บทบาทพื้นฐานแบบกว้าง เช่น roles/admin หรือบทบาทเดิม roles/owner ก็ได้
เข้าถึงโปรเจ็กต์
Codelab นี้ใช้โปรเจ็กต์ Google Cloud เดียว ขั้นตอนการกำหนดค่าใช้คำสั่ง CLI ของ gcloud และคำสั่ง Shell ของ Linux
เริ่มต้นด้วยการเข้าถึงบรรทัดคำสั่งของโปรเจ็กต์ Google Cloud โดยทำดังนี้
- 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
ตั้งค่าตัวแปรสภาพแวดล้อมของเชลล์
# set custom var for slug (eg, "foo") and region preference
export SLUG="foo"
export REGION="us-central1"
export MREGION="us"
echo ${SLUG}
echo ${REGION}
echo ${MREGION}
# create project vars (automatic)
export PROJ_ID=$(gcloud config list --format="value(core.project)")
export PROJ_NO=$(gcloud projects describe ${PROJ_ID} --format="value(projectNumber)")
export ORG_ID=$(gcloud projects get-ancestors ${PROJ_ID} --format="value(id)" | tail -n 1)
export USER_IDENTITY=$(gcloud config get-value account)
echo ${PROJ_ID}
echo ${PROJ_NO}
echo ${ORG_ID}
echo ${USER_IDENTITY}
# create resource vars (automatic)
export AGW_NAME="agw-${SLUG}-${REGION}-ata"
export AGW_URI="projects/${PROJ_ID}/locations/${REGION}/agentGateways/${AGW_NAME}"
export RE_AGENT_NAME="agent-weather"
export RE_AGENT_ID_SET="principalSet://agents.global.org-${ORG_ID}.system.id.goog/attribute.platformContainer/aiplatform/projects/${PROJ_NO}"
export STAGING_BUCKET="agent-staging-${PROJ_NO}"
export MCP_NAME="mcp-weather"
export MCP_DISPLAY_NAME="${MCP_NAME}-${PROJ_NO}.${REGION}.run.app"
export MCP_URL="https://${MCP_DISPLAY_NAME}/mcp"
echo ${AGW_NAME}
echo ${AGW_URI}
echo ${RE_AGENT_NAME}
echo ${RE_AGENT_ID_SET}
echo ${STAGING_BUCKET}
echo ${MCP_NAME}
echo ${MCP_DISPLAY_NAME}
echo ${MCP_URL}
# create local dir for config files
mkdir -p cfg
อัปเดต 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
# enable google apis (all the rest)
gcloud services enable \
run.googleapis.com \
artifactregistry.googleapis.com \
cloudbuild.googleapis.com \
dns.googleapis.com
ส่วนการตั้งค่าก็มีเพียงเท่านี้... ต่อไปเราจะไปที่ส่วนเครือข่าย
4. เครือข่าย
เครือข่าย VPC ได้รับการติดตั้งใช้งานโดยใช้โหมดที่กำหนดเองเพื่อสร้างซับเน็ตปกติที่รองรับการเชื่อมต่อเครือข่าย PSC สำหรับ Agent Gateway และข้อมูลขาออก VPC โดยตรงของ Cloud Run
ปลายทาง PSC สำหรับ Google APIs จะได้รับการติดตั้งใช้งานโดยใช้/32ที่อยู่ IPv4 ภายในแบบสากลเดียวเพื่อรองรับการเข้าถึง Cloud Run ภายในแบบส่วนตัว ที่อยู่ IP นี้ไม่ได้กำหนดจากซับเน็ตระดับภูมิภาค
สร้างเครือข่าย
สร้างเครือข่าย VPC ทั่วโลก
# create vpc network
gcloud compute networks create vnet-${SLUG} --subnet-mode=custom
สร้างเครือข่ายย่อยสำหรับการเชื่อมต่อเครือข่าย PSC ของ Agent Gateway และข้อมูลขาออก VPC โดยตรงของ Cloud Run
# create subnet for agent gateway psc na
gcloud compute networks subnets create subnet-${REGION}-agw \
--network=vnet-${SLUG} \
--range=192.168.10.0/28 \
--region=${REGION} \
--enable-private-ip-google-access
# create subnet for cloud run dvpc egress
gcloud compute networks subnets create subnet-${REGION}-crun \
--network=vnet-${SLUG} \
--range=10.10.10.0/24 \
--region=${REGION} \
--enable-private-ip-google-access
สร้างกฎไฟร์วอลล์
สร้างนโยบายและกฎไฟร์วอลล์เพื่ออนุญาตการรับส่งข้อมูลขาออกทั้งหมดโดยเปิดใช้การบันทึก ซึ่งจะใช้เพื่อตรวจสอบการรับส่งข้อมูลที่ออกจากเกตเวย์ของตัวแทนไปยังเครือข่าย VPC
# create fw policy
gcloud compute network-firewall-policies create fw-policy-${SLUG} --global
# create fw policy rule
gcloud compute network-firewall-policies rules create 1001 \
--description="allow all out and log" \
--firewall-policy=fw-policy-${SLUG} \
--global-firewall-policy \
--action=allow \
--direction=EGRESS \
--layer4-configs=all \
--dest-ip-ranges=0.0.0.0/0 \
--enable-logging
# associate fw policy to vpc network
gcloud compute network-firewall-policies associations create \
--name=fw-policy-bind-${SLUG} \
--firewall-policy=fw-policy-${SLUG} \
--network=vnet-${SLUG} \
--global-firewall-policy
สร้างการเชื่อมต่อเครือข่าย PSC
สร้างการเชื่อมต่อเครือข่าย PSC ที่กำหนดค่าให้ยอมรับโดยอัตโนมัติการเชื่อมต่อผู้ให้บริการรายใหม่
# create psc network attachment
gcloud compute network-attachments create psc-na-${REGION}-agw \
--region=${REGION} \
--subnets=subnet-${REGION}-agw \
--connection-preference=ACCEPT_AUTOMATIC
ยืนยันการแนบเครือข่าย PSC
# show psc network attachment details
gcloud compute network-attachments describe psc-na-${REGION}-agw --region=${REGION}
# fetch psc na uri
export PSC_NA_URI=$(gcloud compute network-attachments describe psc-na-${REGION}-agw \
--region=${REGION} \
--format="value(selfLink.scope(v1))")
echo ${PSC_NA_URI}
สร้างปลายทาง PSC
สร้างการจองที่อยู่ IP สำหรับปลายทาง PSC ทั่วโลก ที่อยู่ที่ใช้ในที่นี้ต้องไม่มาจากหรือซ้อนทับกับซับเน็ตที่มีอยู่
# set env var for psc ep ip address
export PSC_EP_IP="240.0.0.10"
echo ${PSC_EP_IP}
# reserve internal global ipv4 address
gcloud compute addresses create ip-psc2gapis \
--global \
--purpose=PRIVATE_SERVICE_CONNECT \
--addresses=${PSC_EP_IP} \
--network=vnet-${SLUG}
สร้างปลายทาง PSC สำหรับ Google APIs โดยใช้แพ็กเกจ all-apis ซึ่งรวม Cloud Run (run.app)
# create psc endpoint for google apis
gcloud compute forwarding-rules create psc2gapis \
--global \
--network=vnet-${SLUG} \
--address=ip-psc2gapis \
--target-google-apis-bundle=all-apis
ยืนยันปลายทาง PSC
# show psc endpoint details
gcloud compute forwarding-rules describe psc2gapis --global
สร้างโซนและระเบียน DNS
สร้างโซนที่มีการจัดการของ Cloud DNS แบบส่วนตัวสำหรับโดเมน run.app
# create private dns zone
gcloud dns managed-zones create priv-zone-run \
--description="private zone for cloud run" \
--dns-name="run.app." \
--visibility=private \
--networks=vnet-${SLUG}
สร้างระเบียน DNS แบบไวลด์การ์ด A สำหรับ *.run.app. ที่ชี้ไปยังที่อยู่ IP ของปลายทาง PSC
# create dns record
gcloud dns record-sets create *.run.app \
--zone=priv-zone-run \
--type=A \
--ttl=300 \
--rrdatas=${PSC_EP_IP}
สร้างนโยบาย Cloud DNS เพื่อเปิดใช้การบันทึกการค้นหา DNS
# create dns policy (logging)
gcloud dns policies create dns-policy-${SLUG} \
--description="dns logging for vnet-${SLUG}" \
--networks=vnet-${SLUG} \
--enable-logging
สร้าง Cloud NAT
สร้าง Cloud Router และ Cloud NAT เพื่อรองรับข้อมูลขาออก VPC โดยตรงของ Cloud Run สำหรับเซิร์ฟเวอร์ MCP เพื่อเข้าถึงข้อมูลสภาพอากาศภายนอกผ่านเครือข่าย VPC
# create router for nat
gcloud compute routers create cr-nat-${SLUG}-${REGION} \
--network=vnet-${SLUG} \
--asn=16550 \
--region=${REGION}
# create nat gateway
gcloud compute routers nats create nat-${SLUG}-${REGION} \
--router=cr-nat-${SLUG}-${REGION} \
--region=${REGION} \
--auto-allocate-nat-external-ips \
--nat-all-subnet-ip-ranges
ส่วนเครือข่ายก็มีเพียงเท่านี้... ต่อไปเราจะไปที่ส่วนเกตเวย์
5. เกตเวย์
ก่อนบังคับใช้การควบคุมการเข้าถึง ให้ติดตั้งใช้งาน Agent Gateway และกำหนดค่าส่วนขยายการให้สิทธิ์ในโหมด DRY_RUN ซึ่งจะช่วยให้การเรียกใช้เครื่องมือขาออกสำเร็จในขณะที่บันทึกผลการประเมินเพื่อวัตถุประสงค์ในการตรวจสอบ
ในที่นี้ Agent Gateway ใช้รีจิสทรีระดับภูมิภาคเพื่อรองรับทรัพยากร Agent Runtime ระดับภูมิภาค และระบุฟิลด์ networkConfig สำหรับการแนบเครือข่าย PSC ของเครือข่าย VPC และการกำหนดค่าการรับส่งข้อมูล DNS
สร้างเกตเวย์
# create new agent gateway config file (with network settings)
cat > cfg/${AGW_NAME}-networkConfig.yaml << EOF
name: ${AGW_NAME}
protocols:
- MCP
googleManaged:
governedAccessPath: AGENT_TO_ANYWHERE
registries:
- "//agentregistry.googleapis.com/projects/${PROJ_ID}/locations/${REGION}"
networkConfig:
egress:
networkAttachment: ${PSC_NA_URI}
dnsPeeringConfig:
domains:
- run.app.
targetProject: ${PROJ_ID}
targetNetwork: projects/${PROJ_ID}/global/networks/vnet-${SLUG}
EOF
# import agent gateway config file (create gateway)
gcloud network-services agent-gateways import ${AGW_NAME} \
--source="cfg/${AGW_NAME}-networkConfig.yaml" \
--location=${REGION}
ยืนยันเกตเวย์
# show agent gateway details
gcloud network-services agent-gateways describe ${AGW_NAME} \
--location=${REGION}
# show psc network attachment details
gcloud compute network-attachments describe psc-na-${REGION}-agw --region=${REGION}
ตรวจสอบว่ามีปลายทางการเชื่อมต่อที่ยอมรับ
connectionEndpoints:
- ipAddress: 192.168.10.2
projectIdOrNum: '[AGW_PROJECT_NO]'
status: ACCEPTED
subnetwork: https://www.googleapis.com/compute/v1/projects/${PROJ_ID}/regions/${REGION}/subnetworks/subnet-${REGION}-agw
ส่วนของเกตเวย์จบลงแล้ว... ต่อไปเป็นส่วนการให้สิทธิ์
6. การให้สิทธิ์
ส่วนขยายการให้สิทธิ์ Agent Gateway สำหรับ Identity-Aware Proxy (IAP) เป็นส่วนขยายบริการประเภทหนึ่งที่ใช้ในการมอบสิทธิ์การตัดสินใจด้านการให้สิทธิ์สำหรับการสื่อสารทั้งหมดของแพลตฟอร์ม Agent
- ขั้นตอนการมอบสิทธิ์: เมื่อ Agent พยายามเรียกใช้ปลายทางภายนอกหรือเซิร์ฟเวอร์ MCP ระบบจะกำหนดเส้นทางคำขอไปยัง Agent Gateway เกตเวย์จะใช้ส่วนขยายการให้สิทธิ์เพื่อส่งการเรียกใช้ไปยังบริการประเมิน IAP แทนการประเมินการเข้าถึงในเครื่อง IAP จะประเมินข้อมูลระบุตัวตนของเอเจนต์ (อิงตาม SPIFFE) กับนโยบาย IAM ของทรัพยากรเป้าหมายใน Agent Registry IAP จะส่งการตัดสินใจ
ALLOWหรือDENYกลับไปยังเกตเวย์ ซึ่งจะส่งต่อการเข้าชมหรือบล็อกด้วยรหัสสถานะ HTTP403 Forbidden - โหมดการบังคับใช้: ในโหมด
DRY_RUNIAP จะประเมินคำขอและบันทึกการตัดสินใจใน Cloud Logging โดยไม่บล็อกการรับส่งข้อมูล ในโหมดENFORCEระบบจะบล็อกคำขอจากเอเจนต์ที่ไม่ได้รับอนุญาตหรือคำขอที่ส่งไปยังเป้าหมายที่ไม่ได้ลงทะเบียนทันที - เลเยอร์การเชื่อมโยง: ส่วนขยายบริการเชื่อมต่อกับ Agent Gateway โดยใช้นโยบายการให้สิทธิ์ที่กำหนดค่าด้วยโปรไฟล์
REQUEST_AUTHZ
ส่วนขยายการให้สิทธิ์
ส่วนขยายการให้สิทธิ์จะระบุบริการผู้ให้บริการด้านความปลอดภัยพร้อมการตั้งค่าการเชื่อมต่อและพารามิเตอร์อื่นๆ ที่กำหนดวิธีที่บริการจะทำงานและผสานรวมกับ Agent Gateway
สร้างส่วนขยาย authz
# create authz extension config file (dry run mode)
cat > cfg/${AGW_NAME}-svc-ext-authz-iap-dryrun.yaml << EOF
name: ${AGW_NAME}-svc-ext-authz-iap-dryrun
service: iap.googleapis.com
failOpen: true
timeout: 1s
metadata:
iamEnforcementMode: "DRY_RUN"
iapPolicyVersion: "V1"
EOF
ส่วนขยายการให้สิทธิ์นำเข้า
# import authz 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}
ยืนยันส่วนขยาย authz
# show authz extension details
gcloud service-extensions authz-extensions describe ${AGW_NAME}-svc-ext-authz-iap-dryrun \
--location=${REGION}
นโยบายการให้สิทธิ์
นโยบายการให้สิทธิ์จะเชื่อมโยงผู้ให้บริการด้านความปลอดภัย (IAP) กับทรัพยากรเกตเวย์เป้าหมาย และระบุโปรไฟล์การสกัดกั้น (REQUEST_AUTHZ)
สร้างนโยบายการให้สิทธิ์
# create authz policy config file (attach dry-run authz extension)
cat > cfg/${AGW_NAME}-authz-policy-profile-iap.yaml << EOF
name: ${AGW_NAME}-authz-policy-profile-iap
target:
resources:
- "projects/${PROJ_ID}/locations/${REGION}/agentGateways/${AGW_NAME}"
policyProfile: REQUEST_AUTHZ
action: CUSTOM
customProvider:
authzExtension:
resources:
- "projects/${PROJ_ID}/locations/${REGION}/authzExtensions/${AGW_NAME}-svc-ext-authz-iap-dryrun"
EOF
นโยบายการให้สิทธิ์การเชื่อมโยง
# import authz policy config file (enable authz policy)
gcloud beta network-security authz-policies import ${AGW_NAME}-authz-policy-profile-iap \
--source=cfg/${AGW_NAME}-authz-policy-profile-iap.yaml \
--location=${REGION}
ยืนยันนโยบายการให้สิทธิ์
# show authz policy details
gcloud beta network-security authz-policies describe ${AGW_NAME}-authz-policy-profile-iap \
--location=${REGION}
ส่วนการให้สิทธิ์ก็จบลงเพียงเท่านี้... ต่อไปเราจะไปที่ส่วนฐานของโค้ด
7. ฐานของโค้ด
เราจะดูแลรหัสการลงทะเบียน Agent, เซิร์ฟเวอร์ MCP และปลายทางที่ใช้สำหรับ Codelab นี้ในที่เก็บ Google Cloud GitHub ระยะไกล ขั้นตอนต่อไปนี้จะโคลนที่เก็บในเครื่อง คัดลอกไฟล์ที่จำเป็นไปยังโครงสร้างไดเรกทอรีการทำงานปัจจุบัน แล้วล้างไฟล์ชั่วคราว
ระบบจะสร้างที่เก็บข้อมูล Staging สำหรับ 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_vpc
# copy agent runtime and endpoint definitions to working project dir
cp -r temp_agw_cuj_arun_egress_vpc/codelabs/agw-cuj-arun-egress-vpc/agent-weather ./agent-weather
cp -r temp_agw_cuj_arun_egress_vpc/codelabs/agw-cuj-arun-egress-vpc/mcp-weather ./mcp-weather
# remove temporary directory
rm -rf temp_agw_cuj_arun_egress_vpc
สร้าง 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)"
ส่วนของโค้ดเบสก็มีเพียงเท่านี้... ต่อไปเป็นส่วนรีจิสทรี
8. รีจิสทรี
Agent Registry คือพื้นที่เก็บข้อมูลส่วนกลางของเอเจนต์ เซิร์ฟเวอร์ MCP และปลายทาง (API) ทั้งหมดในระบบนิเวศ AI นอกจากนี้ ยังเป็นแคตตาล็อกที่ใช้เพื่อแสดง ค้นหา และค้นพบเครื่องมือและบริการอื่นๆ ที่ลงทะเบียนไว้สำหรับแอปพลิเคชัน AI ได้ด้วย Agent Gateway ใช้รูปแบบข้อมูลของรีจิสทรีเป็นกรอบการกำกับดูแลเพื่อบังคับใช้การควบคุมการเข้าถึงขาออก สิทธิ์ของบทบาท IAM สำหรับผู้ใช้หลักที่เรียกเอเจนต์จะได้รับการตรวจสอบกับนโยบายที่เชื่อมโยงกับทรัพยากรรีจิสทรี
หากต้องการเริ่มต้นสภาพแวดล้อมและรองรับเอเจนต์โดยใช้ Google APIs และบริการต่างๆ ให้สร้างบริการปลายทางรีจิสทรีเดียวที่รวมอินเทอร์เฟซ API หลักที่จำเป็นสำหรับ Lab นี้ ซึ่งจะช่วยให้จัดการนโยบายการกำกับดูแลสำหรับชุดเครื่องมือทั่วไปที่ตัวแทนส่วนใหญ่จะใช้ได้ง่ายขึ้น
ลงทะเบียนอุปกรณ์ปลายทาง
# create endpoint service (with multiple entries)
gcloud agent-registry services create core-gapi-services \
--location=${REGION} \
--display-name="gapi.core.services" \
--description="core apis and services" \
--endpoint-spec-type=no-spec \
--interfaces=protocolBinding=JSONRPC,url=https://telemetry.googleapis.com \
--interfaces=protocolBinding=JSONRPC,url=https://${REGION}-aiplatform.googleapis.com \
--interfaces=protocolBinding=JSONRPC,url=https://cloudresourcemanager.googleapis.com \
--interfaces=protocolBinding=JSONRPC,url=https://iamcredentials.googleapis.com
ยืนยันการลงทะเบียนอุปกรณ์ปลายทาง
# list registry regional endpoints
gcloud agent-registry endpoints list --location=${REGION} \
--flatten="interfaces[]" \
--format="table(displayName, name.basename():label=ENDPOINT_ID, interfaces.url:label=URL)"
ส่วนรีจิสทรีก็มีเพียงเท่านี้ ต่อไปเราจะไปที่ส่วนเซิร์ฟเวอร์ MCP
9. เซิร์ฟเวอร์ MCP
ให้สิทธิ์ IAM สำหรับการติดตั้งใช้งาน
ให้สิทธิ์แก่บัญชีบริการ Compute เริ่มต้นเพื่อรองรับการทำให้บริการ Cloud Run ใช้งานได้จากซอร์สโค้ด
# grant cloud run builder role to default compute sa
gcloud projects add-iam-policy-binding ${PROJ_ID} \
--member="serviceAccount:${PROJ_NO}-compute@developer.gserviceaccount.com" \
--role="roles/run.builder"
ยืนยันสิทธิ์ IAM
# show iam policy on project for default compute sa
gcloud projects get-iam-policy ${PROJ_ID} \
--flatten="bindings[].members" \
--filter="bindings.members=serviceAccount:${PROJ_NO}-compute@developer.gserviceaccount.com" \
--format="table(bindings.role:label=ROLE, bindings.members:label=PRINCIPAL_IDENTITY)"
ติดตั้งใช้งานเซิร์ฟเวอร์ MCP
# deploy cloud run service
gcloud -q run deploy ${MCP_NAME} \
--source=mcp-weather/server \
--region=${REGION} \
--no-allow-unauthenticated \
--min-instances=1 \
--network=vnet-${SLUG} \
--subnet=subnet-${REGION}-crun \
--vpc-egress=all-traffic \
--startup-probe=httpGet.path=/warmup
ให้สิทธิ์ IAM สำหรับการรับส่งข้อมูล
เชื่อมโยงนโยบายสำหรับการเข้าถึงของผู้ใช้
ให้สิทธิ์แก่บัญชีผู้ใช้ (ตนเอง) สำหรับการเรียกใช้เซิร์ฟเวอร์ MCP ที่โฮสต์ใน Cloud Run ซึ่งจำเป็นต่อการเรียกใช้สคริปต์การสร้าง toolspec
# grant run invoker role to user account on cloud run service level
gcloud run services add-iam-policy-binding ${MCP_NAME} \
--region=${REGION} \
--member="user:${USER_IDENTITY}" \
--role="roles/run.invoker"
ยืนยันสิทธิ์ IAM
# show iam policy on cloud run service for invoker role
gcloud run services get-iam-policy ${MCP_NAME} \
--region=${REGION} \
--flatten="bindings[].members" \
--filter="bindings.role=roles/run.invoker" \
--format="table(bindings.members:label=PRINCIPAL_IDENTITY, bindings.role:label=ROLE)"
สร้าง SA ที่กำหนดเองสำหรับการเรียกใช้ MCP
สร้างบัญชีบริการที่กำหนดเองเพื่อเรียกใช้เซิร์ฟเวอร์ MCP ที่โฮสต์ใน Cloud Run Agent จะใช้บัญชีบริการนี้เพื่อดึงโทเค็นรหัส OIDC ที่ลงนามโดย Google ที่ถูกต้องเพื่อเข้าถึง Cloud Run
# create custom sa for mcp server invocation
gcloud iam service-accounts create sa-${MCP_NAME}-invoker \
--display-name="custom sa to invoke ${MCP_NAME}"
# set env var for service account identity
export MCP_INVOKER_SA="sa-${MCP_NAME}-invoker@${PROJ_ID}.iam.gserviceaccount.com"
echo ${MCP_INVOKER_SA}
เชื่อมโยงนโยบายสำหรับบัญชีบริการ
# grant run invoker role to custom sa on cloud run service level
gcloud run services add-iam-policy-binding ${MCP_NAME} \
--role="roles/run.invoker" \
--member="serviceAccount:${MCP_INVOKER_SA}" \
--region=${REGION}
ยืนยันสิทธิ์ IAM
# show iam policy on cloud run service for invoker role
gcloud run services get-iam-policy ${MCP_NAME} \
--region=${REGION} \
--flatten="bindings[].members" \
--filter="bindings.role=roles/run.invoker" \
--format="table(bindings.members:label=PRINCIPAL_IDENTITY, bindings.role:label=ROLE)"
ให้สิทธิ์ IAM สำหรับการตรวจสอบสิทธิ์
มอบบทบาทการนำข้อมูลมาใช้ของบัญชีบริการให้กับบัญชีบริการ Compute เริ่มต้น ซึ่งจะช่วยให้ Agent ที่ทำงานภายใต้ข้อมูลเข้าสู่ระบบเริ่มต้นของแอปพลิเคชัน (ADC) สามารถสร้างโทเค็นรหัส OIDC ที่ Google ลงนามในนามของบัญชีบริการผู้เรียกใช้ที่กำหนดเองเพื่อตรวจสอบสิทธิ์การเรียกไปยัง Cloud Run
นโยบายการเชื่อมโยงสำหรับการตรวจสอบสิทธิ์
# grant oidc token creator role to default compute service account
gcloud iam service-accounts add-iam-policy-binding ${MCP_INVOKER_SA} \
--role="roles/iam.serviceAccountOpenIdTokenCreator" \
--member="serviceAccount:${PROJ_NO}-compute@developer.gserviceaccount.com"
# grant service account token creator role to default compute service account
gcloud iam service-accounts add-iam-policy-binding ${MCP_INVOKER_SA} \
--role="roles/iam.serviceAccountTokenCreator" \
--member="serviceAccount:${PROJ_NO}-compute@developer.gserviceaccount.com"
ยืนยันสิทธิ์ IAM
# show iam policy for the custom service account
gcloud iam service-accounts get-iam-policy ${MCP_INVOKER_SA} \
--flatten="bindings[].members" \
--format="table(bindings.role:label=ROLE, bindings.members:label=PRINCIPAL_IDENTITY)"
สร้าง MCP toolspec
เมื่อลงทะเบียนเซิร์ฟเวอร์ MCP ด้วยตนเอง คุณต้องรวมไฟล์ข้อกำหนดของเครื่องมือด้วย toolspec.jsonไฟล์จะแสดงรายการเครื่องมือทั้งหมดที่เซิร์ฟเวอร์ MCP จัดเตรียมไว้ และช่วยให้ผู้ใช้รายอื่นค้นพบเครื่องมือเหล่านั้นได้เมื่อลงทะเบียนแล้ว
test_mcp.py สคริปต์ที่รวมอยู่ในโค้ดเบส mcp-weather/ จะสร้างไฟล์ toolspec.json โดยเชื่อมต่อกับเซิร์ฟเวอร์ MCP เป้าหมาย (ผ่าน SSE หรือ HTTP) และเรียกใช้ list_tools() เพื่อดึงเครื่องมือทั้งหมดที่เซิร์ฟเวอร์แสดง
# fetch oidc token for cloud run authentication
export OIDC_TOKEN=$(gcloud auth print-identity-token)
# generate toolspec for registry ingestion
uv --directory mcp-weather run test_mcp.py --toolspec=include --token="${OIDC_TOKEN}"
การดูเอาต์พุต toolspec ที่สร้างขึ้นจะแสดงแอตทริบิวต์ MCP ที่ Agent Gateway ใช้ในการประเมินและบังคับใช้นโยบายขาออกได้
ยืนยัน MCP toolspec
# show toolspec mcp attributes
jq '.tools[] | {name, isReadOnly, isDestructive, isIdempotent, isOpenWorld}' mcp-weather/toolspec.json
อัปเดตขาเข้าของ Cloud Run
เปลี่ยนการตั้งค่าขาเข้าสำหรับบริการ Cloud Run เพื่อให้ยอมรับเฉพาะคำขอขาเข้าจากเครือข่าย VPC ซึ่งจะป้องกันไม่ให้มีการเข้าถึงปลายทาง MCP แบบสาธารณะโดยตรง และอนุญาตให้เฉพาะทรัพยากรภายในเข้าถึงได้ การรับส่งข้อมูลที่มุ่งไปยังปลายทาง PSC สำหรับ Google API ในเครือข่าย VPC จะถือเป็นการรับส่งข้อมูลขาเข้าภายในและได้รับอนุญาต
# update cloud run service config
gcloud run services update ${MCP_NAME} \
--region=${REGION} \
--ingress=internal
ยืนยันขาเข้าของ Cloud Run
# show cloud run service details
gcloud run services describe ${MCP_NAME} --region=${REGION} | grep -iE 'ingress|egress'
ลงทะเบียนเซิร์ฟเวอร์ MCP
ตอนนี้คุณมี toolspec แล้ว ให้ลงทะเบียนเซิร์ฟเวอร์ MCP กับ Agent Registry ระดับภูมิภาค
# register mcp server
gcloud agent-registry services create ${MCP_NAME} \
--location=${REGION} \
--display-name="${MCP_DISPLAY_NAME}" \
--description="mcp server for weather info" \
--mcp-server-spec-type=tool-spec \
--mcp-server-spec-content=mcp-weather/toolspec.json \
--interfaces=url=${MCP_URL},protocolBinding=JSONRPC
ยืนยันการลงทะเบียน MCP
# list registry regional mcp servers
gcloud agent-registry mcp-servers list --location=${REGION} --format="table(displayName, interfaces.url)"
# show mcp server registry details
gcloud agent-registry services describe ${MCP_NAME} --location=${REGION}
# fetch mcp server registry id
export MCP_REGISTRY_ID=$(gcloud agent-registry services describe ${MCP_NAME} \
--location=${REGION} \
--format="value(registryResource.basename())")
echo ${MCP_REGISTRY_ID}
ส่วนเซิร์ฟเวอร์ MCP ก็มีเพียงเท่านี้... ต่อไปเราจะไปที่ส่วน ADK Agent
10. ADK Agent
agent-weather Agent ADK ที่ติดตั้งใช้งานใน Agent Runtime จะได้รับการกำหนดค่าด้วยการตั้งค่าต่อไปนี้ในสคริปต์การติดตั้งใช้งานเพื่อผสานรวมกับ Agent Platform
"identity_type": types.IdentityType.AGENT_IDENTITYเพื่อจัดสรรข้อมูลประจำตัวหลักที่อิงตาม SPIFFE ที่ไม่ซ้ำกันสำหรับตัวแทน"agent_gateway_config": { "agent_to_anywhere_config": {"agent_gateway": } }เพื่อนำการรับส่งข้อมูลทั้งหมดที่เอเจนต์เริ่มต้นขาออกไปยัง Agent Gateway เพื่อการประเมินและการบังคับใช้นโยบาย
นอกจากนี้ยังมีการกำหนดค่าเอเจนต์ให้ใช้เซิร์ฟเวอร์ MCP โดยการส่ง URL และบัญชีบริการเพื่อดึงโทเค็นรหัส OIDC
ติดตั้งใช้งาน Agent
# deploy agent runtime workload
uv --directory agent-weather run python3 deploy_agent.py \
--project=${PROJ_ID} \
--region=${REGION} \
--src-dir=./agent \
--staging-bucket=${STAGING_BUCKET} \
--display-name="${RE_AGENT_NAME}" \
--description="agent for weather info" \
--mcp-server-url="${MCP_URL}" \
--mcp-invoker-sa="${MCP_INVOKER_SA}" \
--enable-telemetry \
--enable-agent-identity \
--agent-gateway-egress=${AGW_URI} \
--allow-token-sharing
ยืนยันการติดตั้งใช้งาน
ดึงข้อมูล 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}
ยืนยันการกำหนดค่าเกตเวย์
# show agent config details (gateway config)
curl -s -X GET "https://${REGION}-aiplatform.googleapis.com/v1/projects/${PROJ_ID}/locations/${REGION}/reasoningEngines/${RE_ENGINE_ID}" \
-H "Authorization: Bearer $(gcloud auth application-default print-access-token)" \
| jq '{displayName: .displayName, name: .name, effectiveIdentity: .spec.effectiveIdentity, agentGatewayConfig: .spec.deploymentSpec.agentGatewayConfig}'
ให้สิทธิ์ IAM สำหรับการตรวจสอบสิทธิ์
เมื่อกำหนดค่าเอเจนต์ให้ใช้ข้อมูลประจำตัวของเอเจนต์ เอเจนต์จะได้รับโทเค็น (รูปแบบ JWT-SVID) จากบริการโทเค็นความปลอดภัย (STS) แบบรวม ซึ่งลงนามโดย sts.googleapis.com (ผู้ให้บริการข้อมูลประจำตัว SPIFFE)
อย่างไรก็ตาม การตรวจสอบผู้เรียกใช้ IAM ของ Cloud Run ในตัวจะเชื่อถือและยืนยันได้เฉพาะโทเค็นรหัส OIDC มาตรฐานที่ลงนามโดยผู้ออก OIDC หลักของ Google (accounts.google.com)
ดังนั้นจึงใช้บัญชีบริการที่กำหนดเองเพื่อแลกเปลี่ยนโทเค็น STS ที่เชื่อมโยง (JWT-SVID) ซึ่งได้รับจากข้อมูลประจำตัวของตัวแทนกับโทเค็น Google (OIDC) มาตรฐานที่ได้รับโดยใช้การแอบอ้างเป็นบุคคลอื่นของบัญชีบริการในขณะรันไทม์
สร้างการเชื่อมโยงบทบาทที่จำเป็นสำหรับบัญชีบริการที่กำหนดเอง
เชื่อมโยงนโยบายสำหรับการตรวจสอบสิทธิ์ (การแอบอ้างเป็นบุคคลอื่น)
# grant service account token creator role to agent principal identity
gcloud iam service-accounts add-iam-policy-binding ${MCP_INVOKER_SA} \
--role="roles/iam.serviceAccountTokenCreator" \
--member="${RE_AGENT_IDENTITY}"
# grant service account openid token creator role to agent principal identity
gcloud iam service-accounts add-iam-policy-binding ${MCP_INVOKER_SA} \
--role="roles/iam.serviceAccountOpenIdTokenCreator" \
--member="${RE_AGENT_IDENTITY}"
ยืนยันสิทธิ์ IAM
# show iam policy for custom service account
gcloud iam service-accounts get-iam-policy ${MCP_INVOKER_SA} \
--flatten="bindings[].members" \
--format="table(bindings.members.sub('^.*locations/', '.../locations/'):label=PRINCIPAL_IDENTITY, bindings.role:label=ROLE)"
ให้สิทธิ์ IAM สำหรับรันไทม์
การให้สิทธิ์ IAM สำหรับรันไทม์ช่วยให้ Agent เข้าถึงบริการ AI Platform รวมถึง API และบริการหลักอื่นๆ ของ Google ได้โดยใช้ข้อมูลประจำตัวของ Agent หลักที่อิงตาม SPIFFE นโยบายเหล่านี้บังคับใช้โดยใช้ IAM ที่ระดับทรัพยากร
สร้างการเชื่อมโยงบทบาทที่จำเป็นสำหรับข้อมูลประจำตัวของตัวแทน
เชื่อมโยงนโยบายสำหรับการเข้าถึงของตัวแทน
# grant ai platform user role
gcloud projects add-iam-policy-binding ${PROJ_ID} \
--member="${RE_AGENT_IDENTITY}" \
--role="roles/aiplatform.user"
# grant agent default access role
gcloud projects add-iam-policy-binding ${PROJ_ID} \
--member="${RE_AGENT_IDENTITY}" \
--role="roles/aiplatform.agentDefaultAccess"
# grant agent registry viewer role
gcloud projects add-iam-policy-binding ${PROJ_ID} \
--member="${RE_AGENT_IDENTITY}" \
--role="roles/agentregistry.viewer"
# grant cloud logging writer role
gcloud projects add-iam-policy-binding ${PROJ_ID} \
--member="${RE_AGENT_IDENTITY}" \
--role="roles/logging.logWriter"
# grant cloud monitoring writer role
gcloud projects add-iam-policy-binding ${PROJ_ID} \
--member="${RE_AGENT_IDENTITY}" \
--role="roles/monitoring.metricWriter"
# grant browser role for resource manager lookup
gcloud projects add-iam-policy-binding ${PROJ_ID} \
--member="${RE_AGENT_IDENTITY}" \
--role="roles/browser"
ยืนยันสิทธิ์ IAM
# show iam policy on project for agent identity
gcloud projects get-iam-policy ${PROJ_ID} \
--flatten="bindings[].members" \
--filter="bindings.members:${RE_AGENT_IDENTITY}" \
--format="table(bindings.members.sub('^.*locations/', '.../locations/'):label=PRINCIPAL_IDENTITY, bindings.role:label=ROLE)"
ส่วนของตัวแทน ADK ก็มีเพียงเท่านี้... ต่อไปเราจะไปที่ส่วนนโยบาย
11. นโยบาย
นโยบายการให้สิทธิ์การกำกับดูแล Agent อนุญาตให้กำหนดเส้นทางการรับส่งข้อมูลจาก Agent AI ผ่าน Agent Gateway และไปยังปลายทางของทรัพยากรขั้นสุดท้าย (เช่น ปลายทางเซิร์ฟเวอร์ MCP ส่วนตัวสำหรับการดึงข้อมูล) เมื่อการรับส่งข้อมูลไปถึงปลายทาง สิทธิ์ระดับบริการหรือระดับแอปพลิเคชันปกติจะให้สิทธิ์เข้าถึงข้อมูล
การให้บทบาท IAM สำหรับขาออกของ Agent Gateway จะเปิดใช้นโยบายการเข้าถึงที่อนุญาตให้เข้าถึงข้อมูลประจำตัวหลักของ Agent เพื่อเข้าถึงทรัพยากรปลายทางที่ลงทะเบียนผ่าน Agent Gateway ระบบจะบังคับใช้นโยบายที่ระดับเกตเวย์ของตัวแทนและตรวจสอบโดยใช้นโยบาย IAM ของ Identity-Aware Proxy (IAP)
มอบบทบาท IAM สำหรับขาออกของ 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 ซึ่งจะใช้สิทธิ์กับทรัพยากรย่อยที่เฉพาะเจาะจง
กำหนดค่านโยบาย Agent ไปยังเซิร์ฟเวอร์ MCP
สร้างนโยบายสำหรับ Agent ไปยังเซิร์ฟเวอร์ MCP
# fetch active etag on policy for mcp server
export IAP_ETAG=$(gcloud beta iap web get-iam-policy \
--resource-type=agent-registry --region=${REGION} \
--mcp-server=${MCP_REGISTRY_ID} --format="value(etag)")
echo ${IAP_ETAG}
หมายเหตุ: etag: ควรแสดงผล ACAB เริ่มต้นเนื่องจากยังไม่ได้กำหนดนโยบาย
# create policy config file
cat > cfg/iap-policy-agent-to-mcp.json << EOF
{
"bindings": [
{
"role": "roles/iap.egressor",
"members": [
"${RE_AGENT_IDENTITY}"
]
}
],
"etag": "${IAP_ETAG}"
}
EOF
เชื่อมโยงนโยบายสำหรับ Agent กับเซิร์ฟเวอร์ MCP
# import policy file
gcloud beta iap web set-iam-policy cfg/iap-policy-agent-to-mcp.json \
--resource-type=agent-registry \
--mcp-server=${MCP_REGISTRY_ID} \
--region=${REGION}
ยืนยันสิทธิ์ IAM
# show iap iam policy on mcp server for agent
gcloud beta iap web get-iam-policy \
--region=${REGION} \
--resource-type=agent-registry \
--mcp-server=${MCP_REGISTRY_ID}
ส่วนนโยบายก็มีเพียงเท่านี้... ต่อไปเราจะไปที่ส่วนการตรวจสอบ
12. ตรวจสอบ
ส่วนขยายการให้สิทธิ์ของ Agent Gateway ทำงานในโหมด DRY_RUN ระบบจะสังเกตและบันทึกคำขอขาออก แต่จะไม่บล็อก การวิเคราะห์บันทึกก่อนเปลี่ยนไปใช้โหมด ENFORCED จะช่วยยืนยันว่าต้องกำหนดค่านโยบายใดเพื่อให้การเข้าชมที่ต้องการ
ทดสอบการค้นหาของ Agent
เปิดหน้าต่างเบราว์เซอร์ไปยัง UI ของ Google Cloud Console แล้วไปที่
- แพลตฟอร์มตัวแทน → ตัวแทน → การติดตั้งใช้งาน →
agent-weather - เลือกแท็บสนามเด็กเล่น
หรือใช้คำสั่งเทอร์มินัลนี้แล้วคลิกลิงก์เพื่อไปยังสนามเด็กเล่นของ Agent
# playground
echo "https://console.cloud.google.com/agent-platform/runtimes/locations/${REGION}/agent-engines/${RE_ENGINE_ID}/playground?project=${PROJ_ID}"
ส่งคำค้นหาทดสอบบางรายการ....
What is the weather like in London?How warm is it in New York?
ตรวจสอบว่าการค้นหาส่งการตอบกลับที่ถูกต้อง
วิเคราะห์บันทึกการตรวจสอบ
ดูบันทึกและตรวจสอบการประเมินนโยบายการทดสอบ
# show gateway logs for endpoints and authz status (duplicates removed)
gcloud logging read \
"resource.type=\"networkservices.googleapis.com/Gateway\" \
AND httpRequest.requestUrl:*" \
--project=${PROJ_ID} \
--limit=50 \
--freshness=24h \
--format="table( \
timestamp.date(tz=LOCAL):label=TIMESTAMP, \
httpRequest.status:label=STATUS, \
jsonPayload.authzPolicyInfo.result:label=AUTHZ, \
httpRequest.requestUrl.sub('(https?://[^/:]+).*', '\1'):label=ENDPOINT \
)" | awk 'NR==1 {print; next} ! seen[$2,$3,$4]++'
TIMESTAMP STATUS AUTHZ ENDPOINT
YYYY-MM-DDTHH:MM:SS 200 ALLOWED https://cloudresourcemanager.googleapis.com
YYYY-MM-DDTHH:MM:SS 200 ALLOWED https://${REGION}-aiplatform.googleapis.com
YYYY-MM-DDTHH:MM:SS 200 ALLOWED https://iamcredentials.googleapis.com
YYYY-MM-DDTHH:MM:SS 200 ALLOWED https://mcp-weather-${PROJ_NO}.${REGION}.run.app
YYYY-MM-DDTHH:MM:SS 200 ALLOWED https://telemetry.googleapis.com
YYYY-MM-DDTHH:MM:SS 202 ALLOWED https://mcp-weather-${PROJ_NO}.${REGION}.run.app
กำหนดค่านโยบาย Agent ไปยังอุปกรณ์ปลายทาง
เนื่องจากมีการลงทะเบียน Google API หลักสำหรับ agent-weather ภายใต้บริการปลายทางแบบรวมในรีจิสทรี (gapi.core.services) จึงต้องใช้นโยบายเดียวเพื่อให้สิทธิ์ขาออกของตัวแทนสำหรับการเข้าถึงปลายทาง
สร้างนโยบายสำหรับ Agent ไปยังอุปกรณ์ปลายทาง
# set var for endpoint display name
export ENDPOINT_DISPLAY_NAME="gapi.core.services"
echo ${ENDPOINT_DISPLAY_NAME}
# fetch endpoint registry id
export ENDPOINT_REGISTRY_ID=$(gcloud agent-registry services list \
--location=${REGION} \
--filter="displayName=${ENDPOINT_DISPLAY_NAME}" \
--format="value(registryResource.basename())")
echo ${ENDPOINT_REGISTRY_ID}
# create policy config file
cat > cfg/iap-policy-agent-to-ep.json << EOF
{
"bindings": [
{
"role": "roles/iap.egressor",
"members": [
"${RE_AGENT_IDENTITY}"
]
}
]
}
EOF
เชื่อมโยงนโยบายสำหรับ Agent กับปลายทาง
# import policy file (bind iam policy)
gcloud -q beta iap web set-iam-policy cfg/iap-policy-agent-to-ep.json \
--resource-type=agent-registry \
--endpoint=${ENDPOINT_REGISTRY_ID} \
--region=${REGION}
ยืนยันสิทธิ์ IAM
# show iap iam policy on endpoint for agent
gcloud beta iap web get-iam-policy \
--region=${REGION} \
--resource-type=agent-registry \
--endpoint=${ENDPOINT_REGISTRY_ID}
ส่วนการตรวจสอบสิ้นสุดลงแล้ว... ต่อไปเป็นส่วนบังคับใช้
13. บังคับใช้
เอเจนต์สามารถส่งคำขอผ่านเกตเวย์ในโหมด DRY_RUN ได้สำเร็จ เราวิเคราะห์บันทึกการเข้าถึงและปลายทางเพื่อสร้างชุดนโยบายการกำกับดูแลที่อนุญาตให้มีการรับส่งข้อมูลขาออกจากเอเจนต์ที่จำเป็น ตอนนี้ให้เปลี่ยนส่วนขยายการให้สิทธิ์ IAP ของ Agent Gateway เป็นโหมด ENFORCE โดยการอัปเดตนโยบายการให้สิทธิ์
อัปเดตส่วนขยายการให้สิทธิ์
สร้างส่วนขยาย authz
# create authz extension config file (enforced mode)
cat > cfg/${AGW_NAME}-svc-ext-authz-iap-enforced.yaml << EOF
name: ${AGW_NAME}-svc-ext-authz-iap-enforced
service: iap.googleapis.com
failOpen: false
timeout: 1s
metadata:
iapPolicyVersion: "V1"
EOF
ส่วนขยายการให้สิทธิ์นำเข้า
# import authz 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}
ยืนยันส่วนขยาย authz
# 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}
ยืนยันการบังคับใช้
กลับไปที่สนามเด็กเล่นของเอเจนต์ใน UI ของคอนโซล
- คลิกปุ่ม "+ เซสชันใหม่" เพื่อสร้างเซสชันแชทใหม่
ส่งคำค้นหาทดสอบเพิ่มเติม...
What is the current temperature in Los Angeles?
สังเกตว่าคำขอของเอเจนต์ไปยังโมเดลพื้นฐานของ Gemini (${REGION}-aiplatform.googleapis.com/...) และปลายทางของเซิร์ฟเวอร์ MCP (mcp-weather-${PROJ_NO}.${REGION}.run.app/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
)"
ดูบันทึก MCP ของ Agent Gateway และสังเกตวิธีตรวจสอบเพย์โหลดของแอปพลิเคชัน MCP (JSON-RPC) เพื่อแสดงข้อมูลเมตาของโปรโตคอล รวมถึงเครื่องมือที่กำลังดำเนินการ
# show gateway logs for mcp requests with method and tool name
gcloud logging read \
"resource.type=\"networkservices.googleapis.com/Gateway\" \
AND jsonPayload.agentGatewayInfo.mcpInfo.method:*" \
--project=${PROJ_ID} \
--limit=10 \
--format="table(
timestamp.date(tz=LOCAL):label=TIMESTAMP,
httpRequest.status:label=STATUS,
jsonPayload.authzPolicyInfo.result:label=IAP_AUTHZ,
jsonPayload.agentGatewayInfo.mcpInfo.method:label=MCP_METHOD,
jsonPayload.agentGatewayInfo.mcpInfo.parameter:label=TOOL_NAME,
httpRequest.requestUrl:label=URL
)"
วิเคราะห์บันทึกไฟร์วอลล์
ดูบันทึกสำหรับลำดับความสำคัญของกฎนโยบายไฟร์วอลล์เครือข่าย 1001
# show firewall logs for rule 1001
gcloud logging read \
"jsonPayload.rule_details.priority=1001" \
--project=${PROJ_ID} \
--limit=10 \
--format="table(
timestamp.date(tz=LOCAL):label=TIMESTAMP,
jsonPayload.disposition:label=ACTION,
jsonPayload.connection.src_ip:label=SRC_IP,
jsonPayload.connection.dest_ip:label=DEST_IP,
jsonPayload.connection.dest_port:label=DEST_PORT,
jsonPayload.vpc.subnetwork_name:label=SUBNET
)"
โปรดทราบมุมมองระดับเครือข่ายของเส้นทางการเข้าชมต่างๆ ดังนี้
- Agent Gateway สื่อสารกับทรัพยากรเครือข่าย VPC ภายในโดยใช้
subnet-${REGION}-agw - เซิร์ฟเวอร์ MCP ที่โฮสต์ใน Cloud Run จะเรียกใช้ API สภาพอากาศภายนอกโดยใช้
subnet-${REGION}-crun
TIMESTAMP ACTION SRC_IP DEST_IP DEST_PORT SUBNET
YYYY-MM-DDTHH:MM:SS ALLOWED 10.10.10.16 188.40.99.226 443 subnet-${REGION}-crun
YYYY-MM-DDTHH:MM:SS ALLOWED 10.10.10.16 202.61.206.6 443 subnet-${REGION}-crun
YYYY-MM-DDTHH:MM:SS ALLOWED 10.10.10.16 188.40.99.226 443 subnet-${REGION}-crun
YYYY-MM-DDTHH:MM:SS ALLOWED 10.10.10.16 202.61.206.6 443 subnet-${REGION}-crun
YYYY-MM-DDTHH:MM:SS ALLOWED 10.10.10.16 202.61.206.6 443 subnet-${REGION}-crun
YYYY-MM-DDTHH:MM:SS ALLOWED 10.10.10.16 202.61.206.6 443 subnet-${REGION}-crun
YYYY-MM-DDTHH:MM:SS ALLOWED 192.168.10.2 240.0.0.10 443 subnet-${REGION}-agw
YYYY-MM-DDTHH:MM:SS ALLOWED 192.168.10.2 240.0.0.10 443 subnet-${REGION}-agw
YYYY-MM-DDTHH:MM:SS ALLOWED 192.168.10.2 240.0.0.10 443 subnet-${REGION}-agw
วิเคราะห์บันทึก DNS
ดูบันทึกการค้นหา DNS สำหรับคำขอที่โซน DNS ส่วนตัว (priv-zone-run) แก้ไข
gcloud logging read \
"resource.type=\"dns_query\" AND resource.labels.target_name=\"priv-zone-run\"" \
--project=${PROJ_ID} \
--limit=10 \
--format="table(
timestamp.date(tz=LOCAL):label=TIMESTAMP,
jsonPayload.queryName:label=QUERY_NAME,
jsonPayload.queryType:label=TYPE,
jsonPayload.rdata:label=RESPONSE_RDATA,
jsonPayload.sourceNetwork:label=NETWORK,
resource.labels.source_type:label=SRC_TYPE
)"
โปรดทราบว่าการค้นหา DNS สำหรับบริการ Cloud Run (mcp-weather...run.app) มาจากเครือข่าย VPC โดยใช้การเพียร์ DNS และได้รับการแก้ไขไปยังปลายทาง PSC ภายในสำหรับ Google APIs (240.0.0.10) เรียบร้อยแล้ว
TIMESTAMP QUERY_NAME TYPE RESPONSE_RDATA NETWORK SRC_TYPE
YYYY-MM-DDTHH:MM:SS mcp-weather-${PROJ_NO}.${REGION}.run.app. A mcp-weather-${PROJ_NO}.${REGION}.run.app. 300 IN a 240.0.0.10 vnet-${SLUG} peering-zone
YYYY-MM-DDTHH:MM:SS mcp-weather-${PROJ_NO}.${REGION}.run.app. A mcp-weather-${PROJ_NO}.${REGION}.run.app. 300 IN a 240.0.0.10 vnet-${SLUG} peering-zone
YYYY-MM-DDTHH:MM:SS mcp-weather-${PROJ_NO}.${REGION}.run.app. A mcp-weather-${PROJ_NO}.${REGION}.run.app. 300 IN a 240.0.0.10 vnet-${SLUG} peering-zone
YYYY-MM-DDTHH:MM:SS mcp-weather-${PROJ_NO}.${REGION}.run.app. A mcp-weather-${PROJ_NO}.${REGION}.run.app. 300 IN a 240.0.0.10 vnet-${SLUG} peering-zone
ส่วนการบังคับใช้ก็มีเพียงเท่านี้... ต่อไปเราจะไปที่ส่วนการล้างข้อมูล
14. ล้างข้อมูล
# delete agent runtime
curl -s -X DELETE "https://${REGION}-aiplatform.googleapis.com/v1/projects/${PROJ_ID}/locations/${REGION}/reasoningEngines/${RE_ENGINE_ID}?force=true" \
-H "Authorization: Bearer $(gcloud auth application-default print-access-token)"
# next
# delete agent resources
gcloud -q storage rm --recursive gs://${STAGING_BUCKET}
for ROLE in \
"roles/aiplatform.user" \
"roles/aiplatform.agentDefaultAccess" \
"roles/agentregistry.viewer" \
"roles/logging.logWriter" \
"roles/monitoring.metricWriter" \
"roles/browser"; do
gcloud -q projects remove-iam-policy-binding ${PROJ_ID} \
--member="${RE_AGENT_IDENTITY}" \
--role="${ROLE}"
done
# next
# delete mcp (cloud run) resources
gcloud -q projects remove-iam-policy-binding ${PROJ_ID} \
--member="serviceAccount:${PROJ_NO}-compute@developer.gserviceaccount.com" \
--role="roles/run.builder"
gcloud -q run services delete ${MCP_NAME} --region=${REGION}
gcloud -q artifacts repositories delete cloud-run-source-deploy --location=${REGION}
gcloud -q iam service-accounts delete sa-${MCP_NAME}-invoker@${PROJ_ID}.iam.gserviceaccount.com
gcloud -q agent-registry services delete ${MCP_NAME} --location=${REGION}
# next
# delete gateway resources (policy binding must be deleted synchronously first)
gcloud -q beta network-security authz-policies delete ${AGW_NAME}-authz-policy-profile-iap --location=${REGION}
gcloud -q beta service-extensions authz-extensions delete ${AGW_NAME}-svc-ext-authz-iap-dryrun --location=${REGION} --async
gcloud -q beta service-extensions authz-extensions delete ${AGW_NAME}-svc-ext-authz-iap-enforced --location=${REGION} --async
gcloud -q network-services agent-gateways delete ${AGW_NAME} --location=${REGION} --async
# next
# remove policies
export IAP_ETAG=$(gcloud beta iap web get-iam-policy --resource-type=agent-registry --endpoint=${ENDPOINT_REGISTRY_ID} --region=${REGION} --format="value(etag)")
cat > cfg/iap-policy-empty.json << EOF
{
"bindings": [],
"etag": "${IAP_ETAG}"
}
EOF
gcloud -q beta iap web set-iam-policy cfg/iap-policy-empty.json \
--resource-type=agent-registry \
--endpoint=${ENDPOINT_REGISTRY_ID} \
--region=${REGION}
# next
# delete dns resources
gcloud -q dns record-sets delete *.run.app --type=A --zone=priv-zone-run
gcloud -q dns managed-zones delete priv-zone-run
gcloud -q dns policies update dns-policy-${SLUG} --networks=""
gcloud -q dns policies delete dns-policy-${SLUG}
# next
# delete router (includes nat) and psc resources
gcloud -q compute routers delete cr-nat-${SLUG}-${REGION} --region=${REGION}
gcloud -q compute forwarding-rules delete psc2gapis --global
gcloud -q compute addresses delete ip-psc2gapis --global
# next
# delete firewall resources
gcloud -q compute network-firewall-policies associations delete --name=fw-policy-bind-${SLUG} --firewall-policy=fw-policy-${SLUG} --global-firewall-policy
gcloud -q compute network-firewall-policies rules delete 1001 --firewall-policy=fw-policy-${SLUG} --global-firewall-policy
gcloud -q compute network-firewall-policies delete fw-policy-${SLUG} --global
# next
# delete network resources
gcloud -q compute networks subnets delete subnet-${REGION}-agw --region=${REGION}
gcloud -q compute networks subnets delete subnet-${REGION}-crun --region=${REGION}
gcloud -q compute network-attachments delete psc-na-${REGION}-agw --region=${REGION}
gcloud -q compute networks delete vnet-${SLUG}
# next
# clean up local working directories and generated configs
rm -rf cfg agent-weather mcp-weather
# end
ส่วนการล้างข้อมูลก็มีเพียงเท่านี้... ต่อไปเราจะไปที่บทสรุปกัน
15. บทสรุป
ยินดีด้วย คุณทำให้ Agent Gateway ใช้งานได้และควบคุมการรับส่งข้อมูลของเอเจนต์ AI ขาออกเรียบร้อยแล้ว

Cosmopup คิดว่า Codelabs เป็นสิ่งที่ยอดเยี่ยมที่สุด!
ขั้นตอนถัดไป
- ดูฟีเจอร์ขั้นสูงและบทแนะนำได้ในเอกสารประกอบแพลตฟอร์ม Agent ของ Gemini Enterprise
- กำหนดค่าขอบเขตความปลอดภัยของ Model Armor ใน Agent Gateway เพื่อความปลอดภัยเพิ่มเติมของ AI
- ดูนโยบายการกำกับดูแลเชิงความหมายเพื่อบังคับใช้กฎทางธุรกิจและการปฏิบัติตามข้อกำหนดสำหรับคำค้นหาที่เป็นภาษาธรรมชาติ
โปรดแสดงความคิดเห็น ถามคำถาม หรือแก้ไขโดยใช้แบบฟอร์มความคิดเห็นนี้
ขอขอบคุณ