- Infrastructure: Terraform provisions VPC, EKS, RDS, ElastiCache, S3, and IAM.
- Application: Helm installs the LangSmith chart against the cluster.
Prerequisites
Required tools
| Tool | Version | Purpose |
|---|---|---|
| AWS CLI | v2 | Authenticate, query AWS resources, manage EKS kubeconfig |
| Terraform | 1.5 | Run the infrastructure modules |
kubectl | 1.33 | Inspect the EKS cluster |
| Helm | 3.12 | Install and manage the LangSmith chart |
eksctl | latest | Optional, handy for kubeconfig and debugging |
PATH:
Required AWS IAM permissions
The IAM user or role running Terraform needs permission to create and manage the cloud foundation. The following managed policies cover the full surface area. Use them as a starting point and trim down to least-privilege once the deployment is stable.| Policy | Purpose |
|---|---|
AmazonEKSClusterPolicy | Create and manage EKS clusters |
AmazonVPCFullAccess | Create VPC, subnets, route tables, and NAT |
AmazonRDSFullAccess | Create and manage RDS PostgreSQL instances |
AmazonElastiCacheFullAccess | Create ElastiCache Redis clusters |
AmazonS3FullAccess | Create S3 buckets and VPC endpoints |
IAMFullAccess | Create IRSA roles and policies |
Authenticate
Configure AWS credentials with the CLI:License key and domain
Two non-AWS items must be ready beforeterraform apply:
- LangSmith license key. Contact sales to request one. The key is stored in AWS SSM Parameter Store by the setup script, not in
tfvars. - Domain or subdomain that resolves to the AWS account, plus an ACM certificate covering it (or
letsencrypt/nonefor thetls_certificate_sourcevariable).
Cluster sizing reference
Two independent settings control capacity:- Infrastructure capacity sets instance types and node counts directly through the infra variables
eks_managed_node_groups,postgres_instance_type, andredis_instance_type. The module defaults are onem5.4xlargenode group (min 3, max 10),db.t3.largefor RDS, andcache.m6g.xlargefor ElastiCache. sizing_profileselects the Helm sizing overlay (pod resource requests and limits).init-values.shanddeploy.shread it; Terraform does not.
For production workloads, also plan to provision external LangChain Managed ClickHouse or a self-managed external ClickHouse cluster. In-cluster ClickHouse is supported for dev/POC only.
Quickstart
For the fastest path from zero to a running LangSmith instance, run these commands in order:make quickdeploy runs terraform apply → kubeconfig → init-values → helm deploy in sequence. If any step fails, the command exits with instructions for resuming from that step.
The following sections cover each phase in detail.
Provision infrastructure
Terraform provisions the following AWS resources:| Resource | Purpose |
|---|---|
| VPC + subnets + NAT | Private network for the cluster and managed services |
| EKS cluster + node groups | Kubernetes compute |
| RDS PostgreSQL | LangSmith operational data |
| ElastiCache Redis | Queue and cache |
| S3 bucket + VPC endpoint | Trace payload blob storage |
| ALB + listeners | Public ingress with TLS |
| SSM Parameter Store entries | Application secrets, synced into the cluster by External Secrets Operator |
| IRSA roles + IAM policies | Per-service AWS access |
| KEDA, cert-manager, ESO | Bootstrap workloads installed alongside infrastructure |
Clone and configure
modules/aws/. Run make help for the full target list.
Generate terraform.tfvars with the interactive wizard:
infra/terraform.tfvars. Re-running the wizard preselects existing values; press Enter at each prompt to keep the current config.
Prefer to edit by hand? Copy the example and fill in the required fields:
Load secrets into SSM Parameter Store
terraform.tfvars, derives the SSM path /langsmith/{name_prefix}-{environment}/, then for each secret either reuses an exported value, reads the existing SSM parameter, auto-generates one (for salts and tokens), or prompts you. The license key and admin password are the two values you supply interactively. The script must be sourced (not executed) because make cannot export environment variables back to the parent shell.
The script manages the following SSM parameters:
| SSM key | How it is set | Notes |
|---|---|---|
postgres-password | Prompt | RDS uses this password |
redis-auth-token | Auto-generated (openssl rand -hex 32) | ElastiCache requires hex |
langsmith-api-key-salt | Auto-generated (openssl rand -base64 32) | Never rotate, breaks all API keys |
langsmith-jwt-secret | Auto-generated (openssl rand -base64 32) | Never rotate, invalidates all sessions |
langsmith-license-key | Prompt | From your LangChain account team |
langsmith-admin-password | Prompt | Must contain a symbol |
deployments-encryption-key | Auto-generated Fernet key | LangSmith Deployment add-on |
agent-builder-encryption-key | Auto-generated Fernet key | Agent Builder add-on (reused by Fleet) |
insights-encryption-key | Auto-generated Fernet key | Insights add-on |
polly-encryption-key | Auto-generated Fernet key | Polly add-on |
TF_VAR_* environment variables are exported:
Apply
Provisioning the AWS cloud foundation takes 20 to 25 minutes on a clean account. Do not interrupt the apply.
make plan shows the proposed diff. Review the output before applying. make apply provisions in dependency order: VPC and security groups, then EKS (about 12 minutes) and RDS (about 8 minutes, in parallel), then node groups, ElastiCache, S3, and the ALB.
Configure kubectl
Ready and the core add-ons (CoreDNS, kube-proxy, VPC CNI, KEDA, ESO) should be Running. cert-manager runs only when tls_certificate_source = letsencrypt or create_cert_manager_irsa = true.
Deploy LangSmith
Two deployment paths are supported. Pick one.Script-driven Helm deploy (recommended)
Best for most deployments. Interactive prompts guide you through sizing and product choices.init-values.sh prompts for the admin email, then reads sizing_profile and the enable_* flags from terraform.tfvars and copies the matching values files from helm/values/examples/ into helm/values/. On re-runs it preserves your choices and refreshes Terraform outputs.
make deploy runs helm/scripts/deploy.sh, which:
- Refreshes the kubeconfig.
- Runs preflight checks (AWS credentials, cluster reachability, the
langchainHelm repo). - Applies the External Secrets Operator
ClusterSecretStoreandExternalSecretso the cluster reads secrets directly from SSM. - Installs the LangSmith Helm chart with the layered values files.
Verify
Running and the ingress shows the ALB DNS name, the deployment is ready. Use the domain you configured in langsmith_domain (or the ALB DNS name) to reach the UI.
If you completed the script-driven deploy, you are done. The following section is an alternative deployment path, not an additional step.
Terraform-managed Helm deploy
Best for teams that want the full deployment in Terraform state, or for “bring your own infrastructure” scenarios. Theapp/ module manages the External Secrets Operator wiring, the helm_release, and feature toggles directly.
app/terraform.tfvars file controls the application configuration:
make init-app and set all variables manually in app/terraform.tfvars.
Enable add-ons
Each add-on is gated by a flag ininfra/terraform.tfvars. Set the flag, re-run make init-values to copy the matching values file, then re-run make deploy.
Fleet
Fleet is the current form of the feature formerly called Agent Builder, deployed as a standalone service (chart v0.15+).
enable_fleet. On AWS, it requires enable_deployments = true, because the Fleet chat UI resolves OAuth provider and token connections through the host-backend that ships with LangSmith Deployment. It also requires external Postgres and Redis (postgres_source = "external" and redis_source = "external").
Terraform creates a dedicated langsmith_fleet database on RDS and wires the langsmith-fleet-postgres and langsmith-fleet-redis secrets to the existing RDS and ElastiCache instances. Fleet reuses langsmith_agent_builder_encryption_key, so migrating from enable_agent_builder keeps the same key and data.
Fleet requires the LangSmith Helm chart
>=0.15.0 and the Agent Builder or Fleet entitlement in your license.standalone-fleet-api-server, standalone-fleet-tool-server, standalone-fleet-trigger-server, and standalone-fleet-queue services.
Optional: private EKS cluster with bastion
For deployments that must run a fully private EKS API endpoint, the modules ship a bastion host pattern:- First, run from your workstation with
create_bastion = trueandenable_public_eks_cluster = trueso the bastion can be created. - After the initial deployment, set
enable_public_eks_cluster = falseand re-apply. The EKS API endpoint becomes private only. - All subsequent Terraform work happens on the bastion. SSM into it, clone the repo, copy your
terraform.tfvarsand SSM secrets, then run the deployment from there.
The bastion lives in a public subnet for SSM agent connectivity but does not need a public IP if your VPC has the SSM, SSMMessages, and EC2Messages VPC endpoints. The bastion comes preinstalled with
kubectl, helm, terraform, git, and jq, with kubeconfig already configured for the EKS cluster. Install the Session Manager plugin for the AWS CLI on your workstation.Optional: Envoy Gateway ingress
The default ingress is the AWS Load Balancer Controller (ALB). Setenable_envoy_gateway = true in terraform.tfvars to install Envoy Gateway instead. Envoy Gateway is required for multi-namespace dataplane deployments where the langgraph-dataplane chart runs in its own namespace.
tls_certificate_source = "acm". TLS terminates at the NLB; Envoy sees plain HTTP internally.
When running the dataplane chart in a separate namespace, apply the RBAC manifest once per dataplane namespace:
langsmith-host-backend ServiceAccount read access to pods, pod logs, deployments, and ReplicaSets in the dataplane namespace. Without it, agent run logs do not stream in the LangSmith UI.
Next steps
- Reference the AWS variables and the quick reference.
- Review the AWS architecture for platform layers, IRSA, and module dependencies.
- When something breaks, check the AWS troubleshooting guide.
- Enable agent deployment in the UI with LangSmith Deployment.
Connect these docs to Claude, VSCode, and more via MCP for real-time answers.

