Agent Gateway thoát khỏi Agent Runtime sang MCP bên ngoài

1. Giới thiệu

Lớp học lập trình này khám phá hoạt động quản trị lưu lượng truy cập đi ra của Cổng tác nhân cho các tác nhân AI truy cập vào các máy chủ Giao thức ngữ cảnh mô hình (MCP) bên ngoài được lưu trữ bên ngoài Google Cloud.

Các ứng dụng AI, từ chatbot độc lập đến các hệ thống tự động có quy trình công việc nhiều tác nhân, có thể linh hoạt gọi các công cụ bên ngoài. Việc cung cấp cho các tác nhân quyền truy cập có kiểm soát để truy vấn cơ sở dữ liệu, tìm nạp nội dung trên web và thực hiện các hành động là điều cần thiết để đảm bảo các tác nhân hoạt động an toàn và hiệu quả. Tuy nhiên, trong môi trường doanh nghiệp, việc bảo mật quá trình thực thi công cụ của tác nhân là một thách thức. Nếu có quyền truy cập trực tiếp vào mạng, các cuộc tấn công tiêm câu lệnh hoặc ảo giác của mô hình có thể khiến tác nhân đánh cắp dữ liệu nhạy cảm hoặc chạy các lệnh phá hoại.

Để quản lý các tác nhân tự trị ở quy mô lớn, Agent Gateway cung cấp một điểm thực thi tập trung, không tin tưởng bất cứ điều gì được tích hợp trực tiếp vào cấu trúc Agent Platform. Thay vì dựa vào các phương thức triển khai tuỳ chỉnh riêng cho từng ứng dụng hoặc mã tác nhân, Agent Gateway cung cấp tính năng định tuyến mạng, quản trị tác nhân và bảo mật thời gian chạy được thực thi ở cấp nền tảng.

Khi hoạt động ở chế độ truyền dữ liệu ra (agent-to-anywhere), Agent Gateway sẽ uỷ quyền tất cả các yêu cầu gửi đi từ những tác nhân được định cấu hình để sử dụng cổng này. Mỗi yêu cầu về khối lượng công việc của tác nhân đều được xác thực bằng Danh tính tác nhân duy nhất và được uỷ quyền bằng các chính sách Uỷ quyền truy cập dựa trên danh tính (IAP). Các lệnh gọi công cụ MCP được giải mã và kiểm tra một cách linh động để thực thi chính sách. Quản trị viên bảo mật có thể thực thi các quyền chi tiết một cách tập trung để đảm bảo các tác nhân chỉ có thể gọi các phương thức và điểm cuối đã được phê duyệt.

Sản phẩm bạn sẽ tạo ra

  • Agent Gateway ở chế độ truyền dữ liệu ra (agent-to-anywhere)
  • Tiện ích uỷ quyền Identity-Aware Proxy (IAP)
  • Tác nhân ADK Thời gian chạy của tác nhân có danh tính của tác nhân
  • Sổ đăng ký tác nhân có API của Google và các điểm cuối MCP
  • Khả năng kết nối công cụ MCP bên ngoài với tập dữ liệu công khai Data Commons
  • Chính sách uỷ quyền có tính năng kiểm soát quyền truy cập IAM

figure1

Hình 1. Cấu trúc lớp học lập trình

Kiến thức bạn sẽ học được

  • Cách triển khai Agent Gateway theo một trình tự cấu hình có cấu trúc
  • Cách chuyển đổi chính sách uỷ quyền từ chế độ chạy thử sang chế độ thực thi
  • Cách đăng ký các điểm cuối Google API và máy chủ MCP trong Agent Registry
  • Cách sử dụng chính sách uỷ quyền có điều kiện dựa trên các thuộc tính giao thức MCP
  • Cách kiểm tra nhật ký Cổng tác nhân để xác thực hoạt động quản trị dữ liệu đầu ra

Bạn cần có

  • Một dự án trên Google Cloud đã bật tính năng thanh toán
  • Quyền IAM để cung cấp các dịch vụ mạng và tài nguyên Nền tảng tác nhân
  • Một trình bao tương thích với POSIX (bash hoặc zsh) đã cài đặt Google Cloud CLI (các thành phần gcloudbq)
  • Công cụ dòng lệnh: git, curl, jq (trình xử lý JSON), Python 3 và uv (trình quản lý gói Python)
  • Khoá Data Commons API miễn phí để truy cập vào các tập dữ liệu kiểm thử truy vấn

