Configuration

Everything Laminar needs lives in laminar.yml. Per-stage files (laminar-dev.yml, laminar-prod.yml) are merged over the base.

Minimal example

name: my-api
region: us-east-1          # or AWS_REGION / us-east-1
runtime: python           # python | go | php | laravel | fargate | ec2
handler: handler.app
memory_mb: 512
timeout: 30

Stages

Define per-stage overrides under stages:. A stage block is deep-merged over the base.

stages:
  dev:
    memory_mb: 256
  production:
    memory_mb: 1024
    domain: api.example.com
    certificate_arn: arn:aws:acm:REGION:ACCOUNT_ID:certificate/CERTIFICATE_ID

You can also keep per-stage files (laminar-dev.yml, laminar-stg.yml, laminar-prod.yml); they are merged on top of laminar.yml.

Domains

# External (internet-facing)
domain_name: api.example.com
certificate_arn: arn:aws:acm:REGION:ACCOUNT_ID:certificate/CERTIFICATE_ID

# Internal (VPC-only); auto suffix defaults to internal.local
internal_domain:
  enabled: true
  domain_name: api.internal.example.com   # optional; else <name>.<stage>.<suffix>

VPC

vpc:
  vpc_id: vpc-xxxx
  subnet_ids: [subnet-a, subnet-b]
  security_group_ids: [sg-xxxx]
  nat_enabled: true

Runtime blocks

Runtime-specific settings:

# Fargate
fargate:
  cpu: 256
  memory: 512
  port: 8080
  desired_count: 1
  assign_public_ip: false   # set false for private subnets + NAT

# Lambda extras
lambda:
  secrets_prefix: /my-api/prod/
  parameters_prefix: /my-api/prod/

# EC2
ec2:
  instance_type: t3.micro
  container_port: 3000
  alb_enabled: true

AWS access (cross-account)

aws:
  profile: prod-acct        # optional
  region: eu-west-1         # optional
  assume_role_arn: arn:aws:iam::<target>:role/LaminarDeploymentRole
  external_id: <secret>

See Cloud & cross-account.

App resources

storage:, queues:, caches: and databases: declare S3/SQS/ElastiCache/RDS — see App resources.