Skip to main content
Understand what the AWS Terraform modules provision and how the pieces fit together, so you can size, secure, and customize your LangSmith deployment before running make apply. Use this page as a reference while planning a rollout or troubleshooting an existing one. It covers:
  • Platform layers and application core services.
  • AWS managed services, IRSA roles, and cluster infrastructure.
  • Network topology, ingress options, and TLS/DNS strategies.
  • LangSmith Deployment add-on.
  • Module dependency graph and opt-in security modules.
If you are ready to install, start with the deployment walkthrough.

Platform layers

LangSmith on AWS deploys in two stages with one optional add-on. The infrastructure stage provisions the cloud foundation. The application stage installs the LangSmith Helm chart. The LangSmith Deployment add-on is opt-in and adds the host-backend, listener, and operator services for managing LangGraph applications from the UI. LangSmith on AWS service layout

Component to storage mapping

Application core services

These pods run on every deployment. All write logs and metrics; the busier components (backend, queue, ingest-queue) scale horizontally.
In-cluster ClickHouse is dev/POC only (single pod, no replication, no backups). For production use LangChain Managed ClickHouse or a self-managed external cluster.
SmithDB is LangSmith’s purpose-built observability backend, available for Self-hosted starting with self-hosted version 0.16.0 (see deployment support). These Terraform modules provision ClickHouse, so the guidance in the previous sections applies to current deployments.

One-time jobs

The Helm chart runs three jobs at install and upgrade time:

LangSmith Deployment add-on

When enable_deployments = true, three additional services are installed and a LangGraphPlatform CRD is registered. Each deployment the user creates in the LangSmith UI produces a Kubernetes Deployment in the langsmith namespace, managed by the operator.

AWS managed services

When postgres_source = "external" and redis_source = "external" (the recommended production setting), Terraform provisions the following AWS managed services:

RDS PostgreSQL

  • Default size: db.t3.large, private subnets, port 5432.
  • Holds orgs, users, projects, API keys, settings.
  • Secret flow: SSM /langsmith/{base_name}/postgres-password → ESO → langsmith-config.

ElastiCache Redis

  • Default size: cache.m6g.xlarge, private subnets, TLS port 6379.
  • Trace ingestion queue, pub/sub, short-lived cache.
  • Secret flow: SSM /langsmith/{base_name}/redis-auth-token → ESO → langsmith-config.

S3 bucket

  • Trace payloads: large inputs and outputs, attachments.
  • IRSA via langsmith_irsa_role (no static keys). VPC Gateway Endpoint, no public internet.
  • Prefixes: ttl_s/ (short TTL) and ttl_l/ (long TTL).
  • The S3 bucket is always required, regardless of tier. Disabling blob storage breaks the cluster on large payloads.

SSM Parameter Store

  • Centralized secret store for all LangSmith secrets.
  • Flow: source infra/scripts/setup-env.sh writes secrets to SSM. The ESO ClusterSecretStore reads them and projects a langsmith-config Kubernetes Secret that the Helm chart mounts via config.existingSecretName.
  • Prefix: /langsmith/{name_prefix}-{environment}/.

Cluster infrastructure

Two Terraform modules install the cluster-level services LangSmith depends on. The eks module installs the AWS-integration controllers through eks-blueprints-addons; the k8s-bootstrap module installs the workload dependencies and the optional ingress gateways (see Ingress options):

IRSA roles

IRSA replaces static credentials. The EKS cluster’s OIDC issuer is the trust anchor; service accounts in langsmith and kube-system are annotated with role ARNs and pods receive temporary credentials via the EKS token webhook.

Network topology

Default ALB ingress

Envoy Gateway (opt-in)

With the Terraform default (enable_envoy_gateway = true), the pre-provisioned ALB stays in front and binds to the Envoy service on port 8080 through a TargetGroupBinding, as shown in the ingress options table. The standalone Network Load Balancer path below is an overlay variant (helm/values/examples/langsmith-values-ingress-envoy-gateway.yaml) in which the NLB terminates TLS directly: Both langsmith and langsmith-agents attach to the shared langsmith-gateway through an HTTPRoute with allowedRoutes: All.

Egress path with Network Firewall

When create_firewall = true, all outbound internet traffic from private subnets is inspected before reaching the NAT gateway:
Pod-to-pod, pod-to-RDS, and pod-to-ElastiCache traffic uses the local VPC route and never touches the firewall.

Ingress options

Four mutually exclusive ingress options ship with the modules. The choice determines whether split dataplane (agent pods in a separate namespace) is supported.

Why ALB cannot support split dataplane

Standard Kubernetes Ingress is namespace-scoped. The ALB controller routes only to services in the same namespace as the Ingress resource. Agent pods in langsmith-agents are invisible to an Ingress in langsmith. Envoy Gateway and Istio both support cross-namespace routing via the Kubernetes Gateway API.

ALB plus Envoy Gateway (chained)

When the existing ALB already provides SSO (Okta or Cognito OIDC), WAF, and TLS, Envoy Gateway slots in behind it instead of replacing it:
The only change from the default ALB path is retargeting the ALB target group to the Envoy NLB. See helm/values/examples/langsmith-values-ingress-envoy-gateway.yaml in the modules repo for the values overlay.

TLS and DNS

The tls_certificate_source variable controls the certificate strategy:

Why ACM versus cert-manager

ACM certificates are non-exportable. AWS attaches them directly to the ALB, which makes ACM the right choice when TLS terminates at the ALB. ACM cannot be used when TLS terminates inside the cluster (Istio Gateway, Envoy Gateway) because those gateways require the certificate material as a Kubernetes Secret. The letsencrypt source is a reference implementation for the ALB path: it installs cert-manager with a Let’s Encrypt HTTP-01 ClusterIssuer bound to the ALB ingress class. For in-cluster TLS on Istio or Envoy, set create_cert_manager_irsa = true instead, which uses a DNS-01 ClusterIssuer validated through Route 53. HTTP-01 (via ALB) and DNS-01 (via Route 53) are mutually exclusive. In production, swap the ClusterIssuer for any cert-manager-compatible issuer. The Terraform module provisions the cert-manager IRSA role and Route 53 permissions. Only the ClusterIssuer manifest changes between issuers.

Auto-provisioned DNS

When langsmith_domain is set and acm_certificate_arn is empty, Terraform activates the dns module which creates:
  • A Route 53 hosted zone for the domain.
  • An ACM certificate with DNS validation records.
  • A Route 53 alias record pointing the domain to the ALB.
Staged deploy pattern: Set langsmith_domain with tls_certificate_source = "none" first. Terraform creates the hosted zone and certificate without blocking on validation. Delegate the NS records at your registrar, then flip to tls_certificate_source = "acm" in a later apply. Terraform blocks until the certificate validates and wires it into the HTTPS listener.

Bring your own certificate

Set acm_certificate_arn directly to skip the dns module. For in-cluster gateways, create a Kubernetes TLS Secret manually and reference it in the Gateway or VirtualService.

Module dependency graph

Opt-in security modules

Default resource sizes

For production sizing recommendations, see the scaling guide and the AWS deployment guide.

Validated behaviors and known constraints

These constraints were validated during the April 2026 gateway permutation test run.

Verification commands