Agent Runtime에서 외부 MCP로의 에이전트 게이트웨이 이그레스

1. 소개

이 Codelab에서는 Google Cloud 외부에서 호스팅되는 외부 모델 컨텍스트 프로토콜 (MCP) 서버에 액세스하는 AI 에이전트의 에이전트 게이트웨이 이그레스 거버넌스를 살펴봅니다.

독립형 챗봇부터 멀티 에이전트 워크플로가 있는 자율 시스템에 이르기까지 AI 앱은 외부 도구를 동적으로 호출할 수 있습니다. 데이터베이스를 쿼리하고, 웹 콘텐츠를 가져오고, 작업을 실행할 수 있는 제어된 액세스 권한을 에이전트에게 제공하는 것은 안전하고 생산적인 에이전트를 위해 필수적입니다. 하지만 엔터프라이즈 환경에서는 에이전트 도구 실행을 보호하는 것이 어렵습니다. 에이전트가 직접 네트워크 액세스 권한을 보유한 경우 프롬프트 인젝션 공격이나 모델 할루시네이션으로 인해 에이전트가 민감한 정보를 유출하거나 파괴적인 명령어를 실행할 수 있습니다.

에이전트 게이트웨이는 자율 에이전트를 대규모로 관리하기 위해 Agent Platform 아키텍처에 직접 통합된 중앙 집중식 제로 트러스트 시행 지점을 제공합니다. 각 애플리케이션 또는 에이전트 코드에 고유한 맞춤 구현에 의존하는 대신 Agent Gateway는 플랫폼 수준에서 적용되는 네트워크 라우팅, 에이전트 거버넌스, 런타임 보안을 제공합니다.

Agent Gateway가 이그레스 (agent-to-anywhere) 모드로 작동하면 게이트웨이를 사용하도록 구성된 에이전트의 모든 아웃바운드 요청을 프록시합니다. 각 에이전트 워크로드 요청은 고유한 에이전트 ID를 사용하여 인증되고 Identity-Aware Proxy (IAP) 정책을 사용하여 승인됩니다. MCP 도구 호출은 정책 시행을 위해 동적으로 디코딩되고 검사됩니다. 보안 관리자는 세부적인 권한을 중앙에서 적용하여 에이전트가 승인된 엔드포인트와 메서드만 호출할 수 있도록 할 수 있습니다.

빌드할 항목

  • 이그레스의 Agent Gateway (agent-to-anywhere) 모드
  • IAP (Identity-Aware Proxy) 승인 확장 프로그램
  • 에이전트 ID가 있는 Agent Runtime ADK 에이전트
  • Google API 및 MCP 엔드포인트가 있는 에이전트 레지스트리
  • Data Commons 공개 데이터 세트에 대한 외부 MCP 도구 연결
  • IAM 액세스 제어를 사용하는 승인 정책

figure1

그림 1. Codelab 아키텍처

학습 내용

  • 구조화된 구성 시퀀스에서 Agent Gateway를 배포하는 방법
  • 승인 정책을 테스트 실행 모드에서 시행 모드로 전환하는 방법
  • 에이전트 레지스트리에 Google API 엔드포인트 및 MCP 서버를 등록하는 방법
  • MCP 프로토콜 속성을 기반으로 조건부 승인 정책을 사용하는 방법
  • Agent Gateway 로그를 감사하여 이그레스 거버넌스를 검증하는 방법

필요한 항목

  • 결제가 사용 설정된 Google Cloud 프로젝트
  • 네트워킹 서비스 및 Agent Platform 리소스를 프로비저닝하는 IAM 권한
  • Google Cloud CLI (gcloudbq 구성요소)가 설치된 POSIX 호환 셸 (bash 또는 zsh)
  • 명령줄 도구: git, curl, jq (JSON 프로세서), Python 3, uv (Python 패키지 관리자)
  • 쿼리 테스트 데이터 세트에 액세스하기 위한 무료 Data Commons API 키

2. 개념

배포 시퀀스

이 Codelab에서는 구조화된 구성 시퀀스를 따르므로 에이전트가 초기화 시 필요한 리소스에 액세스할 수 있고 강제 액세스 정책을 적용하기 전에 연결을 확인할 수 있습니다.

이 Codelab에서는 다음 배포 시퀀스를 사용합니다.

  1. DRY_RUN 모드에서 시작: 에이전트 요청이 게이트웨이에 성공적으로 도착하고 통과하는지 확인합니다 (감사 전용 모드).
  2. 모든 서비스 등록: 에이전트 레지스트리에 모든 에이전트 구성요소를 등록하고 에이전트 도구 액세스를 확인합니다.
  3. 승인 정책 만들기: 에이전트에서 MCP 서버 및 엔드포인트로의 이그레스 트래픽을 허용하는 승인 정책을 만들고 적용합니다.
  4. ENFORCED 모드로 전환: 승인 확장 프로그램 정책을 업데이트하여 정책을 적용하고 승인되지 않은 이그레스 트래픽을 차단합니다.

figure2

그림 2. 배포 시퀀스

이그레스 라우팅 토폴로지

에이전트 게이트웨이 이그레스 (agent-to-anywhere)는 에이전트형 워크로드의 중앙화된 제로 트러스트 아웃바운드 프록시 역할을 합니다. 에이전트가 외부 도구 또는 API에 요청하면 아웃바운드 요청이 에이전트 게이트웨이에 의해 가로채지고 대상으로 라우팅되기 전에 거버넌스 정책에 따라 평가됩니다. Google Cloud Agent Platform 아키텍처에서 에이전트 게이트웨이는 다음 항목에 데이터 영역 연결을 제공합니다.

  • 비공개 네트워크 (VPC): 하이브리드 연결을 통해 연결할 수 있는 내부 엔터프라이즈 API, 마이크로서비스, 비공개 VPC 내에 호스팅된 데이터베이스, 온프레미스 또는 크로스 클라우드 네트워크를 타겟팅하는 아웃바운드 트래픽입니다.
  • 외부 네트워크 (인터넷): 서드 파티 웹 서비스, SaaS API 또는 공개 엔드포인트를 타겟팅하는 아웃바운드 트래픽입니다.
  • AI 서비스 및 에이전트 플랫폼: 관리형 Google Cloud API, 기본 모델, Google MCP 엔드포인트 (예: BigQuery), 플랫폼 거버넌스 서비스 (에이전트 레지스트리 및 IAP 정책)를 타겟팅하는 아웃바운드 트래픽입니다.

