Выход Agent Gateway из Agent Runtime в Google MCP

1. Введение

В этом практическом занятии рассматривается управление исходящим трафиком через Agent Gateway для агентов ИИ, обращающихся к удаленным серверам Google Cloud Model Context Protocol (MCP).

Приложения искусственного интеллекта, от автономных чат-ботов до автономных систем с многоагентными рабочими процессами, могут динамически вызывать внешние инструменты. Предоставление агентам контролируемого доступа к запросам к базам данных, получению веб-контента и выполнению действий имеет важное значение для безопасной и продуктивной работы агентов. Однако в корпоративных средах обеспечение безопасности выполнения инструментов агентами представляет собой сложную задачу. Если агент имеет прямой доступ к сети, атаки с внедрением импульсов или имитация моделей могут привести к утечке конфиденциальных данных или выполнению деструктивных команд.

Для управления автономными агентами в масштабе предприятия Agent Gateway предоставляет централизованную точку обеспечения принципа нулевого доверия, непосредственно интегрированную в архитектуру платформы агентов . Вместо того чтобы полагаться на пользовательские реализации, уникальные для каждого приложения или кода агента, Agent Gateway обеспечивает маршрутизацию сети, управление агентами и безопасность во время выполнения на уровне платформы.

Когда Agent Gateway работает в режиме исходящего трафика ( агент — куда угодно ), он перенаправляет все исходящие запросы от агентов, настроенных на использование шлюза. Каждый запрос рабочей нагрузки агента аутентифицируется с использованием уникального идентификатора агента и авторизуется с помощью политик Identity-Aware Proxy (IAP) . Вызовы инструментов MCP динамически декодируются и проверяются на предмет применения политик. Администраторы безопасности могут централизованно устанавливать детальные разрешения, чтобы гарантировать, что агенты могут вызывать только утвержденные конечные точки и методы.

Что вы строите

  • Шлюз агентов в режиме исходящего трафика ( агент — куда угодно ).
  • Расширение авторизации Identity-Aware Proxy (IAP)
  • Агент Agent Runtime ADK с идентификацией агента
  • Реестр агентов с использованием Google API и конечных точек MCP.
  • Политики авторизации с контролем доступа IAM
  • Для выполнения запросов к набору данных BigQuery с использованием MCP

рисунок1

Рис. 1. Архитектура Codelab

Чему вы научитесь

  • Как развернуть Agent Gateway в структурированной последовательности конфигурации
  • Как перевести политики авторизации из тестового режима в режим принудительного применения.
  • Как зарегистрировать конечные точки Google API и серверы MCP в реестре агентов.
  • Как проводить аудит журналов Agent Gateway для проверки управления исходящим трафиком.

Что вам нужно

  • Проект Google Cloud с включенной функцией выставления счетов.
  • Права доступа IAM для предоставления сетевых сервисов, наборов данных BigQuery и ресурсов платформы агентов.
  • POSIX-совместимая оболочка ( bash или zsh ) с установленным Google Cloud CLI (компоненты gcloud и bq ).
  • Инструменты командной строки: git , curl , jq (процессор JSON), Python 3 и uv (менеджер пакетов Python).

2. Понятия

Последовательность развертывания

При развертывании Agent Gateway с элементами управления важно следовать структурированной последовательности настройки, чтобы агенты имели доступ к необходимым ресурсам при инициализации, а сетевые запросы выполнялись успешно.

В этом практическом занятии используется следующая последовательность развертывания:

  • Запуск в режиме пробного запуска: если среда выполнения агента настроена на маршрутизацию исходящих вызовов к шлюзу до того, как шлюз будет полностью подготовлен, инициализация рабочей нагрузки завершится неудачей. Предварительная настройка расширения авторизации шлюза в режиме DRY_RUN гарантирует, что при поступлении трафика агента к шлюзу ни один запрос не будет отброшен.
  • Зарегистрируйте все службы: все агенты, серверы MCP и конечные точки, использующие Agent Gateway, должны быть зарегистрированы в Agent Registry. Запросы к незарегистрированным источникам или получателям отклоняются . Агенты, развернутые на Agent Runtime и серверах Google MCP, регистрируются автоматически. Любая конечная точка Google API или пользовательский сервер MCP должны быть зарегистрированы вручную.
  • Применение политик авторизации: Политики авторизации используются для предоставления зарегистрированным агентам доступа к агентским компонентам путем присвоения роли roles/iap.egressor субъекту идентификации агента и привязки ее к целевому ресурсу реестра. Оцените поведение агента в режиме тестового запуска, а затем определите политики, разрешающие выбранный исходящий трафик через шлюз. После того, как политики будут установлены, переключитесь в режим ENFORCED , чтобы шлюз мог активно применять политики управления.