2. Khái niệm

Trình tự triển khai

Lớp học lập trình này tuân theo một trình tự cấu hình có cấu trúc để các tác nhân có quyền truy cập vào các tài nguyên cần thiết khi khởi tạo và có thể xác nhận khả năng kết nối trước khi áp dụng các chính sách truy cập bắt buộc.

Lớp học lập trình này sử dụng trình tự triển khai sau:

  1. Bắt đầu ở chế độ DRY_RUN: Đảm bảo rằng các yêu cầu của tác nhân đang đến được cổng và đi qua (chỉ ở chế độ kiểm tra).
  2. Đăng ký tất cả các dịch vụ: Đăng ký tất cả thành phần dựa trên tác nhân trong Sổ đăng ký tác nhân và xác nhận quyền truy cập vào công cụ của tác nhân.
  3. Tạo chính sách uỷ quyền: Tạo và áp dụng chính sách uỷ quyền để cho phép lưu lượng truy cập truyền dữ liệu ra bên ngoài từ các tác nhân đến máy chủ và điểm cuối MCP.
  4. Chuyển sang chế độ ENFORCED: Cập nhật chính sách về tiện ích uỷ quyền để thực thi các chính sách và chặn lưu lượng truy cập đi ra trái phép.

figure2

Hình 2. Trình tự triển khai

Cấu trúc liên kết định tuyến xuất dữ liệu

Cổng Agent Gateway (agent-to-anywhere) đóng vai trò là một proxy đi ra tập trung, không tin cậy cho các khối lượng công việc có tác nhân. Khi một tác nhân đưa ra yêu cầu đối với một công cụ hoặc API bên ngoài, yêu cầu gửi đi sẽ bị Agent Gateway chặn và đánh giá dựa trên các chính sách quản trị trước khi được định tuyến đến đích đến. Trong cấu trúc Nền tảng tác nhân của Google Cloud, Cổng tác nhân cung cấp khả năng kết nối lớp dữ liệu với:

  • Mạng riêng (VPC): Lưu lượng truy cập đi nhắm đến các API nội bộ của doanh nghiệp, các vi dịch vụ, cơ sở dữ liệu được lưu trữ trong các VPC riêng tư và các mạng tại chỗ hoặc trên nhiều đám mây có thể truy cập thông qua kết nối kết hợp.
  • Mạng bên ngoài (Internet): Lưu lượng truy cập đi nhắm đến các dịch vụ web, API SaaS hoặc điểm cuối công khai của bên thứ ba.
  • Dịch vụ AI và Nền tảng tác nhân: Lưu lượng truy cập đi nhắm đến các API được quản lý của Google Cloud, các mô hình cơ sở, các điểm cuối Google MCP (chẳng hạn như BigQuery) và các dịch vụ quản trị nền tảng (Agent Registry và các chính sách IAP).

figure3

Hình 3. Cấu trúc liên kết định tuyến truyền dữ liệu ra bên ngoài của Agent Gateway

Lớp học lập trình này tập trung vào lưu lượng truy cập đi từ một tác nhân tuỳ chỉnh trên Agent Runtime nhắm đến một điểm cuối máy chủ MCP bên ngoài của bên thứ ba có thể truy cập qua Internet.

Kiểm tra giao thức MCP

Cổng ra của Agent Gateway (agent-to-anywhere) có thể phân tích nội dung của các yêu cầu MCP và đánh giá các chính sách truy cập dựa trên các thuộc tính giao thức chi tiết. Các chính sách gửi dữ liệu từ máy chủ đến MCP có thể bao gồm các điều kiện (được thể hiện bằng Ngôn ngữ diễn đạt thông thường (CEL)) được thực thi trong thời gian chạy trên mọi yêu cầu.

Các lệnh gọi MCP thường sử dụng định dạng giao thức truyền JSON-RPC và phương thức truyền HTTP. Thông tin chi tiết về phương thức MCP đang được gọi (ví dụ: tools/call), tên công cụ mục tiêu và mọi đối số đều nằm trong tải trọng JSON trong phần nội dung HTTP.

Thuộc tính iap.googleapis.com/mcp.toolName được Agent Gateway trích xuất bằng cách phân tích cú pháp nội dung JSON để tìm giá trị nhận dạng công cụ được chỉ định trong yêu cầu.