figure3

그림 3. 에이전트 게이트웨이 이그레스 라우팅 토폴로지

이 Codelab에서는 인터넷을 통해 액세스할 수 있는 외부 서드 파티 MCP 서버 엔드포인트를 타겟팅하는 Agent Runtime의 맞춤 에이전트에서 발생하는 아웃바운드 트래픽에 중점을 둡니다.

MCP 프로토콜 검사

에이전트 게이트웨이 이그레스 (agent-to-anywhere)는 MCP 요청의 콘텐츠를 파싱하고 세분화된 프로토콜 속성을 기반으로 액세스 정책을 평가할 수 있습니다. 에이전트-MCP 서버 이그레스 정책에는 Common Expression Language (CEL)로 표현된 조건이 포함될 수 있으며, 이러한 조건은 런타임에 모든 요청에 적용됩니다.

MCP 호출은 일반적으로 JSON-RPC 와이어 프로토콜 형식과 HTTP 전송을 사용합니다. 호출되는 MCP 메서드 (예: tools/call), 타겟 도구 이름, 인수의 세부정보는 HTTP 본문의 JSON 페이로드에 포함됩니다.

iap.googleapis.com/mcp.toolName 속성은 요청에 지정된 도구 식별자를 찾기 위해 JSON 본문을 파싱하여 에이전트 게이트웨이에서 추출합니다.

iap.googleapis.com/mcp.tool.isReadOnlymcp.tool.isDestructive과 같은 속성은 일반적으로 각 요청 본문에 전송되지 않습니다. 대신 도구와 연결된 주석 (메타데이터)입니다. 따라서 에이전트 게이트웨이가 본문에서 toolName을 추출하면 toolspec.json 콘텐츠가 등록된 에이전트 레지스트리에서 도구 정의와 연결된 속성을 조회합니다.

figure4

그림 4. 에이전트 게이트웨이 MCP 검사

IAP IAM 조건에 사용되는 CEL 표현식은 표준 형식 api.getAttribute('iap.googleapis.com/ATTRIBUTE_NAME', 'DEFAULT_VALUE')== 'DESIRED_VALUE'을 사용합니다.

다음 표에는 MCP 서버 요청에 적용할 수 있는 에이전트 게이트웨이 이그레스 거버넌스 속성이 설명되어 있습니다.

속성

MCP 방법 / 위치

설명

mcp.toolName

tools/call (본문)

RPC 페이로드에서 요청된 타겟 도구 식별자 (예: "delete_instance")

mcp.tool.isReadOnly

에이전트 레지스트리 (toolspec.json)

도구가 읽기 전용인지 (환경을 수정하지 않음) 여부를 나타냅니다.

mcp.tool.isDestructive

에이전트 레지스트리 (toolspec.json)

도구를 호출하면 되돌릴 수 없는 수정이나 데이터 손실이 발생할 수 있는지 나타냅니다.

mcp.tool.isIdempotent

에이전트 레지스트리 (toolspec.json)

동일한 인수로 도구를 반복 실행할 때 정확히 동일한 상태가 생성되는지 나타냅니다.

mcp.tool.isOpenWorld

에이전트 레지스트리 (toolspec.json)

도구가 경계가 지정된 내부 시스템을 넘어 경계가 지정되지 않은 공개 인터넷에 도달하는지 여부를 나타냅니다.

이로써 개념 부분이 마무리되었습니다. 다음은 설정 섹션입니다.

3. 설정

필요한 IAM 역할

이 Codelab에서 리소스를 만들려면 다음 역할이 필요합니다.

카테고리

필수 IAM 역할 (ID)

설명

API 관리

roles/serviceusage.serviceUsageAdmin

Google Cloud API 서비스 사용 설정

네트워킹 및 게이트웨이

roles/networkservices.admin

에이전트 게이트웨이 프로비저닝

Service Extensions

roles/serviceextensions.admin

라우팅 확장 프로그램 구성

네트워크 보안

roles/networksecurity.admin

승인 정책 배포

에이전트 레지스트리

roles/agentregistry.admin

카탈로그 허용 호스트

Vertex AI 및 에이전트

roles/aiplatform.admin

Agent Runtime 워크로드 배포

이그레스 정책

roles/iap.admin

roles/iap.egressor 정책 적용

Cloud Storage

roles/storage.admin

배포 스테이징 버킷 관리

로그 및 감사

roles/logging.viewer

트레이스 및 감사 로그 검사

또는 roles/admin와 같은 광범위한 기본 역할이나 기존 역할 roles/owner를 사용합니다.

프로젝트에 액세스

이 Codelab에서는 단일 Google Cloud 프로젝트를 사용합니다. 구성 단계에서는 gcloud CLI 및 Linux 셸 명령어를 사용합니다.

먼저 Google Cloud 프로젝트 명령줄에 액세스합니다.

프로젝트 ID 설정

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)
echo ${PROJ_ID}
echo ${PROJ_NO}
echo ${ORG_ID}
# create resource vars (automatic)
export AGW_NAME="agw-${SLUG}-${REGION}-ata"
export AGW_URI="projects/${PROJ_ID}/locations/${REGION}/agentGateways/${AGW_NAME}"
export RE_AGENT_NAME="agent-datacommons"
export RE_AGENT_ID_SET="principalSet://agents.global.org-${ORG_ID}.system.id.goog/attribute.platformContainer/aiplatform/projects/${PROJ_NO}"
export STAGING_BUCKET="agent-staging-${PROJ_NO}"
export MCP_DISPLAY_NAME="api.datacommons.org"
export MCP_RESOURCE_NAME="${REGION}-datacommons-mcp"
export MCP_URL="https://api.datacommons.org/mcp"
echo ${AGW_NAME}
echo ${AGW_URI}
echo ${RE_AGENT_NAME}
echo ${RE_AGENT_ID_SET}
echo ${STAGING_BUCKET}
echo ${MCP_DISPLAY_NAME}
echo ${MCP_RESOURCE_NAME}
echo ${MCP_URL}
# create local dir for config files
mkdir -p cfg