рисунок 2

Рис. 2. Последовательность развертывания

Топология исходящей маршрутизации

Gateways typically manage inbound traffic (ingress) to backend services. Agent Gateway, operating in egress ( agent-to-anywhere ) mode, acts as a centralized, zero-trust outbound proxy for agentic workloads.

Когда приложение ИИ или агентная рабочая нагрузка пытается вызвать внешний инструмент или API, исходящий запрос перехватывается Agent Gateway и проверяется на соответствие политикам управления, прежде чем быть направленным к месту назначения:

  • Частные сети (VPC): исходящий трафик, ориентированный на внутренние корпоративные API, микросервисы, базы данных, размещенные в частных VPC, а также локальные или межоблачные сети, доступные через гибридное соединение.
  • Внешние сети (Интернет): Исходящий трафик, направленный на сторонние веб-сервисы, API SaaS или общедоступные конечные точки.
  • Сервисы ИИ и платформа агентов: исходящий трафик, ориентированный на управляемые API Google Cloud, базовые модели, конечные точки Google MCP (например, BigQuery) и сервисы управления платформой (реестр агентов и политики IAP).

рисунок3

Рис. 3. Топология маршрутизации исходящего трафика шлюза агента.

В центре внимания этого практического занятия — исходящий трафик от пользовательского агента в Agent Runtime, нацеленный на удаленную конечную точку сервера Google MCP для BigQuery.

3. Настройка

Необходимые роли IAM

Для создания ресурсов в этом практическом занятии необходимы следующие роли:

Категория

Требуемая роль IAM (ID)

Описание

управление API

roles/serviceusage.serviceUsageAdmin

Включите сервисы Google Cloud API

Сетевые устройства и шлюзы

roles/networkservices.admin

Шлюз агента предоставления услуг

Расширения сервисов

roles/serviceextensions.admin

Настройка расширений маршрутизации

Сетевая безопасность

roles/networksecurity.admin

Развертывание политик авторизации

Реестр агентов

roles/agentregistry.admin

Каталог разрешенных хостов

Vertex AI и агенты

roles/aiplatform.admin

Развертывание рабочих нагрузок среды выполнения агента

Политика выхода

roles/iap.admin

Применить политики roles/iap.egressor

BigQuery

roles/bigquery.admin

Настройка схем и тестовых наборов данных.

Облачное хранилище

roles/storage.admin

Управление тестовыми хранилищами для развертывания

Журналы и аудит

roles/logging.viewer

Проверьте трассировки и журналы аудита.

В качестве альтернативы можно использовать общую базовую роль, например, roles/admin или устаревшую роль roles/owner .

Получите доступ к своему проекту

В этом практическом занятии используется один проект Google Cloud. Шаги настройки выполняются с помощью командной строки gcloud и команд оболочки Linux.

Для начала откройте командную строку вашего проекта Google Cloud:

Укажите идентификатор вашего проекта.

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-dj"
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}"
echo ${AGW_NAME}
echo ${AGW_URI}
echo ${RE_AGENT_NAME}
echo ${RE_AGENT_ID_SET}
echo ${STAGING_BUCKET}
# create local dir for config files
mkdir -p cfg

Включить 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 \
  discoveryengine.googleapis.com

На этом завершается этап настройки... далее переходим к разделу «Шлюз» .

4. Шлюз