Các thuộc tính như iap.googleapis.com/mcp.tool.isReadOnlymcp.tool.isDestructive thường không được gửi trong mỗi nội dung yêu cầu. Thay vào đó, đây là chú thích (siêu dữ liệu) được liên kết với công cụ. Vì vậy, khi Agent Gateway trích xuất toolName từ nội dung, hệ thống sẽ tra cứu định nghĩa công cụ và các thuộc tính được liên kết từ Agent Registry, nơi nội dung toolspec.json đã được đăng ký.

figure4

Hình 4. Kiểm tra MCP của Agent Gateway

Biểu thức CEL được dùng trong các điều kiện IAM của IAP sử dụng định dạng tiêu chuẩn api.getAttribute('iap.googleapis.com/ATTRIBUTE_NAME', 'DEFAULT_VALUE')== 'DESIRED_VALUE'.

Bảng này mô tả các thuộc tính quản trị lưu lượng truy cập đi của Cổng tác nhân có thể được áp dụng cho các yêu cầu của máy chủ MCP:

Thuộc tính

Phương thức / Vị trí MCP

Mô tả

mcp.toolName

tools/call (Nội dung)

Giá trị nhận dạng công cụ mục tiêu được yêu cầu trong tải trọng RPC (ví dụ: "delete_instance")

mcp.tool.isReadOnly

Sổ đăng ký tác nhân (toolspec.json)

Cho biết liệu công cụ có ở chế độ chỉ đọc hay không (không sửa đổi môi trường của công cụ)

mcp.tool.isDestructive

Sổ đăng ký tác nhân (toolspec.json)

Cho biết liệu việc gọi công cụ có thể dẫn đến các sửa đổi không thể đảo ngược hoặc mất dữ liệu hay không

mcp.tool.isIdempotent

Sổ đăng ký tác nhân (toolspec.json)

Cho biết liệu việc thực thi công cụ nhiều lần với các đối số giống hệt nhau có tạo ra trạng thái giống hệt nhau hay không

mcp.tool.isOpenWorld

Sổ đăng ký tác nhân (toolspec.json)

Cho biết liệu công cụ có vượt ra ngoài các hệ thống nội bộ có giới hạn để truy cập vào Internet công cộng không giới hạn hay không

Đến đây là kết thúc phần khái niệm... tiếp theo là phần Thiết lập.

3. Thiết lập

Các vai trò IAM bắt buộc

Bạn cần có các vai trò sau đây để tạo tài nguyên trong Lớp học lập trình này:

Danh mục

Vai trò IAM bắt buộc (ID)

Mô tả

Quản lý API

roles/serviceusage.serviceUsageAdmin

Bật các dịch vụ Google Cloud API

Kết nối mạng và cổng

roles/networkservices.admin

Cấp phép Agent Gateway

Tiện ích dịch vụ

roles/serviceextensions.admin

Định cấu hình tiện ích định tuyến

Bảo mật mạng

roles/networksecurity.admin

Triển khai chính sách uỷ quyền

Sổ đăng ký tác nhân

roles/agentregistry.admin

Máy chủ được phép trong danh mục

Vertex AI và các tác nhân

roles/aiplatform.admin

Triển khai khối lượng công việc Thời gian chạy tác nhân

Chính sách xuất dữ liệu

roles/iap.admin

Áp dụng chính sách của roles/iap.egressor

Cloud Storage

roles/storage.admin

Quản lý các vùng lưu trữ dàn dựng việc triển khai

Nhật ký và kiểm tra

roles/logging.viewer

Kiểm tra dấu vết và nhật ký kiểm tra

Ngoài ra, hãy sử dụng một vai trò cơ bản rộng như roles/admin hoặc vai trò cũ roles/owner.

Truy cập vào dự án của bạn

Lớp học lập trình này sử dụng một dự án trên đám mây duy nhất trên Google Cloud. Các bước định cấu hình sử dụng CLI gcloud và các lệnh shell Linux.

Bắt đầu bằng cách truy cập vào dòng lệnh của dự án trên Google Cloud:

Đặt mã dự án

gcloud config set project SET_YOUR_PROJECT_ID_HERE

Xác thực phiên

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

Đặt các biến môi trường của trình bao

