-y without --method), install.sh calls aws cloudformation create-stack with the right parameters derived from your pack and profile choices. The template lives at deploy/cloudformation/template.yaml in the Lowkey repository.
What the stack creates
One CloudFormation stack creates all of the following:- VPC, public subnet, internet gateway, and route table — a fresh network by default; reusable if you pass
ExistingVpcId - Security group — egress-all; inbound SSH disabled by default
- IAM role and instance profile — scoped to your chosen profile
- EC2 instance — ARM64 Graviton, sized per profile
- SSM session preferences — for secure shell access without open ports
- Security service subscriptions (optional) — Security Hub, GuardDuty, Inspector, Access Analyzer, Config recorder
Using the installer (recommended)
The simplest path is to let the installer handle everything:aws cloudformation create-stack for you.
Deploying the template manually
If you prefer to deploy directly, clone the repo and runaws cloudformation create-stack yourself:
Key template parameters
You rarely set these by hand. The installer computes them from your pack, profile, and flags. This table is the reference if you deploy the template directly or need to understand what was set.
| Parameter | Example value | Description |
|---|---|---|
PackName | openclaw | Which agent pack to install |
ProfileName | builder | IAM permission profile |
EnvironmentName | openclaw-1-4521 | Name prefix for every resource in the stack |
InstanceType | t4g.xlarge | EC2 instance type (must be ARM64) |
DefaultModel | us.anthropic.claude-opus-4-6-v1 | Default AI model ID for the pack |
ModelMode | bedrock | Model access mode: bedrock, litellm, or api-key |
BedrockRegion | us-east-1 | Bedrock region (can differ from deploy region) |
LokiWatermark | openclaw-1-4521 | Tag applied to every resource for easy cleanup |
EnableSecurityHub | true | Enable AWS Security Hub |
EnableGuardDuty | true | Enable Amazon GuardDuty |
EnableInspector | true | Enable Amazon Inspector |
EnableAccessAnalyzer | true | Enable IAM Access Analyzer |
EnableConfigRecorder | true | Enable AWS Config recorder |
ExistingVpcId | vpc-0abc123 | Reuse an existing VPC instead of creating one |
ExistingSubnetId | subnet-0def456 | Public subnet in the existing VPC (required with ExistingVpcId) |
SSHAllowedCidr | 127.0.0.1/32 | CIDR allowed to SSH. Default disables SSH entirely — use SSM instead |
KiroFromSecret | /lowkey/kiro-api-key | Secrets Manager id or ARN for the Kiro API key (kiro-cli pack only) |
LiteLLMApiKey | — | NoEcho: true — only used when ModelMode=litellm |
ProviderApiKey | — | NoEcho: true — only used when ModelMode=api-key |
RepoBranch | main | Git branch of the Lowkey repo to clone on the instance |
Watching deploy progress
The installer streams stack events to your terminal. If you deployed manually, watch events with:Finding your instance ID after deploy
Once the stack reachesCREATE_COMPLETE, retrieve the instance ID from the stack Outputs:
Updating the stack
To change parameters after initial deploy — for example to upgrade the instance type — runupdate-stack:
Tear-down
Delete the stack to remove every resource it created — VPC, EC2, IAM role, security services, and all:If you reused an existing VPC by passing
ExistingVpcId, that VPC is not deleted when the stack is removed. You brought it, so you keep it.