Перед применением контроля доступа разверните Agent Gateway и настройте его расширение авторизации в режиме DRY_RUN . Это позволит успешно выполнять исходящие вызовы инструментов, одновременно регистрируя результаты оценки для целей аудита.

Здесь Agent Gateway использует региональный реестр для поддержки региональных ресурсов среды выполнения агентов.

Создать шлюз

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

На этом завершается раздел, посвященный шлюзу... далее переходим к разделу «Авторизация» .

5. Авторизация

Расширение авторизации Agent Gateway для Identity-Aware Proxy (IAP) — это тип расширения службы , используемый для делегирования решений по авторизации для всех коммуникаций Agent Platform .

  1. Процесс делегирования: Когда агент пытается вызвать внешнюю конечную точку или сервер MCP, он перенаправляет запрос в Agent Gateway. Вместо локальной оценки доступа шлюз использует расширение авторизации для отправки вызова в службу оценки IAP. IAP оценивает идентификатор агента ( на основе SPIFFE ) в соответствии с политикой IAM целевого ресурса в реестре агентов. IAP возвращает шлюзу решение ALLOW или DENY , после чего шлюз либо перенаправляет трафик дальше, либо блокирует его с кодом состояния HTTP 403 Forbidden .
  2. Режимы принудительного применения: В режиме DRY_RUN IAP оценивает запросы и регистрирует решения в Cloud Logging , не блокируя трафик. В режиме ENFORCE любой запрос от неавторизованного агента или к незарегистрированному целевому объекту немедленно блокируется.
  3. Уровень привязки: Расширение сервиса подключается к Agent Gateway с помощью политики авторизации , настроенной с использованием профиля REQUEST_AUTHZ .

Расширение авторизации

Создать расширение авторизации

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

Политика авторизации

Политика авторизации привязывает поставщика безопасности (IAP) к целевому ресурсу шлюза и определяет профиль перехвата ( REQUEST_AUTHZ ).

Создать политику авторизации

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

На этом завершается раздел, посвященный авторизации... далее переходим к разделу «Кодовая база» .

6. Кодовая база

Код агента, набор данных BigQuery и скрипт регистрации, используемые в этом практическом занятии, хранятся в удаленном репозитории Google Cloud GitHub . Следующие шаги клонируют репозиторий локально, скопируют необходимые файлы в текущую структуру рабочих каталогов, а затем очистят ненужные временные файлы.

Для загрузки, сборки и развертывания упакованного кода приложения агента и артефактов его зависимостей создается промежуточное хранилище.

Получение удаленных артефактов

# clone remote repository to temp local dir
git clone https://github.com/GoogleCloudPlatform/cloud-networking-solutions.git ./temp_agw_cuj_arun_egress_gmcp
# copy agent runtime and endpoint definitions to working project dir
cp -r temp_agw_cuj_arun_egress_gmcp/codelabs/agw-cuj-arun-egress-gmcp/agent-dj ./agent-dj
cp -r temp_agw_cuj_arun_egress_gmcp/codelabs/agw-cuj-arun-egress-gmcp/endpoints ./endpoints
# remove temporary directory
rm -rf temp_agw_cuj_arun_egress_gmcp

Создание набора данных BigQuery

# create bq dataset schema and load data
bq --project_id=${PROJ_ID} query \
  --use_legacy_sql=false < agent-dj/setup.sql

Создать временный контейнер

# 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. Реестр

Реестр агентов представляет собой централизованный каталог всех агентов, серверов MCP и конечных точек (API) в экосистеме ИИ. Он также является каталогом, который можно использовать для перечисления, поиска и обнаружения других зарегистрированных инструментов и сервисов для использования приложениями ИИ. Режим исходящего трафика Agent Gateway ( агент-в-любое место ) использует модель данных реестра в качестве основы управления для обеспечения контроля доступа к исходящему трафику. Предоставление ролей IAM для вызывающих агентов проверяется на соответствие политике, привязанной к ресурсу реестра.

Для инициализации среды и поддержки агентов, использующих различные API и сервисы Google , используется скрипт, позволяющий быстро зарегистрировать общий набор конечных точек API, используя имена хостов и местоположения из endpoints/googleapis.txt .

