August 12, 2026 · v1.4.16
v1.4.16 adds a new service and hardens three more. Aurora DSQL arrives as a control-plane emulator with an optional real-Postgres backend, API Gateway (REST) now invokes custom Lambda authorizers on the request path, and CloudFormation stack updates stop duplicating and misresolving resources. On top of that: S3 versioned-metadata and GetBucketLocation fixes, and a Route 53 PENDING change.
clientToken create-idempotency, deletionProtectionEnabled enforcement, and expectedPolicyVersion optimistic concurrency on policy writes. With DSQL_STRICT=1 and a Docker daemon, each cluster is backed by a real Postgres container fronted by an in-process Postgres wire-protocol proxy that validates statements against DSQL's SQL subset; without strict mode a cluster goes ACTIVE metadata-only. Tunable via DSQL_BASE_PORT / DSQL_STRICT / DSQL_PERSIST / DSQL_PG_IMAGE. Contributed by @ry-allan.Ref/Fn::GetAtt to it); unchanged resources are now skipped and auto-generated names are a deterministic hash of (stack name, logical id), which also fixes the AWS::Events::EventBus "already exists" update failure. AWS::ApiGatewayV2::Authorizer now survives a property update instead of minting a second, orphaned authorizer, and AWS::SSM::Parameter::Value<...> template parameters resolve against Parameter Store instead of passing the name through. Contributed by @ryan-bennett.DELETE_COMPLETE stack's name can be re-created. A deleted stack stayed addressable by name, so aws cloudformation deploy took the update path ("cannot be updated") instead of re-creating. A deleted stack is now addressable only by its unique stack ID; describe / update / change-set by name report "does not exist", so the name re-deploys as a fresh stack. Reported by @iot-rocket.x-amz-meta-*, preserved headers, and content-encoding, and a versioned GetObject/HeadObject bypassed the metadata emitter; each version now stores and returns its own metadata. Reported by @Kaphaalor.GetBucketLocation returns the bucket's stored region. The location was compared against the configurable default region (so a non-us-east-1 default blanked it) and buckets created without a LocationConstraint stored no region; a bucket now records its signing region and GetBucketLocation echoes it, returning empty only for us-east-1. Contributed by @iot-rocket.authorizationType: CUSTOM stored its authorizer but never called it, so requests reached the integration unauthenticated. TOKEN and REQUEST authorizers now run on the data path: 401 on a missing identity source, 403 on an explicit Deny or no-matching-Allow, authorizerResultTtlInSeconds caching, and the returned context (stringified) plus principalId injected into requestContext.authorizer. AWS_IAM methods require an Authorization header (403); an unsupported resource or method now returns 403 Missing Authentication Token rather than 404/405. Reported by @iot-rocket.PENDING then flips to INSYNC. Every ChangeResourceRecordSets / CreateHostedZone change was created INSYNC, so GetChange never returned PENDING and waiters completed on their first read. Changes are now submitted PENDING and flip to INSYNC on the first GetChange read. Reported by @jayjanssen.docker pull ministackorg/ministack:1.4.16 docker run -d -p 4566:4566 ministackorg/ministack:1.4.16
Or pin in compose.yaml:
services:
ministack:
image: ministackorg/ministack:1.4.16
ports:
- "4566:4566"
Issues and PRs welcome on GitHub. Discussion on r/ministack.