Google Cloud SDK의 자체 관리 설치를 실행하는 경우 (즉, Cloud Shell 외부) 구성요소를 최신 버전으로 업데이트합니다.

# update gcloud cli
gcloud components update

API 서비스 사용 설정

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

이것으로 설정 부분이 마무리되었습니다. 다음은 게이트웨이 섹션입니다.

4. 게이트웨이

액세스 제어를 적용하기 전에 Agent Gateway를 배포하고 DRY_RUN 모드에서 승인 확장 프로그램을 구성합니다. 이렇게 하면 감사 목적으로 평가 결과를 로깅하는 동안 아웃바운드 도구 호출이 성공할 수 있습니다.

여기서 에이전트 게이트웨이는 리전별 Agent Runtime 리소스를 지원하기 위해 리전별 레지스트리를 사용합니다.

게이트웨이 만들기

# create agent gateway config file (regional registry)
cat > cfg/${AGW_NAME}.yaml << EOF
name: ${AGW_NAME}
protocols:
  - MCP
googleManaged:
  governedAccessPath: AGENT_TO_ANYWHERE
registries:
  - "//agentregistry.googleapis.com/projects/${PROJ_ID}/locations/${REGION}"
EOF
# import agent gateway config file (create gateway)
gcloud network-services agent-gateways import ${AGW_NAME} \
  --source="cfg/${AGW_NAME}.yaml" \
  --location=${REGION}
# show agent gateway details (verify deployment state)
gcloud network-services agent-gateways describe ${AGW_NAME} \
  --location=${REGION}

이것으로 게이트웨이 부분이 마무리되었습니다. 다음으로 승인 섹션으로 이동합니다.

5. 승인

Identity-Aware Proxy (IAP)용 Agent Gateway 승인 확장 프로그램은 모든 Agent Platform 통신의 승인 결정을 위임하는 데 사용되는 Service Extensions의 한 유형입니다.

  1. 위임 흐름: 에이전트가 외부 엔드포인트 또는 MCP 서버를 호출하려고 하면 요청이 Agent Gateway로 라우팅됩니다. 게이트웨이는 로컬에서 액세스를 평가하는 대신 승인 확장 프로그램을 사용하여 IAP 평가 서비스에 콜아웃을 전송합니다. IAP는 Agent Registry의 타겟 리소스 IAM 정책에 대해 에이전트 (SPIFFE 기반) ID를 평가합니다. IAP는 ALLOW 또는 DENY 결정을 게이트웨이에 다시 반환하며, 게이트웨이는 트래픽을 전달하거나 HTTP 403 Forbidden 상태 코드로 차단합니다.
  2. 강제 적용 모드: DRY_RUN 모드에서 IAP는 요청을 평가하고 트래픽을 차단하지 않고 Cloud Logging에 결정을 로깅합니다. ENFORCE 모드에서는 승인되지 않은 에이전트의 요청이나 등록되지 않은 타겟에 대한 요청이 즉시 차단됩니다.
  3. 바인딩 레이어: 서비스 확장 프로그램은 REQUEST_AUTHZ 프로필로 구성된 승인 정책을 사용하여 Agent Gateway에 연결됩니다.

승인 확장 프로그램

승인 확장 프로그램 만들기

# create authz extension config file (dry run mode)
cat > cfg/${AGW_NAME}-svc-ext-authz-iap-dryrun.yaml << EOF
name: ${AGW_NAME}-svc-ext-authz-iap-dryrun
service: iap.googleapis.com
failOpen: true
timeout: 1s
metadata:
  iamEnforcementMode: "DRY_RUN"
  iapPolicyVersion: "V1"
EOF
# import authz extension file (create extension)
gcloud service-extensions authz-extensions import ${AGW_NAME}-svc-ext-authz-iap-dryrun \
  --source=cfg/${AGW_NAME}-svc-ext-authz-iap-dryrun.yaml \
  --location=${REGION}
# show authz extension details (verify extension state)
gcloud service-extensions authz-extensions describe ${AGW_NAME}-svc-ext-authz-iap-dryrun \
  --location=${REGION}

승인 정책

승인 정책은 보안 제공업체 (IAP)를 타겟 게이트웨이 리소스에 바인딩하고 인터셉션 프로필 (REQUEST_AUTHZ)을 지정합니다.

승인 정책 만들기

# create authz policy config file (attach dry-run authz extension)
cat > cfg/${AGW_NAME}-authz-policy-profile-iap.yaml << EOF
name: ${AGW_NAME}-authz-policy-profile-iap
target:
  resources:
    - "projects/${PROJ_ID}/locations/${REGION}/agentGateways/${AGW_NAME}"
policyProfile: REQUEST_AUTHZ
action: CUSTOM
customProvider:
  authzExtension:
    resources:
      - "projects/${PROJ_ID}/locations/${REGION}/authzExtensions/${AGW_NAME}-svc-ext-authz-iap-dryrun"
EOF
# import authz policy config file (enable authz policy)
gcloud beta network-security authz-policies import ${AGW_NAME}-authz-policy-profile-iap \
  --source=cfg/${AGW_NAME}-authz-policy-profile-iap.yaml \
  --location=${REGION}
# show authz policy details (verify dry run mode)
gcloud beta network-security authz-policies describe ${AGW_NAME}-authz-policy-profile-iap \
  --location=${REGION}

이것으로 승인 부분이 마무리되었습니다. 다음으로 코드베이스 섹션으로 이동합니다.

