DocsAWS 101BlogServices

Infrastructure as Code

MiniStack is a drop-in endpoint override for the four major IaC tools. No special plugin, no auth dance — point your provider at http://localhost:4566 and use any credentials.

Terraform

Compatible with AWS Provider v5 and v6. The minimal override:

provider "aws" {
  region                      = "us-east-1"
  access_key                  = "test"
  secret_key                  = "test"
  s3_use_path_style           = true
  skip_credentials_validation = true
  skip_metadata_api_check     = true
  skip_requesting_account_id  = true

  endpoints {
    s3             = "http://localhost:4566"
    dynamodb       = "http://localhost:4566"
    sqs            = "http://localhost:4566"
    sns            = "http://localhost:4566"
    lambda         = "http://localhost:4566"
    iam            = "http://localhost:4566"
    ec2            = "http://localhost:4566"
    ecs            = "http://localhost:4566"
    cloudformation = "http://localhost:4566"
    route53        = "http://localhost:4566"
    cloudwatch     = "http://localhost:4566"
    secretsmanager = "http://localhost:4566"
    ssm            = "http://localhost:4566"
    kms            = "http://localhost:4566"
    rds            = "http://localhost:4566"
    sts            = "http://localhost:4566"
  }
}

Add any other service endpoints you hit (see the services catalog for the full list).

Multi-account

Use a provider alias with a distinct access_key for each simulated account. MiniStack reads the access key to pick the account ID (if it's 12 digits).

CDK

Use the cdklocal wrapper:

npm install -g aws-cdk-local
cdklocal bootstrap
cdklocal deploy

It injects AWS_ENDPOINT_URL=http://localhost:4566 and sane defaults. Works with both CDK v1 and v2.

Pulumi

Configure endpoint overrides in Pulumi.dev.yaml:

config:
  aws:region: us-east-1
  aws:accessKey: test
  aws:secretKey: test
  aws:s3UsePathStyle: true
  aws:skipCredentialsValidation: true
  aws:skipMetadataApiCheck: true
  aws:skipRequestingAccountId: true
  aws:endpoints:
    - s3: http://localhost:4566
      dynamodb: http://localhost:4566
      sqs: http://localhost:4566
      lambda: http://localhost:4566
      cloudformation: http://localhost:4566
      iam: http://localhost:4566
      sts: http://localhost:4566

CloudFormation

MiniStack has a built-in CloudFormation engine — see CloudFormation engine for the full resource-type and intrinsic-function reference.

aws --endpoint-url=http://localhost:4566 cloudformation create-stack \
  --stack-name demo \
  --template-body file://template.yaml

aws --endpoint-url=http://localhost:4566 cloudformation describe-stacks \
  --stack-name demo

Change sets, nested outputs, and cross-stack Fn::ImportValue all work. Unsupported resource types fail at CREATE_IN_PROGRESS with UnsupportedResource.

AWS SAM

MiniStack's CloudFormation engine applies the AWS::Serverless-2016-10-31 transform: a template carrying Transform: AWS::Serverless-2016-10-31 has its AWS::Serverless::* resources expanded into native CloudFormation before provisioning, via the canonical aws-sam-translator — the same library the AWS SAM CLI uses — matching AWS's server-side transform on CreateStack, UpdateStack, and CreateChangeSet.

The translator ships in the full image only (ministackorg/ministack:full). A lean image that receives a SAM template returns a clear error pointing you at the full image rather than silently failing to expand, so deploy SAM templates against the full image.

Basic AWS::Serverless::Function, AWS::Serverless::SimpleTable, and AWS::Serverless::Api shapes are expanded; SAM managed-policy templates are not fully expanded yet.

Tip: run POST /_ministack/reset between test runs to start from a clean state, or use Testcontainers to get per-test isolation.