# 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

Nếu bạn đang chạy bản cài đặt do chính mình quản lý của Google Cloud SDK (tức là bên ngoài Cloud Shell), hãy cập nhật các thành phần lên phiên bản mới nhất.

# update gcloud cli
gcloud components update

Bật dịch vụ 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

Đến đây là kết thúc phần thiết lập... tiếp theo là phần Cổng.

4. Cổng

Trước khi thực thi các chế độ kiểm soát quyền truy cập, hãy triển khai Agent Gateway và định cấu hình tiện ích uỷ quyền của tiện ích này ở chế độ DRY_RUN. Điều này cho phép các lệnh gọi công cụ gửi đi thành công trong khi ghi nhật ký kết quả đánh giá cho mục đích kiểm tra.

Ở đây, Agent Gateway sử dụng một sổ đăng ký theo khu vực để hỗ trợ các tài nguyên Agent Runtime theo khu vực.

Tạo cổng

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

Đến đây là kết thúc phần cổng... tiếp theo là phần Uỷ quyền.

5. Ủy quyền

Tiện ích uỷ quyền Agent Gateway cho Identity-Aware Proxy (IAP) là một loại Tiện ích dịch vụ dùng để uỷ quyền quyết định uỷ quyền cho tất cả thông tin liên lạc của Nền tảng Agent.

  1. Quy trình uỷ quyền: Khi một tác nhân cố gắng gọi một điểm cuối bên ngoài hoặc máy chủ MCP, tác nhân đó sẽ định tuyến yêu cầu đến Cổng tác nhân. Thay vì đánh giá quyền truy cập cục bộ, cổng sẽ sử dụng tiện ích uỷ quyền để gửi một lệnh gọi đến dịch vụ đánh giá IAP. IAP đánh giá danh tính của tác nhân (dựa trên SPIFFE) dựa trên chính sách IAM của tài nguyên đích trong Sổ đăng ký tác nhân. IAP trả về quyết định ALLOW hoặc DENY cho cổng, cổng này sẽ chuyển tiếp lưu lượng truy cập hoặc chặn lưu lượng truy cập bằng mã trạng thái HTTP 403 Forbidden.
  2. Chế độ thực thi: Ở chế độ DRY_RUN, IAP đánh giá các yêu cầu và ghi lại các quyết định trong Cloud Logging mà không chặn lưu lượng truy cập. Ở chế độ ENFORCE, mọi yêu cầu từ một tác nhân không được uỷ quyền hoặc đến một mục tiêu chưa đăng ký đều bị chặn ngay lập tức.
  3. Lớp liên kết: Tiện ích dịch vụ được kết nối với Agent Gateway bằng một chính sách uỷ quyền được định cấu hình bằng hồ sơ REQUEST_AUTHZ.

Tiện ích uỷ quyền

Tạo tiện ích uỷ quyền

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

Chính sách ủy quyền

Chính sách uỷ quyền liên kết nhà cung cấp dịch vụ bảo mật (IAP) với tài nguyên cổng mục tiêu và chỉ định hồ sơ chặn (REQUEST_AUTHZ).

Tạo chính sách uỷ quyền

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

Đến đây là kết thúc phần uỷ quyền... tiếp theo là phần toàn bộ mã nguồn.

6. Toàn bộ mã nguồn

Mã tác nhân và tập lệnh đăng ký điểm cuối được dùng cho Lớp học lập trình này được duy trì trong một kho lưu trữ Google Cloud GitHub từ xa. Các bước sau đây sẽ sao chép kho lưu trữ trên máy, sao chép các tệp cần thiết vào cấu trúc thư mục đang hoạt động hiện tại, sau đó dọn dẹp các tệp tạm thời.

Một vùng lưu trữ tạm thời sẽ được tạo cho Thời gian chạy của tác nhân để tải lên, tạo và triển khai mã ứng dụng tác nhân được đóng gói và các cấu phần phần mềm phụ thuộc của mã đó.

Tìm nạp cấu phần phần mềm từ xa

# 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

Tạo vùng lưu trữ tạm thời

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

Đến đây là kết thúc phần toàn bộ mã nguồn... tiếp theo là phần Registry (Sổ đăng ký).

7. Đăng ký