6. 코드베이스

이 Codelab에 사용된 에이전트 코드와 엔드포인트 등록 스크립트는 원격 Google Cloud GitHub 저장소에 유지됩니다. 다음 단계에서는 저장소를 로컬로 클론하고, 필요한 파일을 현재 작업 디렉터리 구조에 복사한 후 임시 파일을 정리합니다.

패키징된 에이전트 애플리케이션 코드와 종속 항목 아티팩트를 업로드, 빌드, 배포하기 위해 Agent Runtime용 스토리지 스테이징 버킷이 생성됩니다.

원격 아티팩트 가져오기

# 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

스테이징 버킷 만들기

# create storage bucket for agent deployment artifacts
gcloud storage buckets create gs://${STAGING_BUCKET} --location=${REGION}
# verify staging bucket url
gcloud storage buckets list --format="value(storage_url)"

이것으로 코드베이스 부분이 마무리되었습니다. 다음은 레지스트리 섹션입니다.

7. 레지스트리

Agent Registry는 AI 생태계의 모든 에이전트, MCP 서버, 엔드포인트 (API)의 중앙 집중식 인벤토리입니다. 또한 AI 애플리케이션에서 사용할 수 있는 다른 등록된 도구와 서비스를 나열, 검색, 탐색하는 데 사용할 수 있는 카탈로그이기도 합니다. 에이전트 게이트웨이 이그레스 (agent-to-anywhere) 모드는 레지스트리 데이터 모델을 거버넌스 프레임워크로 사용하여 이그레스 액세스 제어를 적용합니다. 주 구성원 호출 에이전트에 대한 IAM 역할 부여는 레지스트리 리소스에 바인딩된 정책에 대해 확인됩니다.

환경을 부트스트랩하고 다양한 Google API 및 서비스를 사용하는 상담사를 지원하기 위해 스크립트를 사용하여 endpoints/googleapis.txt의 호스트 이름과 위치를 사용하여 일반적인 API 엔드포인트 집합을 빠르게 등록합니다.

엔드포인트 등록

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

엔드포인트 확인

# list registry regional endpoints (verify registration)
gcloud agent-registry endpoints list --location=${REGION} \
  --format="table(displayName, name.basename():label=ENDPOINT_ID, interfaces[0].url:label=URL)"

이것으로 레지스트리 부분을 마치겠습니다. 다음은 Data Commons 섹션입니다.

8. Data Commons

Data Commons는 공개 데이터 세트를 정리하여 누구나 이용할 수 있도록 하는 Google의 이니셔티브입니다. 무료 서비스이며 계정을 만든 후 API 키를 사용하여 액세스할 수 있습니다.

API 키 만들기

계정을 만든 후 다음 단계에 따라 API 키를 가져옵니다.

  • Data Commons API 포털에 로그인합니다.
  • 오른쪽 상단의 '내 앱' 버튼을 클릭합니다.
  • 오른쪽 상단의 사용자 이름 아래에 있는 '+ 새 앱' 버튼을 클릭합니다.
  • 앱 이름을 지정합니다 (예: 'Codelab Agent MCP').
  • Data Commons API의 '사용 설정' 버튼을 클릭합니다. api.datacommons.org
  • 오른쪽 하단의 '저장' 버튼을 클릭합니다.

이렇게 하면 API 키와 보안 비밀이 생성됩니다. 키 값 옆에 있는 '복사' 아이콘을 클릭하여 'API 키 복사'를 클릭합니다. 값을 터미널 명령어에 붙여넣어 DC_API_KEY 환경 변수를 설정합니다.

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

MCP 서버 만들기 toolspec

MCP 서버를 수동으로 등록할 때는 등록 중에 도구 사양 파일을 포함해야 합니다. toolspec.json 파일을 업로드하면 엔드포인트에서 제공하는 모든 도구가 나열되어 다른 사용자가 이를 검색할 수 있습니다.

agent-datacommons/ 코드베이스에 포함된 test_mcp.py 스크립트는 SSE 또는 HTTP를 통해 타겟 MCP 서버에 연결하여 toolspec.json 파일을 생성하고 list_tools()를 호출하여 서버에서 노출된 사용 가능한 모든 도구를 가져옵니다.

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

생성된 toolspec 출력을 살펴보면 에이전트 게이트웨이가 이그레스 정책 평가 및 시행에 사용할 수 있는 MCP 속성이 표시됩니다.

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

MCP 서버 등록

# register mcp server
gcloud agent-registry services create ${MCP_RESOURCE_NAME} \
  --location=${REGION} \
  --display-name="${MCP_DISPLAY_NAME}" \
  --description="mcp server for data commons" \
  --mcp-server-spec-type=tool-spec \
  --mcp-server-spec-content=agent-datacommons/toolspec.json \
  --interfaces=url=${MCP_URL},protocolBinding=JSONRPC
# list registry regional mcp servers
gcloud agent-registry mcp-servers list --location=${REGION} --format="table(displayName, interfaces.url)"
# show mcp server registry details
gcloud agent-registry services describe ${MCP_RESOURCE_NAME} --location=${REGION}
# fetch mcp server registry id
export MCP_REGISTRY_ID=$(gcloud agent-registry services describe ${MCP_RESOURCE_NAME} \
  --location=${REGION} \
  --format="value(registryResource.basename())")
echo ${MCP_REGISTRY_ID}

이것으로 Data Commons 부분이 마무리되었습니다. 다음은 런타임 섹션입니다.

9. 런타임

Agent Runtime에 배포된 agent-datacommons ADK 에이전트는 Agent Platform과 통합하기 위해 배포 스크립트에서 다음 설정으로 구성됩니다.

  • "identity_type": types.IdentityType.AGENT_IDENTITY를 사용하여 에이전트의 고유한 SPIFFE 기반 보안 주체 ID를 프로비저닝합니다.
  • "agent_gateway_config": { "agent_to_anywhere_config": {"agent_gateway": } }를 사용하여 모든 아웃바운드 에이전트 시작 트래픽을 정책 평가 및 시행을 위해 에이전트 게이트웨이로 전달

