infra/README.md
Pulumi Infrastructure-as-Code for Suna
┌─────────────────────────────────────────────────────────┐
│ CLOUDFLARE │
│ │
│ api.kortix.com ──► Worker (api-kortix-router) │
│ │ │
│ ┌────────────────┴────────────────┐ │
│ ▼ ▼ │
│ ACTIVE_BACKEND=lightsail (future: ecs) │
│ │ │ │
│ ▼ ▼ │
│ api-lightsail.kortix.com api-ecs.kortix.com │
│ (Tunnel) (Direct to ALB) │
└─────────┬─────────────────────────────────┬──────────────┘
│ │
▼ ▼
┌─────────────────────────────────────────┐ ┌───────────────────────────────────┐
│ LIGHTSAIL (Prod) │ │ ECS (Prod) │
│ Cloudflared → localhost:8000 │ │ Cluster: suna-ecs │
│ │ │ Fargate + Fargate Spot │
└─────────────────────────────────────────┘ │ Auto-scaling (CPU/Memory) │
│ ALB → Target Group → Tasks │
└───────────────────────────────────┘
cd infra
npm install
# For production
cd environments/prod
../scripts/setup-prod-config.sh
# Preview changes
pulumi preview
# Deploy
pulumi up
All sensitive values are stored in Pulumi config (encrypted). See Pulumi.prod.yaml.example for required values.
| Key | Description |
|---|---|
secretsManagerArn | AWS Secrets Manager ARN for environment variables |
cloudflareTunnelId | Cloudflare Tunnel ID |
| Key | Description |
|---|---|
vpcId | VPC ID |
privateSubnets | Private subnet IDs (JSON array) |
publicSubnets | Public subnet IDs (JSON array) |
albSecurityGroupId | ALB security group ID |
ecsSecurityGroupId | ECS tasks security group ID |
targetGroupArn | ALB target group ARN |
loadBalancerArn | ALB ARN |
albDnsName | ALB DNS name |
containerImage | ECR image URL |
lightsailKeyPairName | SSH key pair name |
alertEmails | Alert email addresses (JSON array) |
See Pulumi.prod.yaml.example for all optional settings with defaults.
Estimated monthly costs (us-west-2):
| Setup | Cost |
|---|---|
| 2x t4g.medium On-Demand | ~$49/mo |
| 2x t4g.medium Spot | ~$15/mo |
| 1 On-Demand + 1 Spot | ~$32/mo |
| Alarm | Threshold | Severity |
|---|---|---|
| CPU Warning | > 70% | Warning |
| CPU Critical | > 85% | Critical |
| Memory Warning | > 75% | Warning |
| Memory Critical | > 90% | Critical |
| No Running Tasks | < 1 | Critical |
| High Latency | P99 > 2000ms | Warning |
| High Error Rate | > 5% | Warning |
Access via AWS Console or exported URL in pulumi stack output.
infra/
├── components/ # Reusable Pulumi components
│ ├── autoscaling/ # ECS autoscaling policies
│ ├── compute/ # EC2 capacity (ASG, launch template, capacity provider)
│ ├── disaster-recovery/ # Backup and failover
│ ├── ecs/ # ECS cluster, service, task definitions
│ ├── iam/ # IAM roles and policies
│ ├── monitoring/ # CloudWatch alarms and dashboards
│ └── types.ts # TypeScript interfaces
├── environments/
│ ├── dev/
│ ├── staging/
│ └── prod/
│ ├── index.ts
│ ├── Pulumi.yaml
│ └── Pulumi.prod.yaml.example
└── scripts/
└── setup-prod-config.sh
pulumi importpulumi config set --secret <key> <value># View current config
pulumi config
# View stack outputs
pulumi stack output
# Destroy infrastructure
pulumi destroy
# Import existing resource
pulumi import aws:ecs/cluster:Cluster suna-ecs arn:aws:ecs:...