Регистрация конечных точек

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

Проверьте конечные точки

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

На этом завершается раздел, посвященный реестру... далее переходим к разделу, посвященному среде выполнения .

8. Среда выполнения

Агент agent-dj ADK, развернутый в Agent Runtime, настроен в скрипте развертывания со следующими параметрами для интеграции с Agent Platform:

  • "identity_type": types.IdentityType.AGENT_IDENTITY для предоставления уникального основного идентификатора на основе SPIFFE для агента
  • "agent_gateway_config": { "agent_to_anywhere_config": {"agent_gateway": } } для направления всего исходящего трафика, инициированного агентом, на Agent Gateway для оценки и применения политик.

Развернуть агент

# deploy agent runtime workload
uv --directory agent-dj 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 dj contact info" \
  --enable-telemetry \
  --enable-agent-identity \
  --agent-gateway-egress=${AGW_URI} \
  --allow-token-sharing

Получение основных параметров развертывания

# 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 AGENT_UID=$(gcloud agent-registry agents list \
  --location=${REGION} \
  --filter="displayName=${RE_AGENT_NAME}" \
  --format="value(uid)")
echo ${AGENT_UID}

Проверьте запись в реестре.

# show agent resource registry details
gcloud agent-registry agents describe ${AGENT_UID} --location=${REGION}
agentId: urn:agent:projects-${PROJ_NO}:projects:${PROJ_NO}:locations:${REGION}:aiplatform:reasoningEngines:${RE_ENGINE_ID}
attributes:
  agentregistry.googleapis.com/system/Framework:
    framework: google-adk
  agentregistry.googleapis.com/system/RuntimeIdentity:
    principal: principal://agents.global.org-${PROJ_NO}.system.id.goog/resources/aiplatform/projects/${PROJ_NO}/locations/${REGION}/reasoningEngines/${RE_ENGINE_ID}
  agentregistry.googleapis.com/system/RuntimeReference:
    uri: //aiplatform.googleapis.com/projects/${PROJ_NO}/locations/${REGION}/reasoningEngines/${RE_ENGINE_ID}
createTime: 'YYYY-MM-DDTHH:MM:SS.ssssssZ'
description: agent for dj contact info
displayName: agent-dj
name: projects/${PROJ_ID}/locations/${REGION}/agents/agentregistry-${RE_AGENT_ID}
protocols:
- interfaces:
  - protocolBinding: HTTP_JSON
    url: https://${REGION}-aiplatform.googleapis.com/v1/projects/${PROJ_ID}/locations/${REGION}/reasoningEngines/${RE_ENGINE_ID}:query
  - protocolBinding: HTTP_JSON
    url: https://${REGION}-aiplatform.googleapis.com/v1/projects/${PROJ_ID}/locations/${REGION}/reasoningEngines/${RE_ENGINE_ID}:streamQuery
  type: CUSTOM
uid: agentregistry-00000000-0000-0000-1234-4567abcd1234
updateTime: 'YYYY-MM-DDTHH:MM:SS.ssssssZ'

Проверьте конфигурацию шлюза.

# verify agent gateway routing specification
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 для агентов по предоставлению грантов и управления ресурсами

Предоставление прав доступа к ресурсам через IAM позволяет субъекту-агенту получать доступ к BigQuery, инструментам MCP (для API Google) и другим необходимым сервисам платформы ИИ. Эти политики применяются с помощью IAM на уровне ресурсов .

# grant bigquery query execution role
gcloud projects add-iam-policy-binding ${PROJ_ID} \
  --member="${RE_AGENT_IDENTITY}" \
  --role="roles/bigquery.user"

# grant bigquery data viewer role
gcloud projects add-iam-policy-binding ${PROJ_ID} \
  --member="${RE_AGENT_IDENTITY}" \
  --role="roles/bigquery.dataViewer"

# grant mcp tool execution role
gcloud projects add-iam-policy-binding ${PROJ_ID} \
  --member="${RE_AGENT_IDENTITY}" \
  --role="roles/mcp.toolUser"
# 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 агента для ресурсов.