Agent Registry là một kho lưu trữ tập trung của tất cả các tác nhân, máy chủ MCP và điểm cuối (API) trong hệ sinh thái AI. Đây cũng là một danh mục mà các ứng dụng AI có thể dùng để liệt kê, tìm kiếm và khám phá các công cụ và dịch vụ đã đăng ký khác. Chế độ truyền dữ liệu ra ngoài của Cổng tác nhân (agent-to-anywhere) sử dụng mô hình dữ liệu của sổ đăng ký làm khung quản trị để thực thi quyền kiểm soát truy cập truyền dữ liệu ra ngoài. Các quyền cấp vai trò IAM cho các tác nhân gọi chính được kiểm tra dựa trên chính sách được liên kết với tài nguyên sổ đăng ký.

Để khởi động môi trường và hỗ trợ các tác nhân bằng nhiều API và Dịch vụ của Google, một tập lệnh được dùng để nhanh chóng đăng ký một nhóm điểm cuối API chung bằng cách sử dụng tên máy chủ và vị trí từ endpoints/googleapis.txt.

Đăng ký điểm cuối

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

Xác minh điểm cuối

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

Đến đây là kết thúc phần đăng ký... tiếp theo là phần Data Commons.

8. Data Commons

Data Commons là một sáng kiến của Google nhằm hệ thống hoá các tập dữ liệu công khai và cung cấp cho mọi người. Đây là một dịch vụ miễn phí và bạn có thể truy cập bằng khoá API sau khi tạo tài khoản.

Tạo khoá API

Sau khi bạn tạo tài khoản, hãy làm theo các bước sau để lấy khoá API:

  • Đăng nhập vào Cổng API của Data Commons
  • Nhấp vào nút "Ứng dụng của tôi" ở góc trên bên phải
  • Nhấp vào nút "+ ỨNG DỤNG MỚI" ở góc trên bên phải bên dưới tên người dùng của bạn
  • Đặt tên cho ứng dụng của bạn (ví dụ: "Codelab Agent MCP")
  • Nhấp vào nút "BẬT" cho Data Commons API api.datacommons.org
  • Nhấp vào nút "LƯU" ở góc dưới cùng bên phải

Thao tác này sẽ tạo một khoá API và khoá bí mật. Nhấp vào biểu tượng "sao chép" bên cạnh giá trị khoá để "Sao chép khoá API". Dán giá trị vào lệnh trên thiết bị đầu cuối để đặt biến môi trường DC_API_KEY.

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

Tạo máy chủ MCP toolspec

Khi đăng ký máy chủ MCP theo cách thủ công, bạn phải thêm một tệp chỉ định công cụ trong quá trình đăng ký. Việc tải tệp toolspec.json lên sẽ liệt kê tất cả các công cụ do điểm cuối cung cấp và cho phép người dùng khác khám phá các công cụ đó.

Tập lệnh test_mcp.py (có trong cơ sở mã agent-datacommons/) sẽ tạo tệp toolspec.json bằng cách kết nối với máy chủ MCP mục tiêu (qua SSE hoặc HTTP) và gọi list_tools() để truy xuất tất cả các công cụ có sẵn do máy chủ cung cấp.

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

Khi xem xét đầu ra toolspec đã tạo, bạn sẽ thấy các thuộc tính MCP mà Agent Gateway có thể dùng để đánh giá và thực thi chính sách xuất cảnh.

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

Đăng ký máy chủ 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}

Đến đây là kết thúc phần Data Commons... tiếp theo là phần Thời gian chạy.

9. Thời gian chạy

agent-datacommons ADK Agent được triển khai cho Agent Runtime được định cấu hình bằng các chế độ cài đặt sau trong tập lệnh triển khai để tích hợp với Agent Platform:

  • "identity_type": types.IdentityType.AGENT_IDENTITY để cung cấp một danh tính chính dựa trên SPIFFE riêng biệt cho tác nhân
  • "agent_gateway_config": { "agent_to_anywhere_config": {"agent_gateway": } } để chuyển hướng tất cả lưu lượng truy cập đi do nhân viên hỗ trợ bắt đầu đến Cổng nhân viên hỗ trợ để đánh giá và thực thi chính sách

Triển khai tác nhân

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

Tìm nạp chỉ số quan trọng về việc triển khai

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

Xác minh mục đăng ký

# show agent resource registry details
gcloud agent-registry agents describe ${RE_AGENT_REGISTRY_ID} --location=${REGION}

