Version 3.0
AWS EKS

Deploy on AWS EKS

Install a self-hosted deployment into your own AWS account, on an EKS cluster with a sandbox-capable node.

Audience: IT (the enabler)

This guide assumes you are comfortable operating EKS. It does not cover general Kubernetes administration.

Before you start, read Cluster and node requirements. The cluster this guide builds is not a generic one, and the node preparation it describes is the part most likely to catch you out.

A reference Terraform configuration provisions the whole shape: the VPC, the EKS cluster and its add-ons, the database, the bucket and key, and the prepared application node. Use it unless you have a reason not to.

Part 1: Pre-deployment bill of materials

Hand this to procurement and your cloud and security teams on day 0.

Decide these carefully, they are painful to retrofit:

  • Hostname. TLS, the OIDC redirect URI, and ingress all derive from it. Changing it later means re-issuing certificates and reconfiguring your identity provider.
  • Region. Moving regions later means a rebuild.

Components

CategoryComponentSpecNotes
ComputeEKS clusterEKS 1.36 or newer, with the cluster add-ons the platform depends onSee Cluster and node requirements
ComputeApplication nodeA single x86_64 m8i or m8i-flex instance with nested virtualization explicitly enabled, labeled as the application node. Minimum 16 vCPU and 64 GiB, recommended 32 vCPU and 128 GiBHosts the application and every sandbox run. Not interchangeable with a general-purpose node group. See Node sizing
StorageNode root volumeEncrypted gp3Sized for the node image and container images
StorageNode data volumeA separate encrypted gp3 volume, formatted btrfs during node bootstrapA cache for materialized workspaces and sandbox images, not a system of record. Deleted with the node by design
NetworkVPC and subnetsPrivate subnets across multiple availability zones, with NAT for egressThe reference Terraform provisions a dedicated VPC
NetworkCluster ingressAn ALB fronting the application, with an issued ACM certificate in the same regionYou operate the ingress and terminate TLS there
NetworkDNS recordYour chosen hostname resolving to the ingress endpoint
DataPostgreSQLAurora PostgreSQL Serverless v2, private onlyPrimary application data store
DataS3 bucketA bucket for the deployment, with a customer-managed KMS keyDurable storage for files, artifacts, and the workspace filesystem. Materialized onto the node on demand
DataKMS keyCustomer-managed, with rotation enabledEnvelope encryption of secrets at rest
IdentityOIDC IdP appAn application registered in Entra ID, Okta, or Auth0See Identity providers (OIDC)
AccessAWS and EKS admin accessPermissions for the deploying administrator, plus kubectl, helm, and terraform on their workstationEKS access entries must reference stable IAM role or user ARNs
EgressOutbound HTTPSUnrestricted egress recommendedNeeded for the Sema4.ai services, the sandbox runtime download during node bootstrap, and everything you connect the platform to. See Network endpoints

Node sizing

The application node carries the whole platform and every concurrent sandbox run, so size it for both. Sandbox concurrency is a fixed runner pool rather than something that autoscales, which makes the node the hard ceiling on how much agent work can run at once.

There are two supported sizes:

SpecvCPUMemoryInstance typeSuits
Minimum1664 GiBm8i.4xlargeA small workspace: a single team, a handful of Apps, light concurrent agent work
Recommended32128 GiBm8i.8xlargeA medium workspace: several teams sharing the platform, with headroom for concurrent sandbox runs

The minimum is a supported production size, not a proof-of-concept tier. Pick it when your workspace is genuinely small. Pick the recommended size when you expect several teams on the platform, or when sustained concurrent agent work matters more to you than instance cost.

Budget for the gap between instance size and what you actually get. Cluster add-ons and system DaemonSets take their share first, so a 16 vCPU / 64 GiB node lands near 15 vCPU and 59 GiB allocatable, and the platform's own baseline requests come out of that before the first sandbox run starts. Sizing against allocatable capacity is what keeps the runner pool from being squeezed.

This release does not scale horizontally, so the node you pick is the ceiling for the life of the deployment. Sizing up later means replacing the node, which costs downtime and a cold cache rather than data. If you expect to outgrow the minimum within the year, start at the recommended size. See Caveats and limits.

Part 2: Deployment steps

Step 1: Pick the hostname

Choose the hostname on a domain you control, for example finance-agents.company.com. Whether it resolves publicly or only inside your network is your choice. TLS, the OIDC redirect URI, and the ingress configuration all derive from it. You point DNS at the ingress in Step 6.

Issue an ACM certificate for the hostname in the same region as the cluster, and confirm it reaches Issued before you provision.

Step 2: Register the OIDC application

Register an OIDC application in your identity provider and capture the Discovery URL, Client ID, and Client Secret.

Configure it with:

  • Callback URL: https://<hostname>/api/v1/auth/callback
  • Logout URL: https://<hostname>
  • Application login URI: https://<hostname>/login
  • Allowed web origin: https://<hostname>
  • Scopes: openid, profile, email

Follow the guide for your provider: Microsoft Entra ID · Auth0 · Okta.

Step 3: Provision AWS infrastructure

Apply the reference Terraform, or provision yourself using the bill of materials as the spec. The end state must include:

  • An EKS cluster with the required add-ons, and kubectl access configured against it.
  • The application node, with nested virtualization enabled and both volumes attached.
  • Aurora PostgreSQL, reachable from the cluster.
  • An S3 bucket and a KMS key.
  • An ALB ingress and the ACM certificate from Step 1.

The Terraform provisions the node so that its bootstrap installs the sandbox runtime and prepares the data volume before the node joins the cluster.

Step 4: Confirm node preparation succeeded

Do not skip this. A node that joined without preparation looks healthy and cannot run agent work.

Confirm that:

  • The node is Ready and carries the application node label.
  • The sandbox runtime class exists in the cluster.
  • Node bootstrap wrote its completion marker.
  • The data volume is mounted btrfs at the data root, with shared propagation.

If the node never becomes ready, read its console output. Bootstrap reports the failing stage there.

Step 5: Install the application

The self-hosted release channel for version 3 is not open yet. There is no install command to publish. This step will carry the registry login and the chart install once the channel ships.

Step 6: Point DNS at your ingress

Create the DNS record resolving your hostname to the ALB endpoint. Sign-in does not complete until the hostname resolves and TLS is serving.

Step 7: Validate

  • Browse to https://<hostname>. Sign-in should redirect to your identity provider.
  • Sign in with a permitted user and confirm you land in the workspace.
  • Run a smoke test that exercises a sandboxed run, which confirms the node preparation, the database, and object storage together. Expect the first run to be slower than steady state while the node's caches fill.

The first user of a new deployment becomes its owner. Sign in yourself first, before opening access more widely.

Next steps

With the application running, continue to Administration to configure models, connect integrations and data sources, and set up teams.

What this article will cover

  • The exact Terraform inputs and a worked terraform.tfvars
  • The full bill of materials with concrete sizes, versions, and SKUs
  • The install commands, once the self-hosted channel ships
  • Screenshots of the install flow
  • Upgrading an existing deployment
  • Replacing the application node, and what a cold start looks like
  • Teardown, and what survives it