kubectl, helm, and aws calls used throughout this page, skip to Diagnostic commands.
Automated diagnostics
Before running individual commands, try the bundled scripts:Known issues
EKS node group creation fails: CREATE_FAILED
Symptomkubectl fails: “You must be logged in to the server”
Symptom: Allkubectl commands fail with error: You must be logged in to the server (Unauthorized).
Cause: The kubeconfig is stale, the AWS credentials differ from those that created the cluster, or the token has expired.
Fix
ALB not created after Helm install
This entry applies to classic ALB Ingress mode (enable_envoy_gateway = false with no other gateway). In the default Envoy Gateway mode, an empty kubectl get ingress is expected: the Terraform-managed ALB forwards to Envoy through a TargetGroupBinding. Check make status and kubectl get gateway,httproute -n langsmith instead.
Symptom: kubectl get ingress -n langsmith shows no ADDRESS after several minutes.
Cause: AWS Load Balancer Controller is not running or lacks IRSA permissions, or alb_scheme = "internal" is set (internal ALBs have no public address; see ALB has no public address).
Fix
RDS connection refused from EKS pods
Symptom: Backend logs showconnection refused or timeout for the RDS endpoint.
Cause: The RDS security group does not allow inbound TCP 5432 from the VPC CIDR. The module’s security group allows the VPC CIDR. With postgres_existing_security_group_id set, Terraform does not manage the rules, so your security group must allow it.
Fix
postgres module sets up the security group automatically. If the rule is missing, re-apply:
S3 access denied from pods (IRSA not configured)
Symptom: Backend logs showAccessDenied when reading or writing S3.
Cause: IRSA annotation missing from the component service accounts, or the S3 VPC Gateway Endpoint is not routing correctly.
Fix
make init-values annotates each component’s service account (backend, platform-backend, queue, ingest-queue, playground, and the LangSmith Deployment services). If the annotations are missing, verify create_langsmith_irsa_role = true in terraform.tfvars, then run make init-values && make deploy.
ElastiCache Redis connection timeout
Symptom: Pods cannot connect to Redis. Logs showdial tcp: i/o timeout.
Cause: The ElastiCache security group does not allow inbound TCP 6379 from the VPC CIDR. The module’s security group allows the VPC CIDR; with redis_existing_security_group_id set, your security group must allow it.
Fix
redis-cli needs --tls.
Image pulls time out in a VPC without internet egress
Symptom: Pods stay inImagePullBackOff or ErrImagePull. kubectl describe pod shows dial tcp <ip>:443: i/o timeout while pulling from <account-id>.dkr.ecr.<region>.amazonaws.com.
Cause: The module creates only an S3 Gateway endpoint in the VPC, with no ECR interface endpoints. A VPC created by the module sends egress through a NAT gateway. A bring-your-own VPC (create_vpc = false) with no NAT gateway gives nodes no route to the ECR API and registry.
Fix: Create ecr.api and ecr.dkr interface endpoints in the private subnets with private DNS enabled, behind a security group that allows TCP 443 from the VPC CIDR. Image layers download from S3 through the existing Gateway endpoint.
EKS nodes not autoscaling
Symptom: Pods remainPending. Node count does not increase.
Cause: Cluster Autoscaler lacks IAM permissions, targets the wrong ASG, or min_size = max_size on the node group.
Fix
cert-manager fails to issue Let’s Encrypt certificate
Symptom:kubectl get certificate -n langsmith shows READY=False. HTTP01 challenge is failing.
Cause: The ALB is not forwarding port 80 to the cert-manager solver pod, or the DNS record for the domain does not point to the ALB.
Fix
postgres_deletion_protection blocks terraform destroy
Symptomterraform.tfvars, apply, then destroy:
make uninstall before make destroy. For the full sequence, see Teardown.
RDS takes a final snapshot named <identifier>-final unless postgres_skip_final_snapshot = true. With SmithDB enabled, the metastore RDS also takes a -final snapshot unless smithdb_metastore_skip_final_snapshot = true. A repeat destroy fails with DBSnapshotAlreadyExists while that snapshot exists; delete the old snapshot or set postgres_skip_final_snapshot = true.
ESO fails to sync: langsmith-config secret missing
Symptom: Pods stuck inCreateContainerConfigError. kubectl get secret langsmith-config -n langsmith returns NotFound.
Cause: ESO sync is all-or-nothing. If any single SSM parameter referenced by the ExternalSecret is missing, ESO refuses to create the Kubernetes Secret. All pods fail, including those unrelated to the missing parameter.
Fix
validate does not check langsmith-admin-email, which the ExternalSecret always requires, and treats sandbox-callback-signing-jwk as optional, though it is required when enable_sandboxes = true. Confirm both keys in the list output.
The describe output shows which remoteRef.key failed. Match it against the SSM prefix /langsmith/{name_prefix}-{environment}/.
SSM parameter prefix mismatch
Symptom:manage-ssm.sh validate passes but ESO still cannot sync. Or setup-env.sh wrote parameters under a different prefix than ESO expects.
Cause: The SSM prefix is derived from name_prefix and environment in terraform.tfvars. If these changed after initial setup, the old parameters live under the old prefix and ESO looks under the new one.
Fix
v0.17.0 and v0.16.* module releases, the live copy in migrate-ssm.sh fails: its put-parameter call passes --output none, which the AWS CLI rejects, so every parameter reports FAILED. On bash 4.1 or later, the script can also exit after the first parameter. Use --dry-run to list the keys, then copy each one with the AWS CLI:
Postgres password rejected by Terraform validation
Symptomsetup-env.sh produces a compliant password automatically. To replace an invalid value, unset the exported variable first, because setup-env.sh keeps a TF_VAR_postgres_password that is already set:
make apply, not -target=module.postgres: the target skips the langsmith-postgres Secret, so RDS and LangSmith would hold different passwords. Skip the restart on a new deployment that has no running pods.
Private EKS cluster unreachable (bastion required)
Symptom:kubectl and terraform apply time out when enable_public_eks_cluster = false.
Cause: The EKS API endpoint is private. Commands must run from within the VPC, either via the bastion host or a VPN connection.
Fix
create_bastion = true and re-apply, or temporarily set enable_public_eks_cluster = true.
ALB has no public address (internal scheme)
Symptom: The ALB hostname frommake status or make tf ARGS="output alb_dns_name" starts with internal- and resolves only within the VPC.
Cause: alb_scheme = "internal" was set in terraform.tfvars. Internal ALBs are only reachable from within the VPC (VPN, peering, or PrivateLink).
Fix: Intentional for private deployments. To make the ALB publicly reachable:
create_vpc = false, an internet-facing ALB also needs public_subnets.
ALB hostname changed after ingress recreation
This entry applies to classic ALB Ingress mode, where the ALB controller owns the ALB. In that modealb_dns_name refers to the unused Terraform-managed ALB.
Symptom: The LangSmith URL stops working. Agent deployments stuck in DEPLOYING. DNS records or bookmarks point to an old ALB hostname that no longer resolves.
Cause: Deleting the Kubernetes ingress (via helm uninstall, kubectl delete ingress, or namespace deletion) deprovisions the ALB. When the ingress is recreated, a new ALB with a different hostname is issued. The config.deployment.url in Helm values still points to the old hostname, so the operator’s health checks fail and deployments stay stuck.
Prevention
- Keep the
group.nameannotation thatinit-values.shsets on the ingress. - Do not delete the ingress unless you plan to update all hostname-dependent config.
- On Helm 4, avoid
helm rollbackwithout--server-side=false. The ingress SSA conflict can trigger a delete/recreate cycle.
langsmith_domain is set, make deploy does not rewrite the hostname; update the DNS record to the new ALB instead.
Chart v16 sandbox values rejected
Symptom:make deploy exits with ERROR: langsmith-values-overrides.yaml carries sandboxes.juicefs.csi, the chart 0.16 sandbox schema.
Cause: The values file was generated by a v0.16.* module release. Chart v17 has no JuiceFS CSI driver and ignores the sandboxes.juicefs.csi block.
Fix: Regenerate the values in the chart v17 schema, then redeploy:
Deploy stops on chart v16 JuiceFS volumes
Symptom:make deploy exits with ERROR: namespace langsmith still mounts sandbox volumes through the chart 0.16 JuiceFS CSI driver. followed by kubectl delete commands.
Cause: Chart v17 removes the JuiceFS CSI driver. Upgrading while chart v16 sandbox volumes are still mounted leaves the old sandbox-host pods stuck in Terminating, so deploy.sh stops before the upgrade.
Fix: Run the printed kubectl delete commands while the driver still runs. Wait until only juicefs-csi-* pods remain, then redeploy:
Chart v15 values files rejected
Symptom:make deploy exits with ERROR: these values files use the chart 0.15 schema, which chart 0.16 rejects: followed by a list of files.
Cause: Chart v16 removed config.insights, config.polly, and backend.agentBootstrap. make init-values creates add-on values files only when they are missing, so files generated on chart v15 survive the upgrade.
Fix: Delete the listed files from helm/values/, then regenerate and redeploy:
setup-env.sh run without AWS credentials
Symptom: After sourcingsetup-env.sh, make secrets shows every parameter as ✗ MISSING, and aws sts get-caller-identity fails.
Cause: No AWS credentials were active. The script still exports TF_VAR_* and prints only a warning.
Fix: Log in, then re-source the script in the same shell. It backfills the exported values to SSM without prompting again. Run make preflight first to catch this.
infra/: .pg_password, .api_key_salt, .jwt_secret, .license_key, and .admin_password. Delete them once make secrets shows every parameter in SSM.
Node group scaling changes not applied by Terraform
Symptom: Changingmin_size or max_size in terraform.tfvars shows “No changes” on terraform plan.
Cause: The ASG was changed out-of-band (AWS CLI, console, or cluster autoscaler) and the Terraform state already reflects the new values. The community EKS module ignores desired_size changes so the autoscaler can manage it; min_size and max_size should propagate normally.
Fix
Diagnostic commands
Cluster access
Pods
ALB and ingress
TLS and certificates
ESO and secrets
Helm
IRSA and IAM
LangSmith Deployment
Quick health check
Connect these docs to your agent of choice via MCP for real-time answers.

