Agent Observability Platform: Prerequisites (GCP)

What you need before deploying the Agent Observability data platform on GCP

☁️

This page covers GCP. Also available for AWS and Azure.

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:

ToolVersionUsed for
Terraform>= 1.7Provisioning the platform
gcloud CLIlatestAuthenticating to GCP and retrieving outputs
gke-gcloud-auth-pluginlatestCluster authentication for the kubernetes/helm providers and kubectl (gcloud components install gke-gcloud-auth-plugin)
kubectllatestVerifying the cluster after deployment β€” also invoked by the module itself during apply
Helm3.xOnly 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 bash and kubectl on the PATH: the module runs gcloud container clusters get-credentials and kubectl commands during apply to 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:

APIWhy
container.googleapis.comGKE cluster and node pools
compute.googleapis.comVPC, subnets, Cloud Router/NAT, firewalls, Cloud Armor
dns.googleapis.comCloud DNS records and zone IAM
secretmanager.googleapis.comClickHouse credential secrets (also required so the Secret Manager service agent can exist for CMEK)
cloudkms.googleapis.comCMEK keys for GKE Secrets and Secret Manager
networksecurity.googleapis.comGateway backend TLS re-encryption (BackendTLSPolicy)
certificatemanager.googleapis.comGateway backend TLS re-encryption
aiplatform.googleapis.comVertex 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.com

Deployer IAM

The identity running terraform apply needs permissions to create and manage, by category:

CategoryWhat 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
GKEA GKE Standard cluster and node pools (including the per-zone ClickHouse and Keeper stateful pools)
IAMService 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 KMSA key ring and CMEK keys, plus key IAM for the GKE and Secret Manager service agents
Secret ManagerSecrets and versions for the ClickHouse users, plus per-secret accessor grants
Cloud DNSPer-zone IAM grants on your managed zone β€” in the DNS project, if the zone lives in a different project
Cloud ArmorA regional security policy for the Gateway source allow-list (when configured)
KubernetesCluster-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:

PathWhen to useAdditional inputs
New clusterYou 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 clusterYou 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:

  1. 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.
  2. Your responsibility: a REGIONAL_MANAGED_PROXY proxy-only subnet in the cluster's region (the internal Gateway's Envoy fleet lives there β€” set networking.proxy_only_cidr to 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.
  3. Existing controllers: if cert-manager, the External Secrets Operator, or external-dns are already installed, set the matching helm.install_* flag to false (see Installation).
  4. 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 as otel_collector_domain
  • A domain for the ClickHouse endpoint (e.g. clickhouse.acme.com) β€” passed as clickhouse_domain
  • A Cloud DNS managed zone already serving those domains β€” passed by zone name (e.g. acme-com, not acme.com.) as dns_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:

ArtifactLocationVersion
Terraform moduleTerraform Registry β€” monte-carlo-data/ao-data-platform/google~> 1.0
ao-data-platform Helm chartDocker Hub (OCI) β€” oci://registry-1.docker.io/montecarlodata/ao-data-platform4.0.0
ao-llm-worker imageDocker Hub β€” montecarlodata/ao-llm-worker1.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.0

If 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.


Did this page help you?