Overview
This guide walks through a complete, production-ready deployment of CrewAI Enterprise on Amazon EKS with the following stack:- Database: Amazon Aurora for PostgreSQL 16 (external RDS)
- Storage: Amazon S3
- Container registry: Amazon ECR
- Load balancer: AWS Application Load Balancer (ALB) via AWS Load Balancer Controller
- IAM: EKS Pod Identity (no static credentials)
- Authentication: WorkOS (AuthKit)
- Trace collection: Wharf (OTLP)
- Studio V2: Post-install activation
Prerequisites Checklist
Complete every item before runninghelm install. Missing any one will cause a failed or broken deployment.
EKS Cluster
- EKS cluster running Kubernetes 1.32.0+, AMD64 worker nodes
- AWS Load Balancer Controller installed in the cluster
- Public subnets tagged
kubernetes.io/role/elb=1(for internet-facing ALB) -
kubectlcontext pointed at the target cluster - Helm 3.10+ installed
Amazon RDS
- Aurora PostgreSQL 16 cluster provisioned (see sizing table)
- PostgreSQL user
crewaicreated with login privileges - All four databases pre-created and grants applied (see Database Setup)
- RDS security group allows TCP 5432 inbound from EKS worker node security group
Amazon S3
- S3 bucket created for crew artifact storage
- Bucket versioning enabled (recommended)
Amazon ECR
- ECR repository created with path ending in
/crewai-enterprise(e.g.,<account>.dkr.ecr.<region>.amazonaws.com/<org>/crewai-enterprise) - Image tag mutability set to MUTABLE on the repository
IAM — Pod Identity
- EKS Pod Identity Agent DaemonSet running (
kubectl get ds -n kube-system eks-pod-identity-agent) - IAM role
CrewAIPodIdentityRolecreated with the combined S3 + ECR policy (see IAM Setup) - Pod Identity association created for namespace
crewai, service accountcrewai-sa
ACM Certificate
- ACM certificate issued and validated for
<YOUR_DOMAIN>in the deployment region
WorkOS
- WorkOS Application created; note the Client ID and AuthKit domain
- WorkOS API key generated (format:
sk_live_...) - Redirect URI added to the WorkOS application:
https://<YOUR_DOMAIN>/auth/workos/callback -
WORKOS_COOKIE_PASSWORDgenerated (must be ≤ 32 characters — see WorkOS Setup)
Helm Registry Access
- Authenticated to the CrewAI Helm registry:
helm registry login registry.crewai.com
Infrastructure Setup
Aurora Instance Sizing
Use gp3 storage with a minimum of 3000 IOPS for production. Memory-optimized instances (R6g family) are strongly preferred for CrewAI’s Rails workload.
Database Setup
Connect to your RDS instance as a superuser and run the following beforehelm install. The Helm chart does not create databases when postgres.enabled: false.
S3 Bucket
ECR Repository
IAM — Pod Identity Setup
Create a single IAM role that covers both S3 and ECR access. Pod Identity attaches this role to thecrewai-sa service account without OIDC configuration.
1. Create the combined S3 + ECR policy
Save the following to crewai-policy.json, substituting your bucket name, region, and account ID:
rbac.create: true in the Helm values (shown below) causes the chart to automatically create a ServiceAccount named crewai-sa in the deployment namespace. The Pod Identity association must reference this exact name.ACM Certificate
WorkOS Setup
1. Create a WorkOS Application In the WorkOS Dashboard:- Create a new Application
- Note the Client ID (format:
client_<...>) - Note the AuthKit domain (format:
https://<subdomain>.authkit.app) - Navigate to Redirects and add:
https://<YOUR_DOMAIN>/auth/workos/callback - Generate an API key (format:
sk_live_...)
WORKOS_COOKIE_PASSWORD
The cookie password must be 32 characters or fewer. Longer values are silently truncated by the runtime, which can produce intermittent auth failures.
WORKOS_API_KEY and the generated cookie password. You will place them under envVars: in the values file.
Complete values.yaml
Replace every<PLACEHOLDER> with your environment-specific values before running helm install.
values.yaml
Install
Run the following command from the directory containing yourvalues.yaml:
Running state before proceeding to post-install:
Post-Install
Required Initialization
These commands must be run before any user can log in. Run them in the order shown.Organization IDs are sequential integers. The internal CrewAI organization always receives ID 1. The first customer-facing organization created in the UI receives ID 2. To list all organizations:
kubectl exec -it deploy/crewai-web -n crewai -- bin/rails runner "puts Organization.all.map { |o| \"#{o.id}: #{o.name}\" }.join(\"\\n\")"Studio V2 Activation
Studio V2 requires three ordered steps: two in the web UI and three kubectl commands. All UI steps must be completed before running the kubectl commands. Step 1 — Create the LLM Connection (UI)- Log in as an admin user
- Navigate to Settings → LLM Connections
- Click New Connection
- Name the connection exactly
studio-v2(case-sensitive, with hyphen) - Configure the LLM provider and model for the Studio agent
- Save the connection
- Navigate to Settings → Crew Studio
- Set
studio-v2as the Default Connection - Save
studio:agent:install will fail if the studio-v2 LLM Connection does not exist yet.
Verify
Pods and Services
ALB Provisioning
schemevalue is not lowercase —"internet-facing"and"internal"only;"Internet-Facing"silently fails- Public subnets are missing the
kubernetes.io/role/elb=1tag - AWS Load Balancer Controller is not installed or lacks IAM permissions
Database Connectivity
WorkOS Authentication
- Navigate to
https://<YOUR_DOMAIN>in a browser - You should be redirected to the WorkOS AuthKit login page
- After login, you should land on the CrewAI dashboard
WORKOS_API_KEY and WORKOS_COOKIE_PASSWORD are under envVars: and not secrets: in your values file.
Pod Identity (S3 + ECR)
Platform Health Check
"status": "ok". For detailed diagnostics, see the Factory Health guide.