lilt-aws-env, that provisions the AWS infrastructure LILT runs on. This article covers what the module creates, how to configure it, and how to map its outputs into the installer’s configuration.
You do not need access to any LILT source repository. The module is a plain local module inside the tarball.
The Two Layers
An EKS deployment has two layers, and they run in order:-
lilt-aws-envprovisions the AWS resources: subnets, the EKS cluster and its node groups, the RDS database, the S3 bucket, the SQS queue, and the IAM roles the workloads assume. -
install-lilt-eks.shdeploys LILT onto that cluster with Helm. See Install System (AWS EKS).
Prerequisites
Tools
AWS
- An IAM role or user that can create EKS, RDS, S3, SQS, IAM, KMS, and Route53 resources in the target account.
- A VPC with at least one NAT gateway. The module creates subnets inside your VPC. It does not create the VPC.
-
Two non-overlapping CIDR blocks available in that VPC for the module’s private subnets. A
/22in each of two availability zones is a reasonable starting point. - A Route53 hosted zone for your base domain.
What the Module Creates
Instantiate the Module
Create aterraform/ directory next to the extracted tarball, so that the relative module path resolves:
Required Variables
Commonly Tuned Variables
GPU Node Groups
eks_extra_node_groups defaults to the four GPU pools LILT needs. LILT spreads its GPU workloads across all four, and a partial set fails in a way that does not name itself: batch-worker-gpuv4 stays Pending, and the neural services block on the artifacts endpoint it serves rather than reporting a GPU shortage.
Each pool carries the
nvidia.com/gpu taint and the capability: gpu label that the LILT charts select on.
Four warm GPU nodes are expensive. To let the autoscaler bring each pool up on demand, set min_size to 0 for the pools you want cold. Cluster Autoscaler is enabled by default, which is what makes a group at zero discoverable. For an infrastructure-only deployment with no GPU workloads, set eks_extra_node_groups = {}.
Setting eks_extra_node_groups replaces the default map wholesale rather than merging into it, so list every pool you want, not only the one you are changing. The block below is the shipped default with availability_zones added to each pool. Substitute the zones your region offers.
gpu-class label is what the LILT charts select on, so each pool needs its own value. The root volumes are large because the neural services pull trained-data images of tens of gigabytes.
To let the autoscaler bring a pool up only when something needs it, set that pool’s min_size to 0. cluster_autoscaler = true is what makes a group at zero discoverable.
Workload Identity
iam_auth_method selects how pods obtain AWS credentials.
Use
pod_identity for a new environment. Use irsa only when something in your environment already depends on OIDC federation.
Under pod_identity, leave the service accounts unannotated. The installer does that for you once IAM_AUTH_METHOD is set correctly.
Read the Outputs
The install scripts find IAM roles by a substring match on the role name, not the ARN. Take the part after the last slash:
arn:aws:iam::111122223333:role/acme-prod-app-workload becomes acme-prod-app-workload.The PREFIX Shortcut
If you setPREFIX in install.env to the same value as the module’s prefix, the installer derives these names and you can leave them unset:
CLUSTER_NAMEbecomes<PREFIX>-eksRDS_IDENTIFIERbecomes<PREFIX>-rdsS3_BUCKETbecomes<PREFIX>-s3SQS_QUEUE_URLbecomeshttps://sqs.<AWS_REGION>.amazonaws.com/<account>/<PREFIX>-sqsAPP_WORKLOAD_ROLE_NAMEbecomes<PREFIX>-app-workloadCLUSTER_AUTOSCALER_ROLE_NAMEbecomes<PREFIX>-cluster-autoscalerCERT_MANAGER_ROLE_NAMEbecomes<PREFIX>-cert-manager-role
Certificate Ownership
Both the module and the installer can obtain a TLS certificate, and both write the samelilt-com-tls secret. Pick one.
-
Set
enable_tls_certificate = truein the module to run an ACME DNS-01 challenge against your Route53 zone and store the certificate in Vault. LeaveENABLE_CERT_MANAGER=falseininstall.env. -
Or leave the module’s flag at
falseand setENABLE_CERT_MANAGER=trueininstall.env, which makes cert-manager the permanent owner of the secret.
Version Pinning
The module is vendored into the tarball at a single commit. Readterraform-modules/lilt-aws-env/PROVENANCE.md in the extracted tarball to see which commit shipped with your release.
To source the module from a location of your own, copy the terraform-modules/lilt-aws-env directory wherever suits your layout and point source at it. Pin by commit rather than by branch so that a given apply is reproducible.
Known Constraints
-
eks_service_cidrdefaults to empty, which lets AWS pick10.100.0.0/16. Changing this value later replaces the cluster. Pin it before your first apply if you might ever need a different range. -
enable_karpenter = truecreates the AWS prerequisites, the IAM role and the SQS interruption queue. It does not install the Karpenter controller. - Let’s Encrypt limits you to five certificates per identifier set per 168 hours. Repeated rebuilds of the same environment exhaust that quota.
Next Steps
- Install from a bastion — the module gives the cluster a private API endpoint, so the installer runs from inside the VPC.
- Install System (AWS EKS) — configure
install.envand run the install.