에이전트 배포

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

배포 주요 지표 가져오기

# fetch agent runtime resource (reasoning engine) id
export RE_ENGINE_ID=$(curl -s -X GET \
  "https://${REGION}-aiplatform.googleapis.com/v1/projects/${PROJ_ID}/locations/${REGION}/reasoningEngines" \
  -H "Authorization: Bearer $(gcloud auth application-default print-access-token)" | \
  jq -r --arg name "${RE_AGENT_NAME}" '.reasoningEngines[] | select(.displayName==$name) | .name | split("/") | last')
echo ${RE_ENGINE_ID}
# fetch agent runtime (reasoning engine) agent identity
export RE_AGENT_IDENTITY=$(gcloud agent-registry agents list \
  --location=${REGION} --filter="displayName=${RE_AGENT_NAME}" \
  --format="value(attributes.'agentregistry.googleapis.com/system/RuntimeIdentity'.principal)")
echo ${RE_AGENT_IDENTITY}
# fetch agent registry uid for agent
export RE_AGENT_REGISTRY_ID=$(gcloud agent-registry agents list \
  --location=${REGION} \
  --filter="displayName=${RE_AGENT_NAME}" \
  --format="value(uid)")
echo ${RE_AGENT_REGISTRY_ID}

레지스트리 항목 확인

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

10. 정책

에이전트 거버넌스 승인 정책은 에이전트 게이트웨이를 통해 AI 에이전트에서 목적지 (예: SaaS 애플리케이션의 서드 파티 MCP 서버 엔드포인트)로 트래픽을 허용합니다. 트래픽이 대상에 도달하면 일반 서비스 수준 또는 애플리케이션 수준 권한으로 데이터 액세스가 승인됩니다.

에이전트 게이트웨이 이그레스에 대한 IAM 역할 부여를 사용하면 에이전트 주 구성원 ID가 에이전트 게이트웨이를 통해 등록된 대상 리소스에 액세스할 수 있는 액세스 정책이 사용 설정됩니다. 정책은 Agent Gateway 수준에서 적용되며 IAP (Identity-Aware Proxy) IAM 정책을 사용하여 검증됩니다.

에이전트 게이트웨이 이그레스에 대한 에이전트 IAM 역할 부여

에이전트 게이트웨이는 수신 요청을 확인하여 호출 에이전트 ID에 타겟 리소스에 대한 iap.webServiceVersions.egressViaIAP 권한 (roles/iap.egressor 역할에 의해 부여됨)이 있는지 확인합니다.

선택한 대상 리소스에 대한 에이전트 ID 또는 Agent Runtime 주 구성원 집합roles/iap.egressor 권한을 부여하면 이 이그레스 트래픽이 허용됩니다. 이 Codelab에서는 특정 Agent Runtime 에이전트 ID에 권한을 부여하는 주 구성원 agent에 역할이 적용됩니다.

IAM 정책은 에이전트 레지스트리 데이터 모델에 정의된 대로 대상 리소스에 바인딩됩니다. iap_web/agentRegistry 리소스는 IAM 계층 구조의 '레지스트리 전체' 수준을 나타냅니다. 여기서 agentRegistryagents, mcpServers, endpoints의 개별 하위 리소스의 상위 요소 역할을 합니다. 이 Codelab에서는 IAM 정책이 mcpServerendpoint 수준에 바인딩되어 특정 하위 리소스에 권한이 적용됩니다.

조건부 MCP 필터링 정보

Data Commons MCP 서버에는 두 가지 도구가 있습니다.

  • search_indicators: 사용 가능한 데이터 확인, 변수 검색, 데이터 범위 이해에 관한 질문
  • get_observations: 특정 데이터 포인트 또는 시계열을 가져오는 쿼리

MCP 서버에서 조건부 거버넌스 정책을 구성할 때 유의해야 할 몇 가지 표준 MCP 작업이 있습니다. MCP 클라이언트가 search_indicators 또는 get_observations에 대한 tools/call를 만들려면 먼저 프로토콜 핸드셰이크 및 검색 요청을 보내야 합니다.

  • initialize
  • notifications/initialized
  • tools/list

조건부 정책 필터링을 보여주기 위해 정책은 다음 조건에 따라 구성됩니다.

표. MCP 요청에 대한 정책 평가

요청 / 메서드

mcp.toolName

CEL 평가

결과

initialize

""

"" in ['search_indicators', '']

✅ 허용됨 (200)

tools/list

""

"" in ['search_indicators', '']

✅ 허용됨 (200)

search_indicators

"search_indicators"

"search_indicators" in [...]

✅ 허용됨 (200)

get_observations

"get_observations"

"get_observations" in [...]

❌ 거부됨 (403)

프로토콜 핸드셰이크 search_indicators 도구 호출을 허용하려면 조건부 정책 규칙에 "search_indicators" 또는 "" (빈 문자열)에 대한 허용이 포함됩니다.

레지스트리 IAP MCP 서버 IAM 정책 구성

# show iap iam policy for mcp server
gcloud beta iap web get-iam-policy \
  --region=${REGION} \
  --resource-type=agent-registry \
  --mcp-server=${MCP_REGISTRY_ID}

참고: 아직 정책이 정의되지 않았으므로 etag:는 기본 ACAB를 반환해야 합니다.

# fetch active etag on policy for mcp server
export IAP_ETAG=$(gcloud beta iap web get-iam-policy \
  --resource-type=agent-registry --region=${REGION} \
  --mcp-server=${MCP_REGISTRY_ID} --format="value(etag)")
