1. Wprowadzenie
To ćwiczenie pokazuje, jak zarządzać ruchem przychodzącym do bramy agentów w przypadku agentów AI hostowanych w środowisku wykonawczym agentów.
Brama agenta działająca w trybie wejścia (klient-agent) obsługuje zarządzanie komunikacją między klientami – użytkownikami, agentami na komputerach, środowiskami IDE do kodowania, agentami równorzędnymi itp. – a środowiskiem wykonawczym agenta, w którym działają agenci. Ten tryb służy do ochrony agentów przed atakami polegającymi na wstrzykiwaniu promptów przychodzących lub szkodliwych treści wysyłanych przez klientów. Cały ruch przychodzący jest przetwarzany za pomocą rozszerzeń autoryzacji i Model Armor, aby zabezpieczyć punkt wejścia do sieci dla wszystkich interakcji z agentem.
Co utworzysz
- Brama agentów w trybie ruchu przychodzącego (od klienta do agenta)
- Rozszerzenie autoryzacji Model Armor
- Agent ADK środowiska wykonawczego agentów z tożsamością agenta
- Dane z plików Cloud Storage, na których agent wykonuje zapytania za pomocą MCP
- Szablony Model Armor do sprawdzania promptów i odpowiedzi LLM
- Szablony Sensitive Data Protection do deidentyfikacji danych
Rys. 1. Architektura ćwiczeń z programowania
Czego się dowiesz
- Wdrażanie bramy agenta do filtrowania ruchu przychodzącego do agenta
- Konfigurowanie rozszerzeń autoryzacji Model Armor i delegowania
- Jak tworzyć i wdrażać niestandardowe szablony Model Armor
- Jak tworzyć i wdrażać niestandardowe szablony Sensitive Data Protection
- Jak testować i weryfikować zasady kontroli modeli LLM
Wymagania
- projekt Google Cloud z włączonymi płatnościami;
- uprawnienia IAM do udostępniania usług sieciowych, zbiorów danych BigQuery i zasobów platformy Agent Platform;
- Powłoka zgodna z POSIX (
bashlubzsh) z zainstalowanym Google Cloud CLI (komponentgcloud). - Narzędzia wiersza poleceń:
git,curl,jq(procesor JSON), Python 3 iuv(system zarządzania pakietami Pythona)
2. Pojęcia
Kierunek ruchu i role bramy
Brama agentów działa jako serwer proxy sieciowy z informacjami o agencie, ale jej rola operacyjna zmienia się w zależności od kierunku ruchu:
- Tryb od agenta do dowolnego miejsca (ruch wychodzący): działa jako serwer proxy ruchu wychodzącego. Gdy agent wywołuje zewnętrzne narzędzia bazodanowe, serwery MCP innych firm lub interfejsy API, brama wyjściowa zarządza wykrywaniem usług, routingiem, wzajemnym protokołem TLS (
mTLS), dynamicznym wstrzykiwaniem danych logowania OAuth i kontrolą dostępu do punktów końcowych. - Tryb klient-agent (wejście): działa jako brama zabezpieczeń frontendu. Jego głównym celem jest ochrona dostępu do środowiska wykonawczego agenta przez przechwytywanie i oczyszczanie przychodzących promptów w języku naturalnym, zanim dotrą one do kodu agenta lub modeli AI.
Ścieżka Ingress do Agent Runtime
Żądania klienta kierowane do agenta hostowanego w Agent Runtime są przeznaczone dla punktu końcowego API aiplatform.googleapis.com.
POST https://${REGION}-aiplatform.googleapis.com/v1/projects/${PROJECT_ID}/locations/${REGION}/reasoningEngines/${RE_ENGINE_ID}:query
Ten przychodzący strumień komunikacji do punktu końcowego API reprezentuje ścieżkę wejścia klient–agent.
Aby zabezpieczyć tę ścieżkę ruchu przychodzącego zarządzaną przez Google, Brama agentów jest bezpośrednio zintegrowana z Google Front End (GFE) na warstwie infrastruktury obsługującej interfejs API. Podczas wdrażania zarządzanego agenta w środowisku wykonawczym agenta Google natywnie wiąże zasadę autoryzacji bramy wejściowej z przychodzącymi żądaniami klientów na brzegu sieci.
Rys. 2. Zarządzanie ruchem przychodzącym za pomocą bramy agentów do środowiska wykonawczego agentów
Ponieważ inspekcja odbywa się na poziomie frontendu, zanim żądania trafią do środowiska wykonawczego agenta, ta architektura nie wprowadza dodatkowych obciążeń sieciowych ani opóźnień wewnętrznych. Skalowanie jest obsługiwane automatycznie przez infrastrukturę frontendu, co eliminuje konieczność zarządzania wewnętrznymi adresami IP, systemami równoważenia obciążenia lub niestandardowymi trasami DNS.
Usuwanie zagrożeń w tekście za pomocą Model Armor
Ocena danych logowania wywołującego i egzekwowanie kontroli dostępu IAM (roles/aiplatform.user) jest obsługiwana natywnie przez aiplatform warstwę hostingu interfejsu API. Brama wejściowa sama w sobie nie przeprowadza autoryzacji tożsamości, ale koncentruje się na bezpieczeństwie treści za pomocą rozszerzeń autoryzacji skonfigurowanych z profilem CONTENT_AUTHZ. Brama działa jako wbudowany punkt egzekwowania zasad, przechwytując prompty w języku naturalnym w trakcie przesyłania, zanim dotrą one do pętli wnioskowania agenta AI lub bazowego modelu LLM.
Gdy do usługi frontendu dotrze prompt użytkownika, brama zainicjuje wywołanie ext_proc (przetwarzanie zewnętrzne) do regionalnej usługi rozszerzenia autoryzacji Model Armor, która przesyła strumieniowo wywołanie do płaszczyzny danych Model Armor. Model Armor działa jak zapora sieciowa w języku naturalnym. Ocenia tekst na podstawie aktywnych szablonów, aby wykrywać zagrożenia dla bezpieczeństwa:
- Próby pośredniego wstrzykiwania promptów i jailbreaków
- złośliwe adresy URL, toksyczny język lub niebezpieczne treści;
- Wyciek informacji umożliwiających identyfikację (
PII) i danych wrażliwych
Jeśli szablon zawiera filtry Sensitive Data Protection (SDP), Model Armor wykonuje dodatkowe wywołanie gRPC do usługi Cloud SDP. Cloud SDP sprawdza ładunek przy użyciu określonego szablonu, wykonuje wszelkie żądane działania związane z deidentyfikacją lub utajnianiem i zwraca oczyszczony wynik z powrotem w łańcuchu, aby można go było bezpiecznie przekazać dalej.
Jeśli zostanie wykryte naruszenie zasad lub dopasowanie do nieocenzurowanych danych wrażliwych, brama blokuje lub cenzuruje ładunek na brzegu sieci przed wejściem do środowiska wykonawczego. Dzięki temu działająca aplikacja agenta AI pozostaje chroniona i nigdy nie przetwarza złośliwych ani nieocenzurowanych ładunków.
To koniec części poświęconej koncepcjom. Przejdźmy teraz do sekcji Konfiguracja.
3. Konfiguracja
Wymagane role uprawnień
Aby utworzyć zasoby w tym ćwiczeniu, musisz mieć te role:
Kategoria | Wymagana rola uprawnień (identyfikator) | Opis |
Zarządzanie interfejsami API |
| Włączanie usług interfejsu Google Cloud API |
Sieć i brama |
| Udostępnianie bramy agenta |
Rozszerzenia usług |
| Konfigurowanie rozszerzeń routingu |
Bezpieczeństwo sieciowe |
| Wdrażanie zasad autoryzacji |
Sensitive Data Protection |
| Zarządzanie szablonami inspekcji i deidentyfikacji SDP |
Model Armor |
| Tworzenie szablonów bezpieczeństwa i zarządzanie nimi |
Agent Platform |
| Wdrażanie zadań Agent Runtime |
Cloud Storage |
| Zarządzanie wdrożeniem i zasobnikami danych klientów |
Administrowanie uprawnieniami |
| Powiązywanie uprawnień na poziomie projektu z tożsamością agenta |
Logi i audyt |
| Sprawdzanie śladów i dzienników kontrolnych |
Możesz też użyć szerokiej roli podstawowej, np. roles/admin, lub starszej roli roles/owner.
Dostęp do projektu
To ćwiczenie korzysta z jednego projektu Google Cloud. Kroki konfiguracji wykorzystują interfejs wiersza poleceń gcloud i polecenia powłoki Linux.
Zacznij od uzyskania dostępu do wiersza poleceń projektu w chmurze Google Cloud:
- Cloud Shell na stronie
shell.cloud.google.comlub - Terminal lokalny z zainstalowanym interfejsem wiersza poleceń
gcloud
Ustawianie identyfikatora projektu
gcloud config set project SET_YOUR_PROJECT_ID_HERE
Uwierzytelnianie sesji
# login to gcloud cli
gcloud auth login
# login for gcloud api
gcloud auth application-default login
Ustawianie zmiennych środowiskowych powłoki
# set custom var for slug (eg, "foo") and region preference
export SLUG="foo"
export REGION="us-central1"
echo ${SLUG}
echo ${REGION}
# create project vars (automatic)
export PROJ_ID=$(gcloud config list --format="value(core.project)")
export PROJ_NO=$(gcloud projects describe ${PROJ_ID} --format="value(projectNumber)")
export ORG_ID=$(gcloud projects get-ancestors ${PROJ_ID} --format="value(id)" | tail -n 1)
export USER_IDENTITY=$(gcloud config get-value account)
echo ${PROJ_ID}
echo ${PROJ_NO}
echo ${ORG_ID}
echo ${USER_IDENTITY}
# create resource vars (automatic)
export AGW_NAME="agw-${SLUG}-${REGION}-cta"
export AGW_URI="projects/${PROJ_ID}/locations/${REGION}/agentGateways/${AGW_NAME}"
export RE_AGENT_NAME="agent-crm"
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 DATA_BUCKET="customer-data-${PROJ_NO}"
export MCP_URL="https://storage.mtls.googleapis.com/storage/mcp"
echo ${AGW_NAME}
echo ${AGW_URI}
echo ${RE_AGENT_NAME}
echo ${RE_AGENT_ID_SET}
echo ${STAGING_BUCKET}
echo ${DATA_BUCKET}
echo ${MCP_URL}
# create local dir for config files
mkdir -p cfg
Aktualizacja gcloud cli (zalecane)
Jeśli korzystasz z samodzielnie zarządzanej instalacji pakietu SDK Google Cloud (czyli poza Cloud Shell), zaktualizuj komponenty do najnowszej wersji.
# update gcloud cli
gcloud components update
Włączanie usług API
# enable google apis (agent platform bundle, part 1)
gcloud services enable \
agentregistry.googleapis.com \
aiplatform.googleapis.com \
apphub.googleapis.com \
apptopology.googleapis.com \
cloudapiregistry.googleapis.com \
cloudtrace.googleapis.com \
compute.googleapis.com \
dataform.googleapis.com \
iam.googleapis.com \
iamconnectors.googleapis.com \
iap.googleapis.com \
logging.googleapis.com \
modelarmor.googleapis.com \
monitoring.googleapis.com \
networksecurity.googleapis.com \
networkservices.googleapis.com \
notebooks.googleapis.com \
observability.googleapis.com
# enable google apis (agent platform bundle, part 2)
gcloud services enable \
securitycenter.googleapis.com \
saasservicemgmt.googleapis.com \
storage.googleapis.com \
telemetry.googleapis.com \
texttospeech.googleapis.com
# enable google apis (all the rest)
gcloud services enable \
dlp.googleapis.com
To kończy część konfiguracji... przejdźmy teraz do sekcji Brama.
4. Brama
Wdróż bramę agenta zarządzaną przez Google działającą w trybie klient-agent (CLIENT_TO_AGENT). W przeciwieństwie do bram wyjściowych, które wymagają powiązań z rejestrem agentów w celu kierowania połączeń wychodzących, brama wejściowa jest powiązana bezpośrednio na poziomie interfejsu, aby służyć jako punkt egzekwowania wbudowanego w przypadku przychodzących promptów kierowanych do środowiska wykonawczego agentów.
Zasady dotyczące ruchu wychodzącego są często wdrażane w trybie DRY_RUN na poziomie bramy, natomiast zasady dotyczące zarządzania treściami przychodzącymi (CONTENT_AUTHZ) są wdrażane bezpośrednio w trybie egzekwowania. Szczegółowe logowanie tylko do celów kontroli lub aktywne blokowanie jest kontrolowane w górę w ramach poszczególnych szablonów Model Armor.
Utwórz bramę
# create agent gateway config file
cat > cfg/${AGW_NAME}.yaml <<EOF
name: ${AGW_NAME}
protocols:
- MCP
googleManaged:
governedAccessPath: CLIENT_TO_AGENT
EOF
# import agent gateway config file (create gateway)
gcloud network-services agent-gateways import ${AGW_NAME} \
--source="cfg/${AGW_NAME}.yaml" \
--location=${REGION}
Weryfikacja bramy
# list agent gateways (in region)
gcloud network-services agent-gateways list --location=${REGION}
# show agent gateway details (verify deployment state)
gcloud network-services agent-gateways describe ${AGW_NAME} --location=${REGION}
To wszystko, jeśli chodzi o bramę. Przejdźmy teraz do sekcji Model Armor.
5. Model Armor
Szablony SDP
Utwórz szablon inspekcji i deidentyfikacji Sensitive Data Protection (SDP), który będzie używany w szablonie odpowiedzi Model Armor. Ta konfiguracja oznacza numery ubezpieczenia społecznego w Stanach Zjednoczonych (SSN) do zamazania.
Tworzenie szablonu inspekcji
Szablon inspekcji identyfikuje informacje poufne (US_SOCIAL_SECURITY_NUMBER) w danych.
# create inspect template
curl -fsS -X POST "https://dlp.googleapis.com/v2/projects/${PROJ_ID}/locations/${REGION}/inspectTemplates" \
-H "Authorization: Bearer $(gcloud auth application-default print-access-token)" \
-H "Content-Type: application/json" -H "x-goog-user-project: ${PROJ_ID}" \
-d @- << EOF
{
"templateId": "agw-ssn-inspect-template",
"inspectTemplate": {
"displayName": "ssn inspect template",
"inspectConfig": {
"infoTypes": [
{ "name": "US_SOCIAL_SECURITY_NUMBER" }
],
"minLikelihood": "POSSIBLE"
}
}
}
EOF
Tworzenie szablonu deidentyfikacji
Szablon deidentyfikacji określa przekształcenie, które ma być zastosowane do numerów SSN znalezionych przez szablon inspekcji. W tym przypadku przekształcenie polega na zastąpieniu numeru SSN typem informacji.
# create de-identify template
curl -fsS -X POST "https://dlp.googleapis.com/v2/projects/${PROJ_ID}/locations/${REGION}/deidentifyTemplates" \
-H "Authorization: Bearer $(gcloud auth application-default print-access-token)" \
-H "Content-Type: application/json" -H "x-goog-user-project: ${PROJ_ID}" \
-d @- << EOF
{
"templateId": "agw-ssn-redaction-template",
"deidentifyTemplate": {
"displayName": "SSN Redaction Template",
"deidentifyConfig": {
"infoTypeTransformations": {
"transformations": [{
"primitiveTransformation": { "replaceWithInfoTypeConfig": {} }
}]
}
}
}
}
EOF
Weryfikowanie szablonów SDP
# get (describe) inspect template
curl -fsS -X GET "https://dlp.googleapis.com/v2/projects/${PROJ_ID}/locations/${REGION}/inspectTemplates" \
-H "Authorization: Bearer $(gcloud auth application-default print-access-token)" \
-H "Content-Type: application/json" -H "x-goog-user-project: ${PROJ_ID}" | jq
# get (describe) de-identify template
curl -fsS -X GET "https://dlp.googleapis.com/v2/projects/${PROJ_ID}/locations/${REGION}/deidentifyTemplates" \
-H "Authorization: Bearer $(gcloud auth application-default print-access-token)" \
-H "Content-Type: application/json" -H "x-goog-user-project: ${PROJ_ID}" | jq
Szablony Model Armor
Domyślny punkt końcowy interfejsu Model Armor API jest globalny (modelarmor.googleapis.com). Zasoby Model Armor dla szablonów i silników oceny są jednak zlokalizowane w określonych regionach geograficznych. Regionalny punkt końcowy proxy (REP) Google Cloud lub regionalny punkt końcowy API dla Model Armor to https://modelarmor.${LOCATION}.rep.googleapis.com/.
Domyślnie podczas uruchamiania polecenia gcloud model-armor ... interfejs CLI próbuje wysyłać żądania API do standardowego globalnego punktu końcowego (https://modelarmor.googleapis.com/). Zastąpienie punktu końcowego API służy do przekierowywania wszystkich żądań HTTP SDK/CLI dotyczących Model Armor bezpośrednio do regionalnej warstwy API rep.googleapis.com, w której są tworzone, przechowywane i wykonywane zapytania dotyczące tych szablonów związanych z lokalizacją.
Ustawianie zastąpienia interfejsu API
# set api endpoint override per location
gcloud config set api_endpoint_overrides/modelarmor "https://modelarmor.${REGION}.rep.googleapis.com/"
Weryfikacja zastąpienia interfejsu API
# view api overrides on active gcloud config
gcloud config list api_endpoint_overrides/
Tworzenie szablonu filtra żądań
Utwórz szablon filtra żądań, aby blokować szerzenie nienawiści, nękanie, treści o charakterze jednoznacznie seksualnym i ataki polegające na wstrzykiwaniu identyfikatorów URI. Rejestrowanie zostanie włączone, aby rejestrować szczegółowe informacje o zdarzeniach związanych z egzekwowaniem zasad. Skonfigurowano też niestandardowe kody błędów i komunikaty o błędach, które będą się wyświetlać, gdy żądanie zostanie zablokowane.
# create model armor template (request)
gcloud beta model-armor templates create ${AGW_NAME}-modar-req-template \
--project=${PROJ_ID} \
--location=${REGION} \
--rai-settings-filters='[
{ "filterType": "HATE_SPEECH", "confidenceLevel": "MEDIUM_AND_ABOVE" },
{ "filterType": "HARASSMENT", "confidenceLevel": "MEDIUM_AND_ABOVE" },
{ "filterType": "SEXUALLY_EXPLICIT", "confidenceLevel": "MEDIUM_AND_ABOVE" }
]' \
--pi-and-jailbreak-filter-settings-enforcement=enabled \
--pi-and-jailbreak-filter-settings-confidence-level=medium-and-above \
--template-metadata-enforcement-type=INSPECT_AND_BLOCK \
--malicious-uri-filter-settings-enforcement=enabled \
--template-metadata-custom-llm-response-safety-error-code=798 \
--template-metadata-custom-llm-response-safety-error-message="ahoy! model response blocked by content filter :(" \
--template-metadata-custom-prompt-safety-error-code=799 \
--template-metadata-custom-prompt-safety-error-message="ahoy! the request was blocked by ye content filter... so rephrase the prompt and try again!" \
--template-metadata-ignore-partial-invocation-failures \
--template-metadata-log-operations \
--template-metadata-log-sanitize-operations
Tworzenie szablonu filtra odpowiedzi
Utwórz szablon filtra odpowiedzi, który blokuje te same treści co szablon filtra żądań. DLP jest skonfigurowana w odpowiedzi, aby usuwać dane umożliwiające identyfikację numerów SSN w wiadomościach zwracanych do klienta od agenta.
# create model armor template (response)
gcloud beta model-armor templates create ${AGW_NAME}-modar-resp-template \
--project=${PROJ_ID} \
--location=${REGION} \
--rai-settings-filters='[
{ "filterType": "HATE_SPEECH", "confidenceLevel": "MEDIUM_AND_ABOVE" },
{ "filterType": "HARASSMENT", "confidenceLevel": "MEDIUM_AND_ABOVE" },
{ "filterType": "SEXUALLY_EXPLICIT", "confidenceLevel": "MEDIUM_AND_ABOVE" }
]' \
--malicious-uri-filter-settings-enforcement=enabled \
--advanced-config-inspect-template=projects/${PROJ_ID}/locations/${REGION}/inspectTemplates/agw-ssn-inspect-template \
--advanced-config-deidentify-template=projects/${PROJ_ID}/locations/${REGION}/deidentifyTemplates/agw-ssn-redaction-template \
--template-metadata-enforcement-type=INSPECT_AND_BLOCK \
--template-metadata-custom-llm-response-safety-error-code=798 \
--template-metadata-custom-llm-response-safety-error-message="ahoy! model response blocked by content filter :(" \
--template-metadata-custom-prompt-safety-error-code=799 \
--template-metadata-custom-prompt-safety-error-message="ahoy! the request was blocked by ye content filter... so rephrase the prompt and try again!" \
--template-metadata-ignore-partial-invocation-failures \
--template-metadata-log-operations \
--template-metadata-log-sanitize-operations
Weryfikowanie szablonów Model Armor
# list model armor templates
gcloud model-armor templates list --location=${REGION}
# show request filter template details
gcloud model-armor templates describe ${AGW_NAME}-modar-req-template --location=${REGION}
# show response filter template details
gcloud model-armor templates describe ${AGW_NAME}-modar-resp-template --location=${REGION}
Uprawnienia
Model Armor wykonuje wywołania interfejsu API, aby wywołać usługę Sensitive Data Protection (SDP). Przyznaj tożsamości usługi Model Armor uprawnienia IAM do używania szablonów inspekcji i deidentyfikacji SDP.
Powiązywanie uprawnień z usługą Sensitive Data Protection
# grant dlp (sdp) user role to the model armor service identity
gcloud projects add-iam-policy-binding ${PROJ_ID} \
--member="serviceAccount:service-${PROJ_NO}@gcp-sa-modelarmor.iam.gserviceaccount.com" \
--role="roles/dlp.user"
Sprawdzanie uprawnień
# show iam policy for all dlp (sdp) roles on project
gcloud projects get-iam-policy ${PROJ_ID} \
--flatten="bindings[].members" \
--filter="bindings.role:roles/dlp" \
--format="table(bindings.role:label=ROLE, bindings.members:label=PRINCIPAL_IDENTITY)"
To koniec części poświęconej Model Armor… przejdźmy teraz do sekcji Autoryzacja.
6. Autoryzacja
Uprawnienia
Aby sprawdzać ruch wbudowany za pomocą Model Armor, agent usługi rozszerzeń usługi (DEP) wymaga jawnych powiązań IAM (nawet w przypadku zasobów w tym samym projekcie):
roles/modelarmor.calloutUseriroles/serviceusage.serviceUsageConsumer: przyznane w projekcie bramy, aby umożliwić wywołania inspekcji wbudowanej.roles/modelarmor.user: przyznane w projekcie szablonu, aby umożliwić dostęp do szablonów Model Armor i ich ocenę.
Powiązywanie uprawnień Model Armor
# grant model armor callout user role to dep (service extension) service agent
gcloud projects add-iam-policy-binding ${PROJ_ID} \
--member="serviceAccount:service-${PROJ_NO}@gcp-sa-dep.iam.gserviceaccount.com" \
--role="roles/modelarmor.calloutUser"
# grant service usage consumer role to dep (service extension) service agent
gcloud projects add-iam-policy-binding ${PROJ_ID} \
--member="serviceAccount:service-${PROJ_NO}@gcp-sa-dep.iam.gserviceaccount.com" \
--role="roles/serviceusage.serviceUsageConsumer"
# grant model armor user role to dep (service extension) service agent
gcloud projects add-iam-policy-binding ${PROJ_ID} \
--member="serviceAccount:service-${PROJ_NO}@gcp-sa-dep.iam.gserviceaccount.com" \
--role="roles/modelarmor.user"
Sprawdzanie uprawnień
# show iam policy on project for dep (service extension) service agent
gcloud projects get-iam-policy ${PROJ_ID} \
--flatten="bindings[].members" \
--filter="bindings.members:serviceAccount:service-${PROJ_NO}@gcp-sa-dep.iam.gserviceaccount.com" \
--format="table(bindings.members:label=PRINCIPAL_IDENTITY, bindings.role:label=ROLE)"
Rozszerzenie autoryzacji
Konfiguracja rozszerzenia autoryzacji dla bramy agentów określa ustawienia integracji, które będą stosowane do przychodzącego i wychodzącego ruchu ładunku. Konfiguracja definiuje zewnętrzną usługę przetwarzania (service), która odwołuje się do regionalnego interfejsu Model Armor API i łączy się z konkretnymi szablonami żądań i odpowiedzi za pomocą pola metadanych model_armor_settings.
Tworzenie rozszerzenia autoryzacji
# create authz extension config file (enforced mode)
cat > cfg/${AGW_NAME}-svc-ext-authz-modar.yaml <<EOF
name: ${AGW_NAME}-svc-ext-authz-modar
service: modelarmor.${REGION}.rep.googleapis.com
metadata:
model_armor_settings: '[
{
"request_template_id": "projects/${PROJ_ID}/locations/${REGION}/templates/${AGW_NAME}-modar-req-template",
"response_template_id": "projects/${PROJ_ID}/locations/${REGION}/templates/${AGW_NAME}-modar-resp-template"
}
]'
failOpen: true
timeout: 5s
EOF
Importowanie rozszerzenia autoryzacji
# import authz extension file
gcloud service-extensions authz-extensions import ${AGW_NAME}-svc-ext-authz-modar \
--source=cfg/${AGW_NAME}-svc-ext-authz-modar.yaml \
--location=${REGION}
Weryfikowanie rozszerzenia autoryzacji
# list authz extensions
gcloud service-extensions authz-extensions list --location=${REGION}
# show authz extension details
gcloud service-extensions authz-extensions describe ${AGW_NAME}-svc-ext-authz-modar \
--location=${REGION}
Zasady dotyczące upoważnienia
Zasady autoryzacji używają profili zasad do określania typu przeprowadzanej oceny. Profile oparte na żądaniach (REQUEST_AUTHZ) oceniają nagłówki HTTP, ale ta konfiguracja używa profilu autoryzacji opartego na treści (CONTENT_AUTHZ), aby powiązać rozszerzenie Model Armor z bramą w celu dokładnego sprawdzania ładunku.
Tworzenie zasady autoryzacji
# create authz policy config file (attach dry-run authz extension)
cat > cfg/${AGW_NAME}-authz-policy-modar.yaml <<EOF
name: ${AGW_NAME}-authz-policy-modar
target:
resources:
- "projects/${PROJ_ID}/locations/${REGION}/agentGateways/${AGW_NAME}"
policyProfile: CONTENT_AUTHZ
action: CUSTOM
customProvider:
authzExtension:
resources:
- "projects/${PROJ_ID}/locations/${REGION}/authzExtensions/${AGW_NAME}-svc-ext-authz-modar"
EOF
Importowanie zasady autoryzowania
# import authz policy config file (enable authz policy)
gcloud beta network-security authz-policies import ${AGW_NAME}-authz-policy-modar \
--source=cfg/${AGW_NAME}-authz-policy-modar.yaml \
--location=${REGION}
Sprawdzanie zasady autoryzowania
# list authz policies
gcloud beta network-security authz-policies list --location=${REGION}
# show authz policy details
gcloud beta network-security authz-policies describe ${AGW_NAME}-authz-policy-modar \
--location=${REGION}
To kończy część dotyczącą autoryzacji. Przejdźmy teraz do sekcji Baza kodu.
7. Baza kodu
Kod agenta i dane plików używane w tym ćwiczeniu są przechowywane w zdalnym repozytorium GitHub w Google Cloud. W ramach tych czynności repozytorium zostanie sklonowane lokalnie, niezbędne pliki zostaną skopiowane do bieżącej struktury katalogów roboczych, a następnie pliki tymczasowe zostaną usunięte.
Pobieranie artefaktów zdalnych
# clone remote repository to temp local dir
git clone https://github.com/GoogleCloudPlatform/cloud-networking-solutions.git ./temp_agw_cuj_arun_ingress_modar
# copy agent runtime and endpoint definitions to working project dir
cp -r temp_agw_cuj_arun_ingress_modar/codelabs/agw-cuj-arun-ingress-modar/agent-crm ./agent-crm
# remove temporary directory
rm -rf temp_agw_cuj_arun_ingress_modar
Środowisko wykonawcze Agent Runtime używa zasobnika pamięci masowej do przesyłania, tworzenia i wdrażania spakowanego kodu aplikacji agenta i jego artefaktów zależności.
Tworzenie zasobnika na dane na potrzeby etapu przejściowego
# create storage bucket
gcloud storage buckets create gs://${STAGING_BUCKET} --location=${REGION}
Weryfikowanie zasobnika pamięci
# list storage buckets
gcloud storage buckets list --format="value(storage_url)"
To kończy część dotyczącą bazy kodu… przejdźmy teraz do sekcji Dane klientów GCS.
Dane klienta
utworzyć zasobnik Cloud Storage do przechowywania danych klientów; Agent będzie odczytywać dane bezpośrednio przy użyciu standardowej biblioteki klienta Google Cloud, wywołując punkt końcowy MCP Cloud Storage.
Tworzenie zasobnika na dane klientów
# create storage bucket
gcloud storage buckets create gs://${DATA_BUCKET} --location=${REGION}
Weryfikowanie zasobnika pamięci
# list storage buckets
gcloud storage buckets list --format="value(storage_url)"
Prześlij dane klientów
# copy local data to bucket
gcloud storage cp -r ./agent-crm/data/* gs://${DATA_BUCKET}/
Weryfikowanie danych klientów
# list bucket objects
gcloud storage ls gs://${DATA_BUCKET}/ --long
To kończy część dotyczącą danych klientów GCS… przejdźmy teraz do sekcji agenta ADK.
8. Agent ADK
agent-crm Agent ADK wdrożony w środowisku wykonawczym usługi Agent Platform jest skonfigurowany w skrypcie wdrażania za pomocą tych ustawień, aby zintegrować go z usługą Agent Platform:
"identity_type": types.IdentityType.AGENT_IDENTITYudostępnić agentowi unikalną tożsamość podmiotu zabezpieczeń opartą na SPIFFE,"client_to_agent_config": {"agent_gateway": "${AGW_URI}"}– kierowanie całego ruchu przychodzącego do agenta na ścieżkę oceny zasad i egzekwowania zasad bramy agentów.
Agentowi przekazywany jest też adres URL serwera mTLS MCP dla serwera Cloud Storage MCP oraz nazwa zasobnika danych, aby wywołać narzędzie GCS MCP za pomocą bezpiecznego połączenia.
Wdrażanie agenta
# deploy agent
uv --directory agent-crm 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 customer data" \
--mcp-server-url="${MCP_URL}" \
--data-bucket=${DATA_BUCKET} \
--enable-telemetry \
--enable-agent-identity \
--agent-gateway-ingress=${AGW_URI} \
--allow-token-sharing
Sprawdzanie wdrożenia
Pobieranie parametrów życiowych wdrożenia
# fetch agent runtime (reasoning engine) resource 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 \
--project=${PROJ_ID} --location=${REGION} --filter="displayName=${RE_AGENT_NAME}" \
--format="value(attributes.'agentregistry.googleapis.com/system/RuntimeIdentity'.principal)")
echo ${RE_AGENT_IDENTITY}
Sprawdzanie konfiguracji bramy
# show agent runtime config details (gateway config)
curl -s -X GET "https://${REGION}-aiplatform.googleapis.com/v1/projects/${PROJ_ID}/locations/${REGION}/reasoningEngines/${RE_ENGINE_ID}" \
-H "Authorization: Bearer $(gcloud auth application-default print-access-token)" \
| jq '{displayName: .displayName, name: .name, effectiveIdentity: .spec.effectiveIdentity, agentGatewayConfig: .spec.deploymentSpec.agentGatewayConfig}'
Uprawnienia
Powiązywanie zasad uprawnień z tożsamością agenta
# grant mcp tool user role to agent set (all agent runtime agents in project)
gcloud projects add-iam-policy-binding ${PROJ_ID} \
--member="${RE_AGENT_ID_SET}" \
--role="roles/mcp.toolUser"
# grant storage object viewer role to agent identity
gcloud projects add-iam-policy-binding ${PROJ_ID} \
--member="${RE_AGENT_IDENTITY}" \
--role="roles/storage.objectViewer"
# grant aiplatform user role to agent identity
gcloud projects add-iam-policy-binding ${PROJ_ID} \
--member="${RE_AGENT_IDENTITY}" \
--role="roles/aiplatform.user"
# grant cloudtrace agent role to agent identity
gcloud projects add-iam-policy-binding ${PROJ_ID} \
--member="${RE_AGENT_IDENTITY}" \
--role="roles/cloudtrace.agent"
# grant cloud monitoring metric writer role to agent identity
gcloud projects add-iam-policy-binding ${PROJ_ID} \
--member="${RE_AGENT_IDENTITY}" \
--role="roles/monitoring.metricWriter"
# grant cloud logging log writer role to agent identity
gcloud projects add-iam-policy-binding ${PROJ_ID} \
--member="${RE_AGENT_IDENTITY}" \
--role="roles/logging.logWriter"
# grant telemetry writer role to agent identity
gcloud projects add-iam-policy-binding ${PROJ_ID} \
--member="${RE_AGENT_IDENTITY}" \
--role="roles/telemetry.writer"
# grant service usage consumer role to agent identity
gcloud projects add-iam-policy-binding ${PROJ_ID} \
--member="${RE_AGENT_IDENTITY}" \
--role="roles/serviceusage.serviceUsageConsumer"
# grant browser role to agent identity
gcloud projects add-iam-policy-binding ${PROJ_ID} \
--member="${RE_AGENT_IDENTITY}" \
--role="roles/browser"
Sprawdzanie uprawnień
# show agent identity roles on project
gcloud projects get-iam-policy ${PROJ_ID} \
--flatten="bindings[].members" \
--filter="bindings.members:${RE_AGENT_IDENTITY}" \
--format="table(bindings.members.sub('^.*locations/', 'principal://agents.[...]/locations/'):label=PRINCIPAL_IDENTITY, bindings.role:label=ROLE)"
# show agent set roles on project
gcloud projects get-iam-policy ${PROJ_ID} \
--flatten="bindings[].members" \
--filter="bindings.members:${RE_AGENT_ID_SET}" \
--format="table(bindings.members.sub('^.*platformContainer/', 'principalSet://agents.[...]/'):label=PRINCIPAL_IDENTITY, bindings.role:label=ROLE)"
To kończy część dotyczącą agenta pakietu ADK. Przejdźmy teraz do sekcji Test.
9. Test
Przesyłanie zapytań z interfejsu wiersza poleceń
Testowanie bezpiecznego prompta
# post query to agent streamQuery
curl --no-buffer -s -X POST "https://${REGION}-aiplatform.googleapis.com/v1beta1/projects/${PROJ_ID}/locations/${REGION}/reasoningEngines/${RE_ENGINE_ID}:streamQuery" \
-H "Authorization: Bearer $(gcloud auth application-default print-access-token)" \
-H "Content-Type: application/json" -H "X-Goog-User-Project: ${PROJ_ID}" \
-d @- <<EOF | jq -r --unbuffered 'if type == "array" then .[] else . end | select(.content.parts != null) | .content.parts[].text // empty'
{
"input": {
"message": "what are the names of our west customers?",
"user_id": "test-user"
}
}
EOF
Powinna pojawić się odpowiedź podobna do tej: „Nasi klienci z zachodu to: Jan Kowalski i Alicja Nowak”.
Testowanie aktywatora pomijania
# post query to agent streamQuery
curl --no-buffer -s -X POST "https://${REGION}-aiplatform.googleapis.com/v1beta1/projects/${PROJ_ID}/locations/${REGION}/reasoningEngines/${RE_ENGINE_ID}:streamQuery" \
-H "Authorization: Bearer $(gcloud auth application-default print-access-token)" \
-H "Content-Type: application/json" -H "X-Goog-User-Project: ${PROJ_ID}" \
-d @- <<EOF | jq -r --unbuffered 'if type == "array" then .[] else . end | select(.content.parts != null) | .content.parts[].text // empty'
{
"input": {
"message": "what are ssn's for bob johnson and alice brown?",
"user_id": "test-user"
}
}
EOF
Przetestuj inny bezpieczny prompt
# post query to agent streamQuery
curl --no-buffer -s -X POST "https://${REGION}-aiplatform.googleapis.com/v1/projects/${PROJ_ID}/locations/${REGION}/reasoningEngines/${RE_ENGINE_ID}:streamQuery" \
-H "Authorization: Bearer $(gcloud auth application-default print-access-token)" \
-H "Content-Type: application/json" -H "X-Goog-User-Project: ${PROJ_ID}" \
-d @- <<EOF | jq -r --unbuffered 'if type == "array" then .[] else . end | select(.content.parts != null) | .content.parts[].text // empty'
{
"input": {
"message": "what are bob johnson's and alice brown's email addresses?",
"user_id": "test-user"
}
}
EOF
Logi kontrolne
Wyświetlanie logów śledzenia
Gdy telemetria jest włączona, środowisko wykonawcze agenta przesyła strumieniowo zdarzenia strukturalne reprezentujące zapytania użytkowników, parametry narzędzi, przepływy wykonania i dane wyjściowe wyboru modelu.
# show agent runtime (reasoning engine) telemetry and trace logs
gcloud logging read \
"logName:\"projects/${PROJ_ID}/logs/aiplatform.googleapis.com%2Freasoning_engine_stdout\" AND labels.managed-by=\"reasoning-engine\"" \
--project=${PROJ_ID} \
--limit=15 \
--format="table(
timestamp.date(format=\"%I:%M:%S %p\", tz=LOCAL):label=TIME,
trace.basename().sub('^(.{8}).*$', '\\1'):label=TRACE_ID,
labels.\"event.name\".scope(-1):label=EVENT,
jsonPayload.content.role:label=ROLE,
jsonPayload.content.parts[0].text:label=TEXT_CONTENT,
jsonPayload.content.parts[0].function_call.name:label=TOOL_CALL
)"
TRACE_ID grupuje zapytanie użytkownika, wywołania narzędzi pośrednich i decyzje modelu w jednej osi czasu:
TIME TRACE_ID EVENT ROLE TEXT_CONTENT TOOL_CALL
HH:MM:SS PM 3070a1fd gen_ai.choice model Bob Johnson's SSN is 219-45-7895.
Alice Brown's SSN is 219-45-7896.
HH:MM:SS PM 3070a1fd gen_ai.user.message user
HH:MM:SS PM 3070a1fd gen_ai.user.message model read_customer_file
HH:MM:SS PM 3070a1fd gen_ai.user.message user
HH:MM:SS PM 3070a1fd gen_ai.user.message model read_customer_file
HH:MM:SS PM 3070a1fd gen_ai.user.message user
HH:MM:SS PM 3070a1fd gen_ai.user.message model list_customer_files
HH:MM:SS PM 3070a1fd gen_ai.user.message user what are ssn's for bob johnson and alice brown?
HH:MM:SS PM 3070a1fd gen_ai.system.message
HH:MM:SS PM 3070a1fd gen_ai.choice model read_customer_file
Wyświetlanie logów usuwania informacji z Model Armor
Te logi pokazują w czasie rzeczywistym dwukierunkowe zagrożenia w tekście i czyszczenie wykonywane przez Model Armor w miarę przepływu ruchu przez bramę agentów.
# show model armor logs
gcloud logging read \
"logName:\"projects/${PROJ_ID}/logs/modelarmor.googleapis.com%2Fsanitize_operations\"" \
--project=${PROJ_ID} \
--limit=50 \
--format="table(
timestamp.date(format=\"%I:%M:%S %p\", tz=LOCAL):label=TIME,
jsonPayload.sanitizationResult.sanitizationVerdict:label=VERDICT,
jsonPayload.sanitizationInput.byteItem.byteData.decode(base64).decode(utf-8).sub('\n', ' \\\\\\\\n ').trailoff(123):label=INPUT_DATA
)"
Zwróć uwagę na wpis logu dotyczący oczyszczonego i zablokowanego żądania.
TIME VERDICT INPUT_DATA
HH:MM:SS PM MODEL_ARMOR_SANITIZATION_VERDICT_ALLOW Bob Johnson's email address is bob.j@example.com. \n Alice Brown's email address is alice.b...
HH:MM:SS PM MODEL_ARMOR_SANITIZATION_VERDICT_ALLOW what are bob johnson's and alice brown's email addresses?
HH:MM:SS PM MODEL_ARMOR_SANITIZATION_VERDICT_BLOCK 6��
HH:MM:SS PM MODEL_ARMOR_SANITIZATION_VERDICT_ALLOW what are ssn's for bob johnson and alice brown?
HH:MM:SS PM MODEL_ARMOR_SANITIZATION_VERDICT_ALLOW Our west customers are: Bob Johnson and Alice Brown.
HH:MM:SS PM MODEL_ARMOR_SANITIZATION_VERDICT_ALLOW what are the names of our west customers?
To koniec części testowej. Przejdź do sekcji Czyszczenie.
10. Czyszczenie
# remove agent iam bindings
gcloud -q projects remove-iam-policy-binding ${PROJ_ID} --member="${RE_AGENT_IDENTITY}" --role="roles/storage.objectViewer"
gcloud -q projects remove-iam-policy-binding ${PROJ_ID} --member="${RE_AGENT_IDENTITY}" --role="roles/aiplatform.user"
gcloud -q projects remove-iam-policy-binding ${PROJ_ID} --member="${RE_AGENT_IDENTITY}" --role="roles/cloudtrace.agent"
gcloud -q projects remove-iam-policy-binding ${PROJ_ID} --member="${RE_AGENT_IDENTITY}" --role="roles/monitoring.metricWriter"
# next
# remove more agent and agent set iam bindings
gcloud -q projects remove-iam-policy-binding ${PROJ_ID} --member="${RE_AGENT_IDENTITY}" --role="roles/logging.logWriter"
gcloud -q projects remove-iam-policy-binding ${PROJ_ID} --member="${RE_AGENT_IDENTITY}" --role="roles/telemetry.writer"
gcloud -q projects remove-iam-policy-binding ${PROJ_ID} --member="${RE_AGENT_IDENTITY}" --role="roles/serviceusage.serviceUsageConsumer"
gcloud -q projects remove-iam-policy-binding ${PROJ_ID} --member="${RE_AGENT_IDENTITY}" --role="roles/browser"
# next
# remove rest of iam bindings
gcloud -q projects remove-iam-policy-binding ${PROJ_ID} --member="${RE_AGENT_ID_SET}" --role="roles/mcp.toolUser"
gcloud -q projects remove-iam-policy-binding ${PROJ_ID} --member="serviceAccount:service-${PROJ_NO}@gcp-sa-modelarmor.iam.gserviceaccount.com" --role="roles/dlp.user"
# next
# delete agent runtime (reasoning engine) 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)" \
-H "Content-Type: application/json"
# next
# delete storage
gcloud -q storage rm --recursive gs://${STAGING_BUCKET}
gcloud -q storage rm --recursive gs://${DATA_BUCKET}
# next
# delete authz resources
gcloud -q beta network-security authz-policies delete ${AGW_NAME}-authz-policy-modar --location=${REGION}
gcloud -q beta service-extensions authz-extensions delete ${AGW_NAME}-svc-ext-authz-modar --location=${REGION} --async
# next
# remove dep (service extensions) service agent iam bindings
gcloud -q projects remove-iam-policy-binding ${PROJ_ID} \
--member="serviceAccount:service-${PROJ_NO}@gcp-sa-dep.iam.gserviceaccount.com" \
--role="roles/modelarmor.calloutUser"
gcloud -q projects remove-iam-policy-binding ${PROJ_ID} \
--member="serviceAccount:service-${PROJ_NO}@gcp-sa-dep.iam.gserviceaccount.com" \
--role="roles/serviceusage.serviceUsageConsumer"
gcloud -q projects remove-iam-policy-binding ${PROJ_ID} \
--member="serviceAccount:service-${PROJ_NO}@gcp-sa-dep.iam.gserviceaccount.com" \
--role="roles/modelarmor.user"
# next
# delete model armor templates
gcloud -q model-armor templates delete ${AGW_NAME}-modar-resp-template --location=${REGION}
gcloud -q model-armor templates delete ${AGW_NAME}-modar-req-template --location=${REGION}
# unset model armor api endpoint override
gcloud config unset api_endpoint_overrides/modelarmor
# next
# delete sdp (dlp) templates
curl -fsS -X DELETE "https://dlp.googleapis.com/v2/projects/${PROJ_ID}/locations/${REGION}/deidentifyTemplates/agw-ssn-redaction-template" \
-H "Authorization: Bearer $(gcloud auth application-default print-access-token)" \
-H "x-goog-user-project: ${PROJ_ID}"
curl -fsS -X DELETE "https://dlp.googleapis.com/v2/projects/${PROJ_ID}/locations/${REGION}/inspectTemplates/agw-ssn-inspect-template" \
-H "Authorization: Bearer $(gcloud auth application-default print-access-token)" \
-H "x-goog-user-project: ${PROJ_ID}"
# next
# delete agent gateway ingress
gcloud -q network-services agent-gateways delete ${AGW_NAME} --location=${REGION} --async
# end
To koniec części poświęconej czyszczeniu. Przejdź do sekcji Podsumowanie.
11. Podsumowanie
Gratulacje! Udało Ci się wdrożyć bramę agentów i zarządzać ruchem przychodzącym do agenta AI.

Cosmopup uważa, że Codelabs są super!
Co dalej?
- Zaawansowane funkcje i samouczki znajdziesz w dokumentacji Gemini Enterprise Agent Platform.
- Skonfiguruj bariery Model Armor w bramie agentów, aby zwiększyć bezpieczeństwo AI.
- Poznaj zasady zarządzania semantycznego, aby egzekwować reguły biznesowe i zgodność w przypadku zapytań w języku naturalnym.
Jeśli masz jakieś uwagi, pytania lub poprawki, możesz je przesłać za pomocą tego formularza opinii.
Dziękujemy!