Agent Observability Platform: Prerequisites (GCP)
What you need before deploying the Agent Observability data platform on GCP
This page walks through everything you need before running the installation: the right tooling, a GCP project with sufficient permissions and APIs, a deployment path, a Cloud DNS zone, Vertex AI model access, and the platform artifacts. Work through the steps in order, then run the preflight check to confirm you are ready.
1. Install the required tooling
Install the following on the machine you will run Terraform from:
| Tool | Version | Used for |
|---|---|---|
| Terraform | >= 1.7 | Provisioning the platform |
| gcloud CLI | latest | Authenticating to GCP and retrieving outputs |
| gke-gcloud-auth-plugin | latest | Cluster authentication for the kubernetes/helm providers and kubectl (gcloud components install gke-gcloud-auth-plugin) |
| kubectl | latest | Verifying the cluster after deployment β also invoked by the module itself during apply |
| Helm | 3.x | Only for the self-managed Helm path |
Authenticate the gcloud CLI to your target project before continuing:
gcloud auth application-default login
gcloud config set project <project_id>Terraform for this module requires >= 1.7 β stricter than some of our other modules. The machine also needs
bashandkubectlon thePATH: the module runsgcloud container clusters get-credentialsandkubectlcommands duringapplyto finish wiring the External Secrets Operator.
2. Prepare your GCP project
You deploy into your own GCP project. Two things must be in place: the required APIs, and sufficient IAM for the deploying identity.
Enable the required APIs
The module does not enable any APIs itself β enabling them is entirely a prerequisite. Enable at least:
| API | Why |
|---|---|
container.googleapis.com | GKE cluster and node pools |
compute.googleapis.com | VPC, subnets, Cloud Router/NAT, firewalls, Cloud Armor |
dns.googleapis.com | Cloud DNS records and zone IAM |
secretmanager.googleapis.com | ClickHouse credential secrets (also required so the Secret Manager service agent can exist for CMEK) |
cloudkms.googleapis.com | CMEK keys for GKE Secrets and Secret Manager |
networksecurity.googleapis.com | Gateway backend TLS re-encryption (BackendTLSPolicy) |
certificatemanager.googleapis.com | Gateway backend TLS re-encryption |
aiplatform.googleapis.com | Vertex AI evaluation calls from the LLM worker |
gcloud services enable \
container.googleapis.com compute.googleapis.com dns.googleapis.com \
secretmanager.googleapis.com cloudkms.googleapis.com \
networksecurity.googleapis.com certificatemanager.googleapis.com \
aiplatform.googleapis.comDeployer IAM
The identity running terraform apply needs permissions to create and manage, by category:
| Category | What the deploy creates |
|---|---|
| VPC & networking (new-VPC path) | Custom-mode VPC, node subnet with secondary ranges, a proxy-only subnet, Cloud Router + Cloud NAT, firewall rules |
| GKE | A GKE Standard cluster and node pools (including the per-zone ClickHouse and Keeper stateful pools) |
| IAM | Service accounts, project- and resource-level IAM bindings, and custom roles (the module creates two β the deployer needs iam.roles.create at the project level) |
| Cloud KMS | A key ring and CMEK keys, plus key IAM for the GKE and Secret Manager service agents |
| Secret Manager | Secrets and versions for the ClickHouse users, plus per-secret accessor grants |
| Cloud DNS | Per-zone IAM grants on your managed zone β in the DNS project, if the zone lives in a different project |
| Cloud Armor | A regional security policy for the Gateway source allow-list (when configured) |
| Kubernetes | Cluster-admin access β for a module-created cluster this comes with project-level GKE IAM; for an existing cluster your kubectl context must already have cluster-admin RBAC |
Treat this as the breadth of access the deploying identity needs, not a hand-minimized least-privilege role set.
The platform artifacts are public (Terraform Registry and Docker Hub), so no registry credentials are needed β only outbound access to Docker Hub: the helm provider pulls the ao-data-platform chart during apply, and the GKE nodes pull the ao-llm-worker image at runtime.
3. Choose your deployment path
The Terraform module supports two paths. Decide which applies before configuring it:
| Path | When to use | Additional inputs |
|---|---|---|
| New cluster | You want Terraform to create the VPC and GKE cluster. | None β uses defaults (cluster name monte-carlo, private nodes with Cloud NAT egress, Dataplane V2, Workload Identity, Gateway API enabled). |
| Existing cluster | You already run a GKE Standard cluster and want to deploy the platform into it. | cluster.existing_cluster_name, plus networking.existing_network_name, networking.existing_subnetwork_name, the names of the node subnet's secondary ranges (existing_pods_range_name / existing_services_range_name), and networking.proxy_only_cidr set to the existing proxy-only subnet's range. |
The platform requires GKE Standard. Autopilot clusters are not supported β the platform depends on dedicated, tainted node pools with zone-pinned persistent disks, which Autopilot does not allow.
Existing cluster β what the module checks and what it doesn't:
- Verified at plan/apply time: the cluster must be VPC-native with named secondary ranges, have Workload Identity enabled (pool
<project>.svc.id.goog), and have the Gateway API enabled on the standard channel. If Gateway API is missing, enable it out-of-band:gcloud container clusters update <cluster> --location <location> --gateway-api=standard.- Your responsibility: a
REGIONAL_MANAGED_PROXYproxy-only subnet in the cluster's region (the internal Gateway's Envoy fleet lives there β setnetworking.proxy_only_cidrto its range: the module creates the proxy β pod firewall rule on your VPC from it, but not the subnet itself), NAT or equivalent egress for private nodes, and a NetworkPolicy engine β module-created clusters get Dataplane V2; existing clusters must provide one, or the platform's Keeper isolation policy is silently inert.- Existing controllers: if cert-manager, the External Secrets Operator, or external-dns are already installed, set the matching
helm.install_*flag tofalse(see Installation).- Stateful node pools: the module creates the per-zone ClickHouse and Keeper node pools only on the new-cluster path β on an existing cluster it rejects the zone-topology inputs (
clickhouse_zones/keeper_zones) at plan time. See High availability.
4. Configure domains and DNS
The OpenTelemetry Collector and ClickHouse are exposed through a single internal GKE Gateway with DNS names and publicly trusted TLS. Decide on:
- A domain for the OpenTelemetry Collector endpoint (e.g.
otel.acme.com) β passed asotel_collector_domain - A domain for the ClickHouse endpoint (e.g.
clickhouse.acme.com) β passed asclickhouse_domain - A Cloud DNS managed zone already serving those domains β passed by zone name (e.g.
acme-com, notacme.com.) asdns_zone
Unlike some clouds, the DNS zone is not optional here: whenever the module deploys the chart, clickhouse_domain, otel_collector_domain, and dns_zone are all required β TLS certificates are issued by Let's Encrypt via DNS-01 validation against the zone, so there is no manual-DNS fallback on the module-managed path.
Two related settings:
dns_zone_projectβ set this if the zone lives in a different project than the cluster; the module grants the DNS controllers zone-scoped access there.dns_zone_visibilityβ defaults to"public", which Let's Encrypt DNS-01 requires (the validation TXT records must be publicly resolvable). The A records themselves point at the Gateway's private IP β a public zone does not expose the endpoints.
"Publicly trusted" describes the certificate chain, not network exposure. The Gateway's load balancer IP is private β clients reach the endpoints only over private connectivity into the VPC (same VPC, peering, VPN, or Interconnect).
5. Enable Claude models in Vertex AI Model Garden
The platform's LLM worker runs evaluations against Claude models on Vertex AI. Vertex serves them serverlessly β there is nothing to deploy β but each project must enable access to the Claude models once, manually, in the Vertex AI Model Garden: open each model card, click Enable, and accept the terms.
Enable the following models:
- Claude Haiku 4.5
- Claude Sonnet 5
- Claude Opus 4.8
There is no Terraform resource or API for this step, and access can take up to 24β48 hours to become active β do it ahead of the deploy, or the worker's evaluation calls fail until it lands. Everything else about Vertex access (a least-privilege predict-only IAM role for the worker) is handled by the module.
6. Get the platform artifacts
All three artifacts are public β no Monte Carlo-issued credentials or registry login are required:
| Artifact | Location | Version |
|---|---|---|
| Terraform module | Terraform Registry β monte-carlo-data/ao-data-platform/google | ~> 1.0 |
ao-data-platform Helm chart | Docker Hub (OCI) β oci://registry-1.docker.io/montecarlodata/ao-data-platform | 4.0.0 |
ao-llm-worker image | Docker Hub β montecarlodata/ao-llm-worker | 1.1.0-gcp |
You don't fetch these by hand: terraform init pulls the module from the Registry, the helm provider pulls the chart during terraform apply, and the GKE nodes pull the image at runtime. You set the chart registry and version (and pin the image tag) as module inputs on the installation page.
The GCP module requires chart version 4.0.0 or later β earlier chart versions predate the values the module renders (the GKE Gateway and Vertex AI wiring), and pinning one produces a silently half-wired deployment.
7. Run the preflight check
Confirm your environment is ready. Each command below should succeed before you proceed to installation:
# Terraform is installed and >= 1.7
terraform version
# gcloud resolves to the target project
gcloud config get-value project
# The GKE auth plugin is installed
gke-gcloud-auth-plugin --version
# kubectl is installed (server check comes after the cluster exists)
kubectl version --client
# The Cloud DNS zone exists and serves your domains
gcloud dns managed-zones describe <dns_zone> --project <dns_project_id>
# The required APIs are enabled
gcloud services list --enabled \
| grep -E 'container|compute|dns|secretmanager|cloudkms|networksecurity|certificatemanager|aiplatform'
# Optional: confirm you can reach the public chart on Docker Hub (no login required)
helm pull oci://registry-1.docker.io/montecarlodata/ao-data-platform --version 4.0.0If gcloud config get-value project returns the wrong project, or terraform version reports below 1.7, fix those before continuing.
Next steps
Continue to Installation.
Updated 1 day ago