echo ${IAP_ETAG}
# create policy config file
cat > cfg/iap-policy-dc-agent-to-dc-mcp-tool-1.json << EOF
{
  "bindings": [
    {
      "role": "roles/iap.egressor",
      "members": [
        "${RE_AGENT_IDENTITY}"
      ],
      "condition": {
        "title": "allow ${RE_AGENT_NAME} to use search_indicators tool for ${MCP_DISPLAY_NAME}",
        "expression": "api.getAttribute('iap.googleapis.com/mcp.toolName', '') in ['search_indicators', '']"
      }
    }
  ],
  "etag": "${IAP_ETAG}",
  "version": 3
}
EOF
# import policy file (bind iam policy)
gcloud beta iap web set-iam-policy cfg/iap-policy-dc-agent-to-dc-mcp-tool-1.json \
  --resource-type=agent-registry \
  --mcp-server=${MCP_REGISTRY_ID} \
  --region=${REGION}
# verify iap iam policy for mcp server
gcloud beta iap web get-iam-policy \
  --region=${REGION} \
  --resource-type=agent-registry \
  --mcp-server=${MCP_REGISTRY_ID}

정책 부분이 끝났습니다. 다음은 감사 섹션입니다.

11. 감사

Agent Gateway 승인 확장 프로그램이 DRY_RUN 모드로 작동하고 있습니다. 아웃바운드 요청은 관찰되고 로깅되지만 차단되지는 않습니다.

에이전트 쿼리 테스트

브라우저 창을 열어 Google Cloud 콘솔 UI로 이동하고 다음으로 이동합니다.

  • Agent Platform → Agents → Deployments → agent-datacommons
  • Playground 탭을 선택합니다.

또는 이 터미널 명령어를 에코하고 링크를 클릭하여 에이전트 그라운드로 이동합니다.

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

테스트 쿼리를 제출합니다.

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

쿼리가 유효한 응답을 반환하는지 확인합니다.

감사 로그 분석

로그를 확인하고 테스트 실행 정책 평가를 검사합니다.

# list unique urls with http status and iap authorization result
gcloud logging read \
  "resource.type=\"networkservices.googleapis.com/Gateway\" \
  AND httpRequest.requestUrl:*" \
  --project=${PROJ_ID} \
  --limit=200 \
  --format="value(httpRequest.status, jsonPayload.authzPolicyInfo.result, httpRequest.requestUrl)" | sort -u
200     ALLOWED https://api.datacommons.org/mcp
200     ALLOWED https://cloudresourcemanager.googleapis.com:443/google.cloud.resourcemanager.v3.Projects/GetProject
200     ALLOWED https://telemetry.googleapis.com/v1/traces
200     ALLOWED https://${REGION}-aiplatform.googleapis.com/v1beta1/projects/${PROJ_ID}/locations/${REGION}/publishers/google/models/gemini-2.5-flash:generateContent
200     ALLOWED https://${REGION}-aiplatform.googleapis.com/v1beta1/projects/${PROJ_ID}/locations/${REGION}/reasoningEngines/${RE_ENGINE_ID}/sessions/${RE_SESSION_ID}
200     ALLOWED https://${REGION}-aiplatform.googleapis.com/v1beta1/projects/${PROJ_ID}/locations/${REGION}/reasoningEngines/${RE_ENGINE_ID}/sessions/${RE_SESSION_ID}:appendEvent
200     ALLOWED https://${REGION}-aiplatform.googleapis.com/v1beta1/projects/${PROJ_ID}/locations/${REGION}/reasoningEngines/${RE_ENGINE_ID}/sessions/${RE_SESSION_ID}/events
202     ALLOWED https://api.datacommons.org/mcp

레지스트리 IAP 엔드포인트 IAM 정책 업데이트

원격 분석 엔드포인트에 대한 에이전트 이그레스 권한 부여

# set var for endpoint display name
export ENDPOINT_1_DISPLAY_NAME="telemetry.googleapis.com"
echo ${ENDPOINT_1_DISPLAY_NAME}
# fetch endpoint registry id
export ENDPOINT_1_REGISTRY_ID=$(gcloud agent-registry services list \
  --location=${REGION} \
  --filter="displayName=${ENDPOINT_1_DISPLAY_NAME}" \
  --format="value(registryResource.basename())")
echo ${ENDPOINT_1_REGISTRY_ID}
# create policy config file
cat > cfg/iap-policy-re-agent-to-ep-1.json << EOF
{
  "bindings": [
    {
      "role": "roles/iap.egressor",
      "members": [
        "${RE_AGENT_IDENTITY}"
      ]
    }
  ]
}
EOF
# import policy file (bind iam policy)
gcloud -q beta iap web set-iam-policy cfg/iap-policy-re-agent-to-ep-1.json \
  --resource-type=agent-registry \
  --endpoint=${ENDPOINT_1_REGISTRY_ID} \
  --region=${REGION}
# verify iap iam policy for telemetry endpoint
gcloud beta iap web get-iam-policy \
  --region=${REGION} \
  --resource-type=agent-registry \
  --endpoint=${ENDPOINT_1_REGISTRY_ID}

aiplatform 엔드포인트에 대한 에이전트 이그레스 권한 부여

# set var for endpoint display name
export ENDPOINT_2_DISPLAY_NAME="${REGION}-aiplatform.googleapis.com"
echo ${ENDPOINT_2_DISPLAY_NAME}
# fetch endpoint registry id
export ENDPOINT_2_REGISTRY_ID=$(gcloud agent-registry services list \
  --location=${REGION} \
  --filter="displayName=${ENDPOINT_2_DISPLAY_NAME}" \
  --format="value(registryResource.basename())")
echo ${ENDPOINT_2_REGISTRY_ID}
# create policy config file
cat > cfg/iap-policy-re-agent-to-ep-2.json << EOF
{
  "bindings": [
    {
      "role": "roles/iap.egressor",
      "members": [
        "${RE_AGENT_IDENTITY}"
      ]
    }
  ]
}
EOF
# import policy file (bind iam policy)
gcloud -q beta iap web set-iam-policy cfg/iap-policy-re-agent-to-ep-2.json \
  --resource-type=agent-registry \
  --endpoint=${ENDPOINT_2_REGISTRY_ID} \
  --region=${REGION}
