Deploy with Helm
With the infrastructure in place, install the confident-ai Helm chart using the Terraform outputs. The chart pulls its images from Confident AI’s registry and installs the app plus in-cluster ClickHouse. Because the app uses EKS Pod Identity, its ServiceAccount needs no annotation.
The recommended setup keeps app secrets in AWS Secrets Manager (synced by the External Secrets Operator) and runs Redis on ElastiCache. Both are provisioned by the Terraform module. In-cluster Redis and a Kubernetes Secret are supported as a simpler alternative, see Simpler option.
Two things come from Confident AI with your Enterprise license:
- Image pull credentials: an AWS access key ID and secret that let the cluster pull the first-party images (hosted in a separate ECR account). The chart uses them to mint and refresh the pull secret automatically.
- License key (
CONFIDENT_LICENSE_KEY): the signed key that enables your plan’s features.
About OPENAI_API_KEY: it backs the built-in Confident AI evaluation provider, which runs on OpenAI. It is optional. Omit it and connect your own model provider or an LLM gateway per project from AI Connections in the app instead.
Put the secrets in Secrets Manager
DATABASE_URL comes straight from Terraform. Each key in this JSON object becomes an app secret:
This uses the secret Terraform created with confident_create_secrets_manager = true. If you did not enable it, either turn it on and re-apply, or use the simpler option.
Install the External Secrets Operator
Install it into the confident-ai namespace as the external-secrets-sa account, the exact account Terraform gave the read role to, so ESO inherits the AWS access through Pod Identity with no keys:
Set up ALB ingress (for HTTPS)
To serve the app on a domain over HTTPS, install the AWS Load Balancer Controller (it provisions an ALB from your Ingress) and request an ACM certificate in your region covering all four subdomains, app., api., evals., and otel. of yourdomain.com (a wildcard *.yourdomain.com also works). You will reference the certificate ARN in the values file below.
Only trying it out? Set ingress.enabled: false in the values file and reach the app with kubectl port-forward -n confident-ai svc/confident-frontend 3000:3000.
Write the values file
Save this as values.aws.yaml. Fill the bracketed values from your Terraform outputs and the credentials Confident AI gave you.
Simpler option: in-cluster Redis and a Kubernetes Secret
If you would rather not run a cloud secret store or managed Redis, the chart can hold secrets in a Kubernetes Secret and run Redis in the cluster. This is less production-hardened (secrets live in the cluster, Redis has no managed backups), but it removes the ESO and ElastiCache steps. Skip steps 2 and 3 above, and replace the secrets and redis blocks in the values file with:
Back up ClickHouse (recommended)
For production, enable the nightly ClickHouse backup to S3. Provision the backup bucket (confident_clickhouse_backup_bucket_enabled = true); the backup pod writes with Pod Identity, so set serviceAccountName to a service account whose role can write to that bucket. Full detail is on the Disaster Recovery page. Add this under your existing clickhouse: block and helm upgrade:
Troubleshooting
Updating and tearing down
- Change the app: edit
values.aws.yaml, thenhelm upgrade confident-ai oci://ghcr.io/confident-ai/charts/confident-ai --version 0.1.0 -n confident-ai -f values.aws.yaml. - Rotate a secret: run
aws secretsmanager put-secret-valueagain. ESO re-syncs it, then restart the pods to pick up the change (they hold secrets as env vars until they restart):kubectl rollout restart deployment -n confident-ai. - Change infrastructure: edit the Terraform config and
terraform apply. - Remove everything:
helm uninstall confident-ai -n confident-ai, thenterraform destroy, then delete the network from the Infrastructure page if Terraform did not own it.