10. Chính sách

Chính sách uỷ quyền quản trị tác nhân cho phép lưu lượng truy cập từ một tác nhân AI thông qua Agent Gateway và đến đích đến (ví dụ: điểm cuối máy chủ MCP của bên thứ ba cho một ứng dụng SaaS). Sau khi lưu lượng truy cập đến đích đến, các quyền thông thường ở cấp dịch vụ hoặc cấp ứng dụng sẽ cho phép truy cập vào dữ liệu.

Quyền truy cập vào vai trò IAM cho lưu lượng truy cập đi của Cổng kết nối tác nhân cho phép các chính sách truy cập cho phép quyền truy cập danh tính chính của tác nhân vào các tài nguyên đích đã đăng ký thông qua Cổng kết nối tác nhân. Các chính sách được thực thi ở cấp Cổng đại lý và được xác thực bằng các chính sách IAM của Identity-Aware Proxy (IAP).

Cấp vai trò IAM cho tác nhân để truyền dữ liệu ra khỏi Agent Gateway

Agent Gateway kiểm tra các yêu cầu đến để xác thực danh tính của tác nhân gọi có quyền iap.webServiceVersions.egressViaIAP (do vai trò roles/iap.egressor cấp) đối với tài nguyên đích.

Việc cấp roles/iap.egressor cho danh tính tác nhân hoặc nhóm thực thể Agent Runtime trên tài nguyên đích đến đã chọn sẽ cho phép lưu lượng truy cập đi ra này. Trong lớp học lập trình này, vai trò được áp dụng cho tác nhân chính, cấp quyền cho danh tính tác nhân cụ thể của Agent Runtime.

Các chính sách IAM được liên kết với các tài nguyên đích như được xác định trong mô hình dữ liệu của Sổ đăng ký tác nhân. Tài nguyên iap_web/agentRegistry đại diện cho cấp "trên toàn bộ sổ đăng ký" trong hệ thống phân cấp IAM. Trong đó agentRegistry đóng vai trò là phần tử mẹ của từng tài nguyên con cho agents, mcpServersendpoints. Trong lớp học lập trình này, chính sách IAM được liên kết với các cấp mcpServerendpoint. Chính sách này áp dụng quyền cho các tài nguyên con cụ thể.

Giới thiệu về tính năng lọc MCP có điều kiện

Máy chủ Data Commons MCP có 2 công cụ:

  • search_indicators: cho các truy vấn về việc khám phá dữ liệu có sẵn, tìm kiếm các biến hoặc tìm hiểu phạm vi bao phủ dữ liệu
  • get_observations: cho các truy vấn để truy xuất các điểm dữ liệu hoặc chuỗi thời gian cụ thể

Bạn cần lưu ý một số thao tác MCP tiêu chuẩn khi định cấu hình các chính sách quản trị có điều kiện trên máy chủ MCP. Trước khi có thể tạo tools/call cho search_indicators hoặc get_observations, trước tiên, ứng dụng MCP phải gửi yêu cầu bắt tay và khám phá giao thức:

  • initialize
  • notifications/initialized
  • tools/list

Để minh hoạ tính năng lọc chính sách có điều kiện, chính sách sẽ được định cấu hình cho các điều kiện sau:

Bảng. Đánh giá chính sách đối với các yêu cầu MCP

Yêu cầu / Phương thức

Giá trị mcp.toolName

Đánh giá CEL

Kết quả

initialize

""

"" in ['search_indicators', '']

✅ ĐƯỢC PHÉP (200)

tools/list

""

"" in ['search_indicators', '']

✅ ĐƯỢC PHÉP (200)

search_indicators

"search_indicators"

"search_indicators" in [...]

✅ ĐƯỢC PHÉP (200)

get_observations

"get_observations"

"get_observations" in [...]

❌ DENIED (403)

Để cho phép các bắt tay giao thức lệnh gọi công cụ search_indicators, quy tắc chính sách có điều kiện bao gồm một lệnh cho phép đối với "search_indicators" hoặc "" (chuỗi trống).

Định cấu hình chính sách IAM của máy chủ MCP IAP trong sổ đăng ký

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

LƯU Ý: etag: sẽ trả về ACAB mặc định vì chưa có chính sách nào được xác định.

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

Đến đây là kết thúc phần chính sách... tiếp theo là phần Kiểm tra.