# verify active role bindings for agent identity
gcloud projects get-iam-policy ${PROJ_ID} \
  --flatten="bindings[].members" \
  --filter="bindings.members:${RE_AGENT_IDENTITY}" \
  --format="value(bindings.role)"

На этом завершается раздел, посвященный работе во время выполнения... далее переходим к разделу «Политики» .

9. Политика

Политики авторизации управления агентом разрешают трафик от агента ИИ через Agent Gateway и далее к месту назначения (например, к конечной точке сервера Google Cloud MCP для BigQuery). После того, как трафик достигнет места назначения, доступ к данным предоставляется с помощью обычных разрешений IAM (которые были включены в предыдущем разделе).

Предоставление ролей IAM для исходящего трафика Agent Gateway включает политики доступа, которые позволяют субъекту-агенту получать доступ к зарегистрированным целевым ресурсам через Agent Gateway. Политики применяются на уровне Agent Gateway и проверяются с помощью политик IAM Identity-Aware Proxy (IAP).

Предоставьте агенту роли IAM для исходящего трафика через Agent Gateway.

Agent Gateway проверяет входящие запросы, чтобы убедиться, что у вызывающего агента есть разрешение iap.webServiceVersions.egressViaIAP (предоставляемое ролью roles/iap.egressor ) на целевой ресурс.

Предоставление roles/iap.egressor идентификатору агента или набору субъектов среды выполнения агента для выбранного целевого ресурса разрешает исходящий трафик. В этом практическом задании роль применяется к набору субъектов , который предоставляет разрешения всем идентификаторам агентов среды выполнения агента в проекте.

Политики IAM привязаны к целевым ресурсам, определенным в модели данных Agent Registry. Ресурс iap_web/agentRegistry представляет собой уровень в иерархии IAM , охватывающий весь реестр . agentRegistry служит родительским ресурсом для отдельных дочерних ресурсов agents , mcpServers и endpoints . В этом практическом задании политика IAM привязана к уровню реестра , который применяет разрешения ко всем дочерним ресурсам.

Настройка политики IAM для регионального реестра IAP

# show iap iam policy for regional registry
gcloud beta iap web get-iam-policy --resource-type=agent-registry --region=${REGION}
# retrieve active etag on policy for regional registry
export IAP_ETAG=$(gcloud beta iap web get-iam-policy --resource-type=agent-registry --region=${REGION} --format="value(etag)")
echo ${IAP_ETAG}
# create policy config file
cat > cfg/iap-policy-re-agent-set-to-registry-${REGION}.json << EOF
{
  "bindings": [
    {
      "role": "roles/iap.egressor",
      "members": [
        "${RE_AGENT_ID_SET}"
      ]
    }
  ],
  "etag": "${IAP_ETAG}"
}
EOF
# import policy file (bind iam policy)
gcloud beta iap web set-iam-policy cfg/iap-policy-re-agent-set-to-registry-${REGION}.json \
  --resource-type=agent-registry \
  --region=${REGION}
# verify iap iam policy for regional registry
gcloud beta iap web get-iam-policy --resource-type=agent-registry --region=${REGION}

На этом завершается раздел, посвященный политике компании... далее переходим к разделу «Аудит» .

10. Аудит

Расширение авторизации Agent Gateway работает в режиме DRY_RUN . Исходящие запросы отслеживаются и регистрируются, но не блокируются.

Запросы тестового агента

Откройте окно браузера с пользовательским интерфейсом консоли Google Cloud и перейдите по следующей ссылке:

  • Платформа агентов → Агенты → Развертывания → agent-dj
  • Выберите вкладку «Игровая площадка» .

Или введите эту команду в терминале и щелкните ссылку, чтобы перейти в среду разработки агента:

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

Отправьте несколько тестовых запросов...

  • How many DJs do we have on file?
  • What is the phone number of DJ Cosmopup?

Убедитесь, что запросы возвращают корректные ответы (например, " В базе данных 12 диджеев ").

Анализ журналов аудита

Просмотрите журналы и изучите результаты оценки политики в ходе пробного запуска.

# query gateway logs for dry run
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
  )"