# verify iap iam policy for aiplatform endpoint
gcloud beta iap web get-iam-policy \
  --region=${REGION} \
  --resource-type=agent-registry \
  --endpoint=${ENDPOINT_2_REGISTRY_ID}

cloudresourcemanager 엔드포인트에 대한 에이전트 이그레스 권한 부여

# set var for endpoint display name
export ENDPOINT_3_DISPLAY_NAME="cloudresourcemanager.googleapis.com"
echo ${ENDPOINT_3_DISPLAY_NAME}
# fetch endpoint registry id
export ENDPOINT_3_REGISTRY_ID=$(gcloud agent-registry services list \
  --location=${REGION} \
  --filter="displayName=${ENDPOINT_3_DISPLAY_NAME}" \
  --format="value(registryResource.basename())")
echo ${ENDPOINT_3_REGISTRY_ID}
# create policy config file
cat > cfg/iap-policy-re-agent-to-ep-3.json << EOF
{
  "bindings": [
    {
      "role": "roles/iap.egressor",
      "members": [
        "${RE_AGENT_IDENTITY}"
      ]
    }
  ]
}
EOF
# import policy file (bind iam policy)
gcloud -q beta iap web set-iam-policy cfg/iap-policy-re-agent-to-ep-3.json \
  --resource-type=agent-registry \
  --endpoint=${ENDPOINT_3_REGISTRY_ID} \
  --region=${REGION}
# verify iap iam policy for cloudresourcemanager endpoint
gcloud beta iap web get-iam-policy \
  --region=${REGION} \
  --resource-type=agent-registry \
  --endpoint=${ENDPOINT_3_REGISTRY_ID}

감사 부분이 끝났습니다. 다음은 시행 섹션입니다.

12. 적용

상담사는 DRY_RUN 모드에서 게이트웨이를 통해 요청을 성공적으로 수행할 수 있었습니다. 승인 정책을 업데이트하여 Agent Gateway IAP 승인 확장 프로그램을 ENFORCE 모드로 전환합니다.

승인 확장 프로그램 업데이트

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

승인 정책 업데이트

# re-write authz policy config file (pointing to enforced authz extension)
cat > cfg/${AGW_NAME}-authz-policy-profile-iap.yaml << EOF
name: ${AGW_NAME}-authz-policy-profile-iap
target:
  resources:
    - "projects/${PROJ_ID}/locations/${REGION}/agentGateways/${AGW_NAME}"
policyProfile: REQUEST_AUTHZ
action: CUSTOM
customProvider:
  authzExtension:
    resources:
      - "projects/${PROJ_ID}/locations/${REGION}/authzExtensions/${AGW_NAME}-svc-ext-authz-iap-enforced"
EOF
# import authz policy config file (enable new authz policy)
gcloud beta network-security authz-policies import ${AGW_NAME}-authz-policy-profile-iap \
  --source=cfg/${AGW_NAME}-authz-policy-profile-iap.yaml \
  --location=${REGION}
# show authz policy details (verify enforced mode)
gcloud beta network-security authz-policies describe ${AGW_NAME}-authz-policy-profile-iap \
  --location=${REGION}

조건부 허용 확인

콘솔 UI에서 에이전트 Playground로 돌아갑니다.

추가 테스트 쿼리를 제출합니다 (허용된search_indicators 도구를 호출하려고 시도).

  • What data topics do you have for Peru?

Gemini 기반 모델 (${REGION}-aiplatform.googleapis.com/...), 원격 분석 API (telemetry.googleapis.com/...), Data Commons MCP 서버 엔드포인트 (api.datacommons.org/mcp)에 대한 에이전트 요청이 HTTP 200 OK 상태 코드로 전달되는지 확인합니다.

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

차단된 요청이 없는지 확인합니다. 게이트웨이 감사 로그에서 HTTP 403 Forbidden 상태 코드로 거부된 이그레스 시도를 찾습니다.

# show gateway logs for authz denies
gcloud logging read \
  "resource.type=\"networkservices.googleapis.com/Gateway\" \
  AND (jsonPayload.authzPolicyInfo.result=\"DENIED\" OR httpRequest.status=403)" \
  --project=${PROJ_ID} \
  --limit=10 \
  --format="table(
    timestamp.date(tz=LOCAL):label=TIMESTAMP,
    httpRequest.requestMethod:label=METHOD,
    httpRequest.status:label=STATUS,
    jsonPayload.enforcedGatewaySecurityPolicy.serverNameIndication:label=SNI,
    jsonPayload.authzPolicyInfo.result:label=AUTHZ_RESULT,
    jsonPayload.authzPolicyInfo.policies[0].name.basename():label=DENYING_POLICY
  )"
# show gateway logs for mcp requests with method and tool name
gcloud logging read \
  "resource.type=\"networkservices.googleapis.com/Gateway\" \
  AND jsonPayload.agentGatewayInfo.mcpInfo.method:*" \
  --project=${PROJ_ID} \
  --limit=10 \
  --format="table(
    timestamp.date(tz=LOCAL):label=TIMESTAMP,
    httpRequest.status:label=STATUS,
    jsonPayload.authzPolicyInfo.result:label=IAP_AUTHZ,
    jsonPayload.agentGatewayInfo.mcpInfo.method:label=MCP_METHOD,
    jsonPayload.agentGatewayInfo.mcpInfo.parameter:label=TOOL_NAME,
    httpRequest.requestUrl:label=URL
  )"

조건부 거부 확인

추가 테스트 쿼리를 제출합니다 (거부됨get_observations 도구를 호출하려고 시도함).

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

상담사는 먼저 search_indicators를 살펴본 후 get_observations를 사용하려고 시도하지만 실패하고 상담사 응답이 불완전하게 남습니다.