11. Kiểm tra

Tiện ích uỷ quyền Agent Gateway đang hoạt động ở chế độ DRY_RUN. Các yêu cầu gửi đi sẽ được theo dõi và ghi nhật ký nhưng không bị chặn.

Kiểm thử các câu hỏi cho nhân viên hỗ trợ

Mở cửa sổ trình duyệt đến giao diện người dùng bảng điều khiển Cloud rồi chuyển đến:

  • Agent Platform → Agents → Deployments → agent-datacommons
  • Chọn thẻ Playground (Sân chơi)

Hoặc lặp lại lệnh này trên thiết bị đầu cuối rồi nhấp vào đường liên kết để chuyển đến sân chơi của tác nhân:

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

Gửi một số truy vấn thử nghiệm....

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

Xác minh rằng các truy vấn trả về phản hồi hợp lệ.

Phân tích nhật ký kiểm tra

Xem nhật ký và kiểm tra các hoạt động đánh giá chính sách chạy thử.

# 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

Cập nhật chính sách IAM cho điểm cuối IAP của sổ đăng ký

Cấp quyền truy cập cho tác nhân vào điểm cuối đo từ xa

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

Cấp quyền truy cập cho tác nhân đối với điểm cuối 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}

Cấp quyền truy cập cho tác nhân đối với điểm cuối 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}

Đến đây là kết thúc phần kiểm tra... tiếp theo là phần Thực thi.

12. Thi hành

Tác nhân đã có thể thực hiện các yêu cầu thành công thông qua cổng ở chế độ DRY_RUN. Chuyển tiện ích uỷ quyền IAP của Agent Gateway sang chế độ ENFORCE bằng cách cập nhật chính sách uỷ quyền.

Cập nhật tiện ích uỷ quyền

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

Cập nhật chính sách uỷ quyền

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

Xác minh điều kiện cho phép

Quay lại Playground của tác nhân trong giao diện người dùng bảng điều khiển.

Gửi một truy vấn kiểm thử bổ sung (cố gắng gọi công cụ được phépsearch_indicators)...

  • What data topics do you have for Peru?

Quan sát các yêu cầu của tác nhân đối với mô hình cơ sở Gemini (${REGION}-aiplatform.googleapis.com/...), API đo từ xa (telemetry.googleapis.com/...) và điểm cuối của máy chủ MCP Data Commons (api.datacommons.org/mcp) được truyền bằng mã trạng thái 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)"

Kiểm tra để đảm bảo không có yêu cầu nào bị chặn. Tìm mọi nỗ lực truy cập bị từ chối có mã trạng thái HTTP 403 Forbidden trong nhật ký kiểm tra cổng.

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

Xác minh điều kiện từ chối

Gửi một truy vấn kiểm thử khác (cố gắng gọi công cụ bị từ chốiget_observations)...

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

Trước tiên, tác nhân sẽ xem xét search_indicators, sau đó cố gắng sử dụng get_observations nhưng không thành công và phản hồi của tác nhân sẽ không hoàn chỉnh.

# 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

Điều này xác thực rằng chính sách quản trị đang hoạt động như dự kiến!

Xin lưu ý rằng hàng thứ hai cho biết trạng thái trống và ALLOWED là sự kiện nhật ký ngắt kết nối thứ cấp do Agent Gateway phát ra khi đóng ổ cắm sau khi gửi phản hồi 403 (vì các sự kiện connection-close không có mã trạng thái phản hồi, httpRequest.status là trống).

Đến đây là kết thúc phần thực thi... tiếp theo là phần Dọn dẹp.

13. Dọn dẹp

# 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

Đến đây là kết thúc phần dọn dẹp... tiếp theo là phần Kết luận!

14. Kết luận

Xin chúc mừng! Bạn đã triển khai và quản lý thành công thông tin liên lạc gửi đi cho một nhân viên hỗ trợ truy cập vào các công cụ bằng Cổng nhân viên hỗ trợ!

cosmopup

Cosmopup cho rằng Codelabs là một nền tảng tuyệt vời!

Bước tiếp theo là gì?

Bạn có thể thoải mái đưa ra ý kiến nhận xét, câu hỏi hoặc nội dung chỉnh sửa bằng cách sử dụng biểu mẫu phản hồi này

Cảm ơn bạn!