TIMESTAMP            METHOD  STATUS  IAP_AUTHZ  MCP_METHOD  URL
YYYY-MM-DDTHH:MM:SS  POST    200     ALLOWED                https://telemetry.googleapis.com/v1/traces
YYYY-MM-DDTHH:MM:SS  POST    200     ALLOWED                https://${REGION}-aiplatform.googleapis.com/v1beta1/projects/${PROJ_ID}/locations/${REGION}/reasoningEngines/${RE_ENGINE_ID}/sessions/${RE_SESSION_ID}:appendEvent
YYYY-MM-DDTHH:MM:SS  POST    200     ALLOWED                https://${REGION}-aiplatform.googleapis.com/v1beta1/projects/${PROJ_ID}/locations/${REGION}/publishers/google/models/gemini-2.5-flash:generateContent
YYYY-MM-DDTHH:MM:SS  POST    200     ALLOWED                https://${REGION}-aiplatform.googleapis.com/v1beta1/projects/${PROJ_ID}/locations/${REGION}/reasoningEngines/${RE_ENGINE_ID}/sessions/${RE_SESSION_ID}:appendEvent
YYYY-MM-DDTHH:MM:SS  POST    200     ALLOWED    tools/call  https://bigquery.googleapis.com/mcp
YYYY-MM-DDTHH:MM:SS  POST    200     ALLOWED                https://${REGION}-aiplatform.googleapis.com/v1beta1/projects/${PROJ_ID}/locations/${REGION}/reasoningEngines/${RE_ENGINE_ID}/sessions/${RE_SESSION_ID}:appendEvent
YYYY-MM-DDTHH:MM:SS  POST    200     ALLOWED                https://${REGION}-aiplatform.googleapis.com/v1beta1/projects/${PROJ_ID}/locations/${REGION}/publishers/google/models/gemini-2.5-flash:generateContent
YYYY-MM-DDTHH:MM:SS  POST    200     ALLOWED    tools/call  https://bigquery.googleapis.com/mcp
YYYY-MM-DDTHH:MM:SS  POST    200     ALLOWED                https://${REGION}-aiplatform.googleapis.com/v1beta1/projects/${PROJ_ID}/locations/${REGION}/publishers/google/models/gemini-2.5-flash:generateContent
YYYY-MM-DDTHH:MM:SS  POST    200     ALLOWED    tools/call  https://bigquery.googleapis.com/mcp

На этом завершается раздел аудита... далее переходим к разделу «Принудительное исполнение» .

11. Принудить к исполнению

Агент смог успешно отправлять запросы через шлюз в режиме DRY_RUN . Переведите расширение авторизации 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}

Проверка соблюдения законодательства

Вернитесь в среду разработки агентов в консольном интерфейсе.

Отправьте дополнительный тестовый запрос...

  • What DJ Fishfry's credit card number?

Обратите внимание, что запросы агента к базовой модели Gemini ( ${REGION}-aiplatform.googleapis.com/... ) и конечной точке сервера MCP ( bigquery.googleapis.com/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
  )"

На этом завершается раздел, посвященный применению мер принуждения... далее переходим к разделу «Уборка» .

12. Уборка

# 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
# remove agent resource iam bindings
for ROLE in \
  "roles/bigquery.user" \
  "roles/bigquery.dataViewer" \
  "roles/mcp.toolUser" \
  "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 storage bucket
gcloud -q storage rm --recursive gs://${STAGING_BUCKET}

# delete bigquery dataset and contents
bq rm -r -f -d ${PROJ_ID}:dj_ds

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

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

# next
# 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 network-services agent-gateways delete ${AGW_NAME} --location=${REGION}

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

# end

На этом завершается этап очистки... далее переходим к заключению !

13. Заключение

Поздравляем! Вы успешно развернули и настроили исходящие коммуникации для агента, получающего доступ к инструментам через Agent Gateway!

космопап

Cosmopup считает, что Codelabs — лучшие!

Что дальше?

Пожалуйста, оставляйте свои комментарии, вопросы или замечания, используя эту форму обратной связи.

Спасибо!