# show gateway logs for mcp requests with method and tool name
gcloud logging read \
  "resource.type=\"networkservices.googleapis.com/Gateway\" \
  AND jsonPayload.agentGatewayInfo.mcpInfo.method:*" \
  --project=${PROJ_ID} \
  --limit=10 \
  --format="table(
    timestamp.date(tz=LOCAL):label=TIMESTAMP,
    httpRequest.status:label=STATUS,
    jsonPayload.authzPolicyInfo.result:label=IAP_AUTHZ,
    jsonPayload.agentGatewayInfo.mcpInfo.method:label=MCP_METHOD,
    jsonPayload.agentGatewayInfo.mcpInfo.parameter:label=TOOL_NAME,
    httpRequest.requestUrl:label=URL
  )"
TIMESTAMP            STATUS  IAP_AUTHZ  MCP_METHOD                 TOOL_NAME          URL
YYYY-MM-DDTHH:MM:SS  403     DENIED     tools/call                 get_observations   https://api.datacommons.org/mcp
YYYY-MM-DDTHH:MM:SS          ALLOWED    tools/call                 get_observations   https://api.datacommons.org/mcp
YYYY-MM-DDTHH:MM:SS  403     DENIED     tools/call                 get_observations   https://api.datacommons.org/mcp
YYYY-MM-DDTHH:MM:SS  200     ALLOWED    tools/call                 search_indicators  https://api.datacommons.org/mcp
YYYY-MM-DDTHH:MM:SS  200     ALLOWED    tools/list                                    https://api.datacommons.org/mcp
YYYY-MM-DDTHH:MM:SS  202     ALLOWED    notifications/initialized                     https://api.datacommons.org/mcp

이렇게 하면 거버넌스 정책이 예상대로 작동하는지 확인할 수 있습니다.

빈 상태와 ALLOWED를 나타내는 두 번째 행은 403 응답을 보낸 후 소켓을 닫을 때 에이전트 게이트웨이에서 내보낸 보조 연결 종료 로그 이벤트입니다 (연결 닫기 이벤트에는 응답 상태 코드가 없으므로 httpRequest.status는 비어 있음).

강제 적용 부분이 끝났습니다. 다음은 정리 섹션입니다.

13. 삭제

# delete agent
curl -s -X DELETE "https://${REGION}-aiplatform.googleapis.com/v1/projects/${PROJ_ID}/locations/${REGION}/reasoningEngines/${RE_ENGINE_ID}?force=true" \
  -H "Authorization: Bearer $(gcloud auth application-default print-access-token)"

# next
# delete storage bucket
gcloud -q storage rm --recursive gs://${STAGING_BUCKET}

# next
# clear policy on mcp server
export IAP_ETAG=$(gcloud beta iap web get-iam-policy --resource-type=agent-registry --mcp-server=${MCP_REGISTRY_ID} --region=${REGION} --format="value(etag)")
cat > cfg/iap-policy-empty.json << EOF
{
  "bindings": [],
  "etag": "${IAP_ETAG}"
}
EOF

gcloud -q beta iap web set-iam-policy cfg/iap-policy-empty.json \
  --resource-type=agent-registry \
  --mcp-server=${MCP_REGISTRY_ID} \
  --region=${REGION}

# next
# clear policy on endpoint 1
export IAP_ETAG=$(gcloud beta iap web get-iam-policy --resource-type=agent-registry --endpoint=${ENDPOINT_1_REGISTRY_ID} --region=${REGION} --format="value(etag)")
cat > cfg/iap-policy-empty.json << EOF
{
  "bindings": [],
  "etag": "${IAP_ETAG}"
}
EOF

gcloud -q beta iap web set-iam-policy cfg/iap-policy-empty.json \
  --resource-type=agent-registry \
  --endpoint=${ENDPOINT_1_REGISTRY_ID} \
  --region=${REGION}

# next
# clear policy on endpoint 2
export IAP_ETAG=$(gcloud beta iap web get-iam-policy --resource-type=agent-registry --endpoint=${ENDPOINT_2_REGISTRY_ID} --region=${REGION} --format="value(etag)")
cat > cfg/iap-policy-empty.json << EOF
{
  "bindings": [],
  "etag": "${IAP_ETAG}"
}
EOF

gcloud -q beta iap web set-iam-policy cfg/iap-policy-empty.json \
  --resource-type=agent-registry \
  --endpoint=${ENDPOINT_2_REGISTRY_ID} \
  --region=${REGION}

# next
# clear policy on endpoint 3
export IAP_ETAG=$(gcloud beta iap web get-iam-policy --resource-type=agent-registry --endpoint=${ENDPOINT_3_REGISTRY_ID} --region=${REGION} --format="value(etag)")
cat > cfg/iap-policy-empty.json << EOF
{
  "bindings": [],
  "etag": "${IAP_ETAG}"
}
EOF

gcloud -q beta iap web set-iam-policy cfg/iap-policy-empty.json \
  --resource-type=agent-registry \
  --endpoint=${ENDPOINT_3_REGISTRY_ID} \
  --region=${REGION}

# next
# remove manual registry entry
gcloud -q agent-registry services delete ${MCP_RESOURCE_NAME} --location=${REGION}
# delete gateway resources
gcloud -q beta network-security authz-policies delete ${AGW_NAME}-authz-policy-profile-iap --location=${REGION}

gcloud -q beta service-extensions authz-extensions delete ${AGW_NAME}-svc-ext-authz-iap-dryrun --location=${REGION}

gcloud -q beta service-extensions authz-extensions delete ${AGW_NAME}-svc-ext-authz-iap-enforced --location=${REGION}

gcloud -q network-services agent-gateways delete ${AGW_NAME} --location=${REGION}

# next
# clean up local working directories and generated configs
rm -rf cfg agent-datacommons endpoints

# end

이것으로 정리 부분이 마무리되었습니다. 다음은 결론입니다.

14. 결론

수고하셨습니다 Agent Gateway를 사용하여 도구에 액세스하는 에이전트의 아웃바운드 커뮤니케이션을 배포하고 관리했습니다.

cosmopup

Cosmopup은 Codelab이 최고라고 생각합니다.

다음 단계는 무엇인가요?

의견 양식을 사용하여 의견, 질문 또는 수정사항을 자유롭게 제공해 주세요.

감사합니다.