Agent Platform Architecture
GoogleOfficialPublished by Google
- Skill
- Tool integration
- Cloud and DevOps
- Apache-2.0
- Low risk
AutoGineer summary
Written by AutoGineer from the skill’s own files, not by the author
This skill provides a structured framework for architecting and managing enterprise Gemini platform environments. It covers multi-project hierarchies, secure network connectivity via Agent Connectivity Templates (ACT), and advanced governance using Unified Access Policies (UAP) and Model Armor. It is designed for engineers building scalable, zero-trust agent platforms that require specific egress patterns, identity management, and cross-cloud integration.
What it does
- Designs multi-project hierarchies including Host, Governance Hub, and Runtime Spokes.
- Configures Agent Connectivity Templates for ALL_TRAFFIC or PRIVATE_RANGES_ONLY egress.
- Implements security guardrails using Model Armor and Unified Access Policies (UAP V2).
- Sets up identity and token exchange using SPIFFE and 3P IdP integration.
- Manages Day-2 lifecycle operations for agent runtimes and connectivity templates.
- Validates architecture through a structured 3-phase deployment and audit process.
When to use it
- When designing the network and security topology for a new enterprise Gemini platform.
- When configuring secure egress and ingress patterns for agent-to-service communication.
- When implementing cross-project governance and identity boundaries.
- When troubleshooting connectivity or policy enforcement issues in a Gemini platform stack.
Advantages
- Provides a standardized, repeatable approach to complex platform architecture.
- Ensures adherence to zero-trust principles and least-privilege IAM.
- Reduces configuration drift through clear, domain-specific reference manuals.
- Supports complex requirements like hybrid mTLS and cross-cloud egress hubs.
Usage examples
- “Design a multi-project hierarchy for a Gemini platform with a central governance hub and separate runtime spokes.”
- The agent will outline the project structure, VPC layout, and IAM bootstrap requirements for the requested hierarchy.
- “How do I configure an Agent Connectivity Template for ALL_TRAFFIC egress?”
- The agent will provide the specific YAML manifest and CLI commands to configure the ACT with the required egress mode.
Install
Download the skill as a ZIP:
https://mp-staging.autogineer.com/agent-skills/google/agent-platform-architecture/downloadUnzip it into the cross-client skills folder of your project:
mkdir -p .agents/skills && unzip agent-platform-architecture.zip -d .agents/skills
Documentation by Google
Gemini platform Architecture and Engineering Guide
This skill is the reference system for designing, engineering, and validating enterprise-grade Gemini platform architectures across multi-project hierarchies, hybrid/cross-cloud networks, zero-trust identity boundaries, and inline safety/policy enforcement planes.
Usage Attribution
MUST READ: Before executing any gcloud, REST API, or MCP command, you
MUST read and follow the instructions in
Usage Attribution.
[!IMPORTANT] Architectural Scope and Reference Discipline: Use
SKILL.mdto select the target topology, egress mode, ingress pattern, and governance plane, then consult the authoritativereferences/*.mdmanual for exact CLI commands, REST/YAML schemas, Common Expression Language (CEL) expressions, and Python Agent Development Kit (ADK) runtime code (references/*.mdis the single source of truth for all implementation syntax). When remote Model Context Protocol (MCP) tools (such as the Google Developer Knowledge MCP server or Google-managed MCP endpoints) are available, prefer remote MCP tool invocation over raw CLI/REST commands. Do not execute unrequested live mutations against customer projects when asked for architectural designs.
[!CAUTION] Human Approval Gate for Sensitive Operations: Always prompt the user for explicit confirmation before executing commands or applying configurations that grant permissive Identity and Access Management (IAM) bindings (
roles/iap.egressor,roles/compute.networkUser,roles/networkservices.admin), modify Organization Policies (constraints/iam.managed.disableAccessPolicyBinding), update Unified Access Policy (UAP) or VPC Service Controls (VPC-SC) policies, or delete resources (RESTDELETE ...?force=trueor CLI--quiet).
Prerequisites, Authentication, Region, and Billing Setup
Google Cloud SDK, Authentication, and Project Setup:
Install the Google Cloud SDK (
gcloud) and authenticate CLI and Application Default Credentials (gcloud auth login && gcloud auth application-default login, or setGOOGLE_APPLICATION_CREDENTIALS).Select or create the target project (
gcloud projects create {project_id}/gcloud config set project {project_id}), set the default region (gcloud config set compute/region {region}, defaulting tous-central1; see Google Cloud Locations), and enable required APIs:gcloud services enable aiplatform.googleapis.com agentregistry.googleapis.com \ agentidentity.googleapis.com agentidentitycredentials.googleapis.com \ networkservices.googleapis.com networksecurity.googleapis.com iap.googleapis.com \ modelarmor.googleapis.com compute.googleapis.com dns.googleapis.com \ certificatemanager.googleapis.com servicenetworking.googleapis.com
Billing, Least-Privilege IAM, and Product Terminology:
Verify an active billing account is attached (
gcloud billing projects describe {project_id} --format="value(billingEnabled)") across{host_project_id},{gov_project_id},{runtime_project_id}, and{mcp_project_id}(required even when evaluating free-tier allowances; review Google Cloud Pricing).Grant explicit least-privilege IAM roles (
roles/aiplatform.user,roles/networkservices.admin,roles/compute.networkAdmin,roles/compute.networkUser,roles/iap.egressor, or a custom role withnetworkservices.agentGateways.get,networkservices.agentGateways.use,networkservices.operations.get) rather than primitiveroles/ownerorroles/editor.Use approved product names: Gemini platform, Agent Runtime (
reasoningEngines), Agent Gateway (240.0.0.2:443), Agent Connectivity Template (ACT), Agent Registry, and Unified Access Policy (UAP Policy V2) / Semantic Governance Policy (SGP).
3-Phase Architect Workflow and Decision Tree
graph TD
Start["Enterprise Gemini platform Architecture"] --> Q1{"1. Egress Destinations?"}
Q1 -->|"RFC 1918 + Google APIs Only"| Priv["ACT: vpcEgress = PRIVATE_RANGES_ONLY<br/>• Direct Private Google Access (PGA)"]
Q1 -->|"Public Internet, VPC-SC, or Non-RFC 1918 PUPI"| All["ACT: vpcEgress = ALL_TRAFFIC<br/>• 100% Egress via AGW VIP 240.0.0.2:443<br/>• Consolidate Core Google APIs FQDNs"]
All --> Q2{"2. Layer 7 URL List or Cross-Cloud mTLS?"}
Q2 -->|"No (Standard NAT)"| Nat["Direct Cloud NAT on PSC-I Subnet<br/>• ENDPOINT_TYPE_VM,ENDPOINT_TYPE_SWG"]
Q2 -->|"Yes (Next-Hop SWP)"| Swp["Next-Hop SWP (NEXT_HOP_ROUTING_MODE) + PBR<br/>• Internal and Google API DEFAULT_ROUTING bypasses<br/>• Default route via SWP ILB IP<br/>• Exclude PSC-I from manual Cloud NAT"]Phase 1 — Scope Verification and Architecture Discovery:
Scope Boundaries and Single-Region Discovery: Decline generic Google Cloud IAM/Compute/Storage debugging unrelated to the Gemini platform stack or requests to run broad multi-region live project scanning loops, pointing instead to
gcloud ai reasoning-engines list --region={region}.Architecture Design and Engineering: Identify the project hierarchy (
Host,Governance Hub,Runtime Spoke,Tool/MCP Spoke), egress mode (ALL_TRAFFICvsPRIVATE_RANGES_ONLY), policy plane (UAP V2, SGP, Model Armor), and target output format (topology specification,gcloudCLI commands, or REST/YAML manifests).
Phase 2 — Draft Architecture Plan and Resource Mapping:
Synthesize the topology diagram, project/VPC layout, IAM bootstrap matrix, and security controls using the Domain Router and Symptom Matrix, and map each manual's canonical REST/YAML schema and CLI commands into the target deployment artifacts.
Phase 3 — Post-Deployment and Audit Log Verification:
Pair every architecture design with the Post-Deployment and Cloud Audit Log Verification checklist (
references/topologies_and_project_layouts.md) and runtime query validation (references/agent_runtime_and_identity.md).
Domain Router and Symptom Matrix
Each reference manual in references/ is the single source of truth for its
domain's CLI commands, REST/YAML schemas, quotas, and CEL expressions. Always
read the corresponding reference manual before generating configurations or
answering domain-specific questions:
| Architecture Domain | Topics and Architectural Decisions Covered | Symptoms and Failure Modes Routed Here | Canonical Reference Manual |
|---|---|---|---|
| 1. Project Hierarchy, Shared VPC, VPC-SC, and Custom Routing | Multi-project separation (Host, Governance Hub, Runtime Spoke, Tool/MCP Spoke), PSC-I subnet sizing, cross-project Service Agent IAM bootstrap, VPC-SC perimeters, non-RFC 1918 PUPI/peered custom route exchange, and post-deployment Cloud Audit Log verification. | PSC-I IP exhaustion, cross-project attachment or addressGroup permission denials, VPC-SC perimeter blocks, dropped non-RFC 1918 internal routes, or post-deployment verification. | references/topologies_and_project_layouts.md |
| 2. Agent Connectivity Template (ACT) and Agent Gateway | Choosing ALL_TRAFFIC vs PRIVATE_RANGES_ONLY, ACT and Agent Gateway REST/YAML schemas, control-plane URI formatting, registry attachment limits, and container custom Root CA bundle trust. | Control-plane URI validation errors, registry attachment limit errors, or container TLS verification failures ([SSL: UNEXPECTED_EOF_WHILE_READING]). | references/agent_gateway_and_act.md |
| 3. Outbound Routing, Next-Hop SWP, PBR, and Hybrid mTLS | Source-range Policy-Based Routes (PBR) for PSC-I subnets, Next-Hop Secure Web Proxy (NEXT_HOP_ROUTING_MODE), swg-autogen-nat vs manual Cloud NAT coexistence, gRPC/A2A/WebSocket routing, Spanner SA impersonation, and Cross-Cloud mTLS Egress Hubs (Hybrid NEG). | Asymmetric return-routing drops between manual Cloud NAT and swg-autogen-nat, outbound URL filtering on PSC-I interfaces, or cross-cloud mTLS origination over Cloud Interconnect/VPN. | references/egress_routing_and_swp.md |
| 4. Ingress ALB, URL Rewrites, Private CA, and 3P IdP STS | Two-Tier and Single-Tier ALB ingress with URL Map hostRewrite/pathPrefixRewrite, Private CA TrustConfig with Regional Internal ALB + Serverless NEG for Cloud Run MCP servers, and 3P IdP (EntraID/Ping/Okta) token exchange via LbTrafficExtension (ext_proc + STS). | WebPKI root stripping (NO_ADDITIONAL_ROOTS), empty :authority drops on Serverless NEGs, *.run.app Google-managed certificate mismatches, or OAuth/IAP header collisions. | references/ingress_patterns_and_rewrites.md |
| 5. UAP Policy V2, IAP V1, SGP, and Model Armor Governance | Organization/Folder/Project UAP Policy V2 and IAP V1 CEL authorization rules, Semantic Governance Policy (SGP CONTENT_AUTHZ), custom AuthzExtension / AuthzPolicy targets, and fail-closed Model Armor Floor Settings, templates, and ADK callbacks. | Egress request is not authorized (HTTP 403 / status.code=7) on MCP initialize or tools/list, failed to parse the service URL on AuthzExtension, binary gRPC parser crashes, or fail-open safety bypasses. | references/governance_security_policies.md |
6. Agent Registry, Consolidated googleapis, and Federation | Consolidating core Google APIs FQDNs into a single googleapis service (ALL_TRAFFIC), registering MCP/A2A/REST services, extracting server-generated registryResource UUIDs for roles/iap.egressor, and Event-Driven Spoke-to-Hub Registry Federation. | ALL_TRAFFIC agent startup or telemetry blackholing, IAM binding target mismatches on Registry resources, OpenAPI/MCP spec size rejections, or multi-project catalog drift. | references/registry_and_federation.md |
| 7. ADK Runtime Packaging, Agent Identity, and Day-2 Operations | Packaging ADK agents with AGENT_IDENTITY (SPIFFE) and Auth Manager, regional residency, BigQuery pre-execution cost guards, in-place ACT updates, reverse-dependency teardown, and external Cloud NAT IP verification. | Raw credential exposure, HTTP 409 ABORTED control-plane mutex locks, HTTP 400 FAILED_PRECONDITION (FROM_AGENT_GATEWAY* or contains child resources: sessions), or X-Forwarded-For: 0.0.0.0 when probing *.run.app. | references/agent_runtime_and_identity.md |
Supporting Public Documentation Links
Files
- ATTRIBUTION.mdAdded by AutoGineer852 B
- LICENSELicence file added by AutoGineer11.1 KiB
- SKILL.md14.4 KiB
- references/agent_gateway_and_act.md14.7 KiB
- references/agent_runtime_and_identity.md27.8 KiB
- references/attribution.md1.9 KiB
- references/egress_routing_and_swp.md22.2 KiB
- references/governance_security_policies.md30.2 KiB
- references/ingress_patterns_and_rewrites.md25.5 KiB
- references/registry_and_federation.md19.6 KiB
- references/topologies_and_project_layouts.md31.6 KiB
references/egress_routing_and_swp.md
Egress Architecture: Routing, SWP, and gRPC Interception
This reference details the low-level data-plane routing mechanics for outbound traffic from Gemini platform workloads, focusing on Policy-Based Routing, Secure Web Proxy next-hop mode, and non-HTTP/2 gRPC traversal.
Table of Contents
1. Outbound Interception Pipeline (
ALL_TRAFFIC): Lines 22-542. Policy-Based Routing (PBR) vs Static Routes: Lines 55-128
3. Secure Web Proxy (SWP) NEXT_HOP_ROUTING_MODE: Lines 129-218
4. Consuming gRPC Endpoints (Spanner / Google APIs): Lines 219-248
5. Egress to Cloud Run / Cloud Functions (OIDC JWT and Header Conflict Invariant): Lines 249-293
6. Mutual TLS (mTLS) Client Certificate Management: Lines 294-312
7. Cross-Cloud and Hybrid Secure Web Proxy (SWP) mTLS Egress Hub: Lines 313-371
1. Outbound Interception Pipeline (ALL_TRAFFIC)
When the Agent Connectivity Template is set to vpcEgress: ALL_TRAFFIC,
outbound connections follow a deterministic multi-stage interception pipeline:
graph TD
Agent[Reasoning Engine Container] -->|DNS Resolution| SyntheticDNS[Synthetic Resolver]
SyntheticDNS -->|Returns 240.0.0.2| Agent
Agent -->|TCP Connect 240.0.0.2:443| AGW_Proxy[Agent Gateway Envoy Proxy]
AGW_Proxy -->|TLS SNI Inspection| SNICheck{SNI in Registry?}
SNICheck -->|No Match (Policy V1)| Drop1[Drop: default_denied<br/>UNEXPECTED_EOF_WHILE_READING]
SNICheck -->|No Match (UAP Policy V2:<br/>destination.is_registered == false)| IAPCheck{UAP / IAP Authz}
SNICheck -->|Matched (destination.is_registered == true)| IAPCheck
IAPCheck -->|Denied| Drop2[HTTP 403 / TLS Drop]
IAPCheck -->|Allowed| PSC_I[PSC Network Attachment]
PSC_I -->|Enters Consumer Subnet| PBR[Policy-Based Route (PBR)]
PBR -->|Next-Hop Forwarding| SWP[Secure Web Proxy (NEXT_HOP)]
SWP -->|Security Policy CEL| CloudNAT[Cloud NAT (Autogen)]
CloudNAT -->|Egress with Static IP| Internet[External SaaS / APIs][!NOTE] IAM Policy V1 vs. UAP Policy V2 Unregistered SNI Behavior: When the
AuthzExtensionuses legacy IAM Policy V1 (noiapPolicyVersion = "V2"), any SNI not cataloged in Agent Registry is immediately dropped at TLS termination withdefault_denied([SSL: UNEXPECTED_EOF_WHILE_READING]). WheniapPolicyVersion = "V2"is enabled, unregistered SNIs are evaluated by the IAP authorization engine against UAP rules matchingdestination.is_registered == false(usingdestination.unregistered.host,.path, and.method) before being allowed or dropped.
2. Policy-Based Routing (PBR) vs Static Routes
Standard Google Cloud VPC routing has a critical limitation when intercepting traffic from Network Attachments:
Static Route Tag Incompatibility: Static routes targeting an Internal Load Balancer (
--next-hop-ilb) require network tags (--tags). However, Private Service Connect Interfaces (PSC-I) provisioned by Google-managed tenant projects cannot have network tags attached.PSC Route Target Prohibition: Google Cloud route tables explicitly prohibit PSC forwarding rules or service attachments as next-hop targets.
The PBR Solution: Policy-Based Routing (PBR) routes traffic based on source IP range rather than network tags. By matching
--source-range=<PSCI_SUBNET_CIDR>and--destination-range=0.0.0.0/0, PBR cleanly intercepts all egress exiting the Network Attachment and directs it to the SWP internal load balancer IP.
PBR Resource Manifests
1. Internal / Peered Route Bypass (priority: 50, Evaluated First)
To prevent internal RFC 1918 or peered non-RFC 1918 PUPI (${PUPI_CIDR}) VPC
destinations from being hair-pinned into the external Secure Web Proxy, place a
higher-priority (priority: 50, lower numerical value = evaluated first)
DEFAULT_ROUTING rule ahead of the priority: 100 0.0.0.0/0 SWP catch-all:
# Canonical REST/YAML resource name requires /locations/global/policyBasedRoutes/
name: projects/${PROJECT_ID}/locations/global/policyBasedRoutes/pbr-psci-default-fallback-10
description: "Bypass SWP for RFC 1918 (10.0.0.0/8, plus priority 50 rules for 172.16.0.0/12 and 192.168.0.0/16)"
network: "projects/${PROJECT_ID}/global/networks/${VPC_NAME}"
priority: 50
filter:
protocolVersion: IPV4
srcRange: "${PSCI_SUBNET_CIDR}" # REST/YAML field is srcRange (gcloud CLI flag is --source-range); must match PSC-I Subnet CIDR (/26+, such as 10.20.1.0/26)
destRange: "10.0.0.0/8" # Pair with priority: 50 for 172.16.0.0/12 and 192.168.0.0/16, priority: 51 for ${PUPI_CIDR} (PUPI), priority: 52 for 199.36.153.8/30 (PGA), and priority: 53 for 199.36.153.4/30 (VPC-SC)
ipProtocol: ALL
nextHopOtherRoutes: DEFAULT_ROUTING2. Primary Policy-Based Route (PSC-I Public Egress to SWP, priority: 100)
name: projects/${PROJECT_ID}/locations/global/policyBasedRoutes/pbr-psci-to-swp
description: "Steer PSC-I agent public egress to Secure Web Proxy internal IP"
network: "projects/${PROJECT_ID}/global/networks/${VPC_NAME}"
priority: 100
filter:
protocolVersion: IPV4
srcRange: "${PSCI_SUBNET_CIDR}" # REST/YAML field is srcRange (gcloud CLI flag is --source-range)
destRange: "0.0.0.0/0"
ipProtocol: ALL
nextHopIlbIp: "${SWP_ILB_IP}" # Internal IP of SWP Gateway in dedicated SWP subnet (such as 10.20.2.50)export PROJECT_ID="host-vpc-proj" VPC_NAME="enterprise-shared-vpc"
export PSCI_SUBNET_CIDR="10.20.1.0/26" SWP_ILB_IP="10.20.2.50" PUPI_CIDR="198.51.100.0/24"
# For multi-VPC custom/PUPI route exchange (HOST_VPC / SPOKE_VPC peerings), see references/topologies_and_project_layouts.md Section 9.
for IDX_CIDR in "10:10.0.0.0/8" "172:172.16.0.0/12" "192:192.168.0.0/16"; do
gcloud network-connectivity policy-based-routes create "pbr-psci-rfc1918-${IDX_CIDR%%:*}" \
--project="${PROJECT_ID}" --network="projects/${PROJECT_ID}/global/networks/${VPC_NAME}" \
--source-range="${PSCI_SUBNET_CIDR}" --destination-range="${IDX_CIDR#*:}" \
--ip-protocol="ALL" --priority=50 --next-hop-other-routes="DEFAULT_ROUTING"
done
gcloud network-connectivity policy-based-routes create "pbr-psci-to-swp" \
--project="${PROJECT_ID}" --network="projects/${PROJECT_ID}/global/networks/${VPC_NAME}" \
--source-range="${PSCI_SUBNET_CIDR}" --destination-range="0.0.0.0/0" \
--ip-protocol="ALL" --priority=100 --next-hop-ilb-ip="${SWP_ILB_IP}"3. Secure Web Proxy (SWP) NEXT_HOP_ROUTING_MODE
When deploying Secure Web Proxy behind an Agent Gateway Network Attachment:
Type and Routing Mode (Transparent PBR Next-Hop vs. Explicit Proxy Mode): When SWP operates as a Transparent PBR Next-Hop (
Section 3), the Gateway resource must specifytype: SECURE_WEB_GATEWAYandroutingMode: NEXT_HOP_ROUTING_MODE(specifyingSECURE_WEB_PROXYor omittingroutingModein PBR Next-Hop mode causes import failure). Conversely, when SWP operates in Explicit Proxy / Cross-Cloud NLB Termination Mode (Section 7), omitrouting_modeand attachcertificate_urlsandserver_tls_policy.Dedicated SWP Subnet + Proxy-Only Subnet: Place the SWP Gateway instance in its own regular RFC 1918 subnet (
10.20.2.0/24, distinct from the PBR-intercepted PSC-I subnet10.20.1.0/26so SWP outbound packets are not re-intercepted by PBR), alongside a regional proxy-only subnet (sized to at least/26, such as10.20.3.0/24) withpurpose: REGIONAL_MANAGED_PROXYandrole: ACTIVE.Autogenerated Cloud NAT: SWP in
NEXT_HOP_ROUTING_MODEautomatically provisions an autogenerated router (swg-autogen-router-{network_id}) and Cloud NAT (swg-autogen-nat) withnatIpAllocateOption: AUTO_ONLYandENDPOINT_TYPE_SWG. Exclude the PSC-I subnet from any manual Cloud NAT viaLIST_OF_SUBNETWORKS(neverALL_SUBNETWORKS_ALL_IP_RANGES); outbound calls reflectswg-autogen-natIPs.
Gateway Resource Definition
name: projects/${PROJECT_ID}/locations/${REGION}/gateways/swp-egress-gateway
type: SECURE_WEB_GATEWAY
routingMode: NEXT_HOP_ROUTING_MODE
addresses: ["${SWP_ILB_IP}"]
ports: [443]
subnetwork: "projects/${PROJECT_ID}/regions/${REGION}/subnetworks/${SWP_SUBNET_NAME}"
network: "projects/${PROJECT_ID}/global/networks/${VPC_NAME}"
gatewaySecurityPolicy: "projects/${PROJECT_ID}/locations/${REGION}/gatewaySecurityPolicies/swp-security-policy"Gateway Security Policy and Rules
name: projects/${PROJECT_ID}/locations/${REGION}/gatewaySecurityPolicies/swp-security-policy
description: "Egress policy for approved agent destinations"name: projects/${PROJECT_ID}/locations/${REGION}/gatewaySecurityPolicies/swp-security-policy/rules/deny-denylisted-llms
priority: 10
basicProfile: DENY
enabled: true
sessionMatcher: "host() in ['api.openai.com', 'api.anthropic.com', 'api.cohere.ai'] || host().endsWith('.openai.com') || host().endsWith('.anthropic.com') || host().endsWith('.cohere.ai')"# GatewaySecurityPolicy enforces implicit default-DENY for all unmatched hosts; priority 100 ALLOW permits only explicit approved FQDNs:
name: projects/${PROJECT_ID}/locations/${REGION}/gatewaySecurityPolicies/swp-security-policy/rules/allow-approved-domains
priority: 100
basicProfile: ALLOW
enabled: true
sessionMatcher: "host() == 'aiplatform.googleapis.com' || host() == 'aiplatform.mtls.googleapis.com' || host() == '${REGION}-aiplatform.googleapis.com' || host() == '${REGION}-aiplatform.mtls.googleapis.com' || host() == 'aiplatform.${REGION}.rep.googleapis.com' || host() == 'agentregistry.googleapis.com' || host() == 'agentidentity.googleapis.com' || host() == 'cloudresourcemanager.mtls.googleapis.com' || host() == 'iamcredentials.mtls.googleapis.com' || host() == 'telemetry.mtls.googleapis.com' || host() == 'trace.mtls.googleapis.com' || host() == 'logging.googleapis.com' || host() == 'monitoring.googleapis.com' || host() == 'cloudtrace.googleapis.com' || host() == 'telemetry.googleapis.com' || host() == 'spanner.googleapis.com' || host() == '${CLOUD_RUN_MCP_HOST}'"gcloud network-security gateway-security-policies import swp-security-policy \
--project="${PROJECT_ID}" --location="${REGION}" --source="swp-security-policy.yaml"
gcloud network-security gateway-security-policies rules import deny-denylisted-llms \
--project="${PROJECT_ID}" --location="${REGION}" --gateway-security-policy="swp-security-policy" --source="deny-denylisted-llms.yaml"
gcloud network-security gateway-security-policies rules import allow-approved-domains \
--project="${PROJECT_ID}" --location="${REGION}" --gateway-security-policy="swp-security-policy" --source="allow-approved-domains.yaml"
gcloud network-services gateways import swp-egress-gateway \
--project="${PROJECT_ID}" --location="${REGION}" --source="swp-egress-gateway.yaml"[!IMPORTANT] Explicit Google APIs FQDNs, PGA Bypass and
.googleapis.comWildcard Prohibition: InALL_TRAFFICmode, ADK streaming queries initialize sessions viaPOST https://{region}-aiplatform.mtls.googleapis.com/.../sessions. Configure Private Cloud DNS CNAME routing for*.googleapis.comand*.run.apptoprivate.googleapis.com.(199.36.153.8/30) orrestricted.googleapis.com.(199.36.153.4/30) withpriority: 52..53DEFAULT_ROUTINGPBR bypasses so Google APIs and internal Cloud Run traffic route via Private Google Access, and list the explicit core Google APIs FQDNs,spanner.googleapis.com, and approved${CLOUD_RUN_MCP_HOST}in the SWPsessionMatcher(preceded by apriority: 10DENYrule for denylisted external LLM domains) rather than a broadhost().endsWith('.googleapis.com')wildcard. Only append external test endpoints (host() == 'api.ipify.org'orhost() == 'api.weather.gov') in non-production validation environments when running NAT reflection probes.
4. Consuming gRPC Endpoints (Spanner / Google APIs)
Google Cloud services accessed over binary gRPC (such as Spanner
spanner.googleapis.com) require special handling:
Upper-Case Protocol Binding: Google APIs accessed over gRPC must be registered in Agent Registry with
protocolBinding: GRPC(strictly uppercase). Using lowercasegrpcorJSONRPCcauses proxy rejection.Unregistered Endpoint Fallback: Agent Gateway's Envoy HTTP/2 trie does not parse arbitrary gRPC method
:pathprefixes (such as/google.spanner.v1.Spanner/CreateSession), classifying them asagentGatewayInfo: {}. To allow gRPC streams through IAP authorization without opening a broadgoogleapis.comwildcard, configure a UAP allow rule scoped to the exact gRPC service hostname:((destination.is_registered == false) && (destination.unregistered.host == 'spanner.googleapis.com')).SPIFFE Limitation on Data Plane: Spanner data-plane APIs do NOT evaluate SPIFFE URIs (
principal://agents.global.org-...), returning403 IAM_PERMISSION_DENIED. The agent workload must use Service Account Impersonation:Grant the agent container's
principalSetthe roleroles/iam.serviceAccountTokenCreatoron an intermediate service account.Grant the intermediate service account
roles/spanner.databaseUseron the Spanner database.In Python/ADK code, use Google Auth SDK
impersonated_credentials.Credentialsto mint an OAuth 2.0 token before initializing the Spanner client.
5. Egress to Cloud Run / Cloud Functions (OIDC JWT and Header Conflict Invariant)
When an agent invokes an internal MCP server hosted on Cloud Run through Agent Gateway, two authentication constraints apply:
Authorization Header Interception by Cloud Run Ingress: Google Cloud Run's front-end proxy intercepts and validates the standard
Authorization: Bearer <ID_TOKEN>header for Cloud Run IAM authentication (roles/run.invoker), stripping or rejecting it with HTTP 401/403 if an upstream user or application token is passed in that header.Workaround A (
X-Serverless-Authorization): Pass the Cloud Run IAM OIDC ID token inX-Serverless-Authorization: Bearer <IAM_ID_TOKEN>and keep upstream application/user credentials inAuthorization(or vice versa).Workaround B (Agent Identity Auth Manager): Configure Agent Identity Auth Manager to manage and inject Cloud Run invocation credentials over the wire at the Agent Gateway boundary.
Service Account Impersonation for OIDC ID Tokens: Direct egress from Agent Identity (
principalSet://...) cannot mint standard OIDC ID tokens directly; use Service Account Impersonation when minting an IAM OIDC token from ADK code:
import google.auth
from google.auth import impersonated_credentials
import google.auth.transport.requests
default_creds, project_id = google.auth.default()
target_sa = f"cloud-run-invoker@{project_id}.iam.gserviceaccount.com"
target_creds = impersonated_credentials.Credentials(
source_credentials=default_creds,
target_principal=target_sa,
target_scopes=["https://www.googleapis.com/auth/iam"],
)
id_creds = impersonated_credentials.IDTokenCredentials(
target_credentials=target_creds,
target_audience="https://custom-tool-service-xyz.a.run.app",
include_email=True,
)
id_creds.refresh(google.auth.transport.requests.Request())
headers = {"X-Serverless-Authorization": f"Bearer {id_creds.token}"}6. Mutual TLS (mTLS) Client Certificate Management
When an Agent Gateway or runtime connects to upstream internal enterprise endpoints or partner APIs requiring mTLS:
Failure Symptom: Gateway proxy load-balancer logs show connection drops or HTTP 403 errors with
jsonPayload.mtls.clientCertChainVerified: false.Root Cause: The client certificate associated with the gateway's
ClientTlsPolicyin Certificate Manager is expired, invalid, or signed by a CA untrusted by the target server.Remediation:
Inspect certificate validity and CA chain in Certificate Manager.
Issue a renewed X.509 certificate and update the target
ClientTlsPolicyresource.Ensure the destination server's trust store includes the root CA signing the gateway's client certificate.
7. Cross-Cloud and Hybrid Secure Web Proxy (SWP) mTLS Egress Hub
When routing outbound or cross-cloud agent traffic (across Cloud Interconnect or HA VPN to AWS, Azure, or on-premises endpoints) through a governed hub, enforce a two-stage egress pipeline rather than bypassing SWP:
Stage 1 — Layer 7 URL Filtering via Next-Hop SWP (
NEXT_HOP_ROUTING_MODE): Route outbound cross-cloud traffic from the Agent Gateway PSC-I subnet through Next-Hop Secure Web Proxy (via the priority100PBR rule in Section 2; do not bypass SWP with aDEFAULT_ROUTINGPBR for cross-cloud endpoints) so SWP enforces Layer 7 hostname/URL allowlisting before traffic crosses the hybrid boundary.Stage 2 — Mutual TLS Origination via
ClientTlsPolicy, Regional Internal Proxy ALB and Hybrid NEG: Forward approved traffic to a RegionalINTERNAL_MANAGEDProxy Load Balancer VIP (10.40.2.x, outside the/26PSC-I subnet), whoseBackendServiceoriginates mutual TLS using a Certificate ManagerClientTlsPolicy(andBackendAuthenticationConfig) to the Zonal Hybrid Connectivity NEG (NON_GCP_PRIVATE_IP_PORT) across Cloud Interconnect or HA VPN:
| Egress Hub Component | Resource / API Type | Mandatory Configuration Contract |
|---|---|---|
| 1. Subnets and Health-Check Firewall | compute.subnetworks + compute.firewalls | Provision a PSC-I subnet (/26, purpose=PRIVATE), a dedicated VIP/SWP subnet (10.40.2.0/24 — place the Internal ALB VIP outside the /26 PSC-I range), an active Proxy-Only subnet (10.40.10.0/23, purpose=REGIONAL_MANAGED_PROXY, role=ACTIVE), and a firewall rule allowing health checks (35.191.0.0/16,130.211.0.0/22) and the proxy-only subnet. |
| 2. Zonal Hybrid NEG | compute.networkEndpointGroups (zonal) | Create with --network="${VPC_NAME}" --network-endpoint-type=non-gcp-private-ip-port --default-port=443 and attach remote cross-cloud endpoints via --add-endpoint="ip=${REMOTE_IP},port=${REMOTE_PORT}". |
| 3. Private CA Trust Store and ACT DNS Peering | certificatemanager.trustConfigs + dnsPeeringConfig | Peer the cross-cloud Private Cloud DNS domain via the ACT's dnsPeeringConfig, and load the enterprise Private CA root PEM into TrustConfig with additionalRoots: PUBLICLY_TRUSTED_ROOTS on the ACT tlsConfig (never NO_ADDITIONAL_ROOTS in ALL_TRAFFIC mode, which strips Google API WebPKI roots). |
| 4. Inbound mTLS Validation | networksecurity.serverTlsPolicies | Set mtlsPolicy.clientValidationMode = "REJECT_INVALID" and mtlsPolicy.clientValidationTrustConfig = "projects/${PROJECT_NUMBER}/locations/${REGION}/trustConfigs/${TRUST_CONFIG}" (numeric ${PROJECT_NUMBER} required). |
| 5. Outbound mTLS Origination | networksecurity.clientTlsPolicies + backendAuthenticationConfigs | Configure a Certificate Manager ClientTlsPolicy (never embed client private keys in agent source code) and BackendAuthenticationConfig on the Next-Hop SWP -> Regional INTERNAL_MANAGED Proxy Load Balancer BackendService (--tls-settings) backed by the Hybrid NEG (NON_GCP_PRIVATE_IP_PORT). |
# 1. Create Zonal Hybrid Connectivity NEG (NON_GCP_PRIVATE_IP_PORT) for Cross-Cloud / On-Premises Endpoint
gcloud compute network-endpoint-groups create "hybrid-mtls-neg" \
--project="${PROJECT_ID}" --zone="${ZONE}" --network="${VPC_NAME}" \
--network-endpoint-type="non-gcp-private-ip-port" --default-port=8443
gcloud compute network-endpoint-groups update "hybrid-mtls-neg" \
--project="${PROJECT_ID}" --zone="${ZONE}" --add-endpoint="ip=${REMOTE_IP},port=8443"
# 2. Configure Certificate Manager ClientTlsPolicy & BackendAuthenticationConfig for Outbound mTLS Origination
cat <<EOF > client-tls-policy.yaml
name: projects/${PROJECT_ID}/locations/${REGION}/clientTlsPolicies/hybrid-mtls-client-policy
clientCertificate:
certificateProviderInstance:
pluginInstance: projects/${PROJECT_ID}/locations/${REGION}/certificates/${CLIENT_CERT_NAME}
EOF
gcloud network-security client-tls-policies import "hybrid-mtls-client-policy" \
--project="${PROJECT_ID}" --location="${REGION}" --source="client-tls-policy.yaml"
gcloud network-security backend-authentication-configs create "hybrid-mtls-auth-config" \
--project="${PROJECT_ID}" --location="${REGION}" \
--client-certificate="projects/${PROJECT_ID}/locations/${REGION}/certificates/${CLIENT_CERT_NAME}" \
--trust-config="projects/${PROJECT_ID}/locations/${REGION}/trustConfigs/${TRUST_CONFIG_NAME}" \
--well-known-roots="none"
gcloud compute backend-services create "hybrid-mtls-backend" \
--project="${PROJECT_ID}" --region="${REGION}" \
--load-balancing-scheme="INTERNAL_MANAGED" --protocol="HTTPS" --health-checks="${HC_NAME}" \
--tls-settings="sni=${REMOTE_FQDN},authenticationConfig=//networksecurity.googleapis.com/projects/${PROJECT_ID}/locations/${REGION}/backendAuthenticationConfigs/hybrid-mtls-auth-config"
gcloud compute backend-services add-backend "hybrid-mtls-backend" \
--project="${PROJECT_ID}" --region="${REGION}" \
--network-endpoint-group="hybrid-mtls-neg" --network-endpoint-group-zone="${ZONE}" \
--balancing-mode="RATE" --max-rate-per-endpoint=100Requirements and compatibility
Works with: Claude Code, Claude apps, OpenAI Codex, GitHub Copilot, Cursor, Gemini CLI, Kiro, OpenCode, Goose, Amp, Roo Code, JetBrains Junie, Factory Droid, Devin (ex-Windsurf), Mistral Vibe, OpenHands, Letta
“Works with” means the tool reads the open Agent Skills format; a skill written for one tool may use features others lack.
Needs: Needs an MCP server, Needs a command-line tool
Security
What our scanner noticed· Low risk
- Instructions that use the network
A static scan is not a guarantee. Skills are third-party content: review a skill before you let an agent use it.
Attribution and licence
- Published by
- Publisher
- Google (Official)
- Source
- google/skills · skills/cloud/agent-platform-architecture · commit 2194d3b
- Licence
- Apache License 2.0 (redistribution allowed)
- LICENSE (added by AutoGineer from LICENSE)
- ATTRIBUTION.md (written by AutoGineer)
- Synced
AutoGineer is not affiliated with or endorsed by Google.
Download ZIP
The ZIP holds the skill’s files, its licence files and an ATTRIBUTION.md. Download agent-platform-architecture.zip