What's Changed
New Contributors
- @ppettitau made their first contribution in #1464
[1.5.0] — 2026-08-23
Added
- IAM — opt-in request authorization (
AUTH=true) — withAUTH=trueMiniStack evaluates the caller's IAM policies before serving a request and answers403 AccessDenied(User: {arn} is not authorized to perform: {action}) when they do not allow it, across control-plane and data-plane paths (S3 object access,execute-api:Invoke,lambda:InvokeFunctionUrl, and per-service actions resolved from the botocore model). SigV4 signatures are still not validated — the access key only identifies the principal — so this is authorization, not authentication. Off by default (AUTH=false), leaving existing allow-all behavior unchanged. - Concurrency — a blocking handler no longer stalls concurrent requests — the request-serving event loop is captured at startup and blocking service work runs on worker threads, with a helper that lets a worker thread re-enter an async handler safely; work is routed by whether it needs to call back into the server. Contributed by @Areson and @iot-rocket.
- CloudFront — SaaS Manager (multi-tenant distributions) — connection groups and distribution tenants provision with ETag /
If-Matchconcurrency, per-tenant WAF association, tenant invalidations, and domain tooling. A tenant requires atenant-onlydistribution (InvalidAssociation), CNAMEs are unique across tenants and distribution aliases (CNAMEAlreadyExists), deleting a distribution or connection group that still has tenants is refused (ResourceInUse/CannotDeleteEntityWhileInUse), and both families are taggable; async deploy, DNS and certificate workflows resolve immediately. Contributed by @mjdavidson. - EC2 — instances can have a real box behind them (
RegisterImage) —RunInstancesreturned arunningrecord and booted nothing.RegisterImagenow takes a container reference inImageLocationand returns anami-id whose launch boots that image as a container, its IP becoming the instance's address sossm:SendCommandcan report a real exit code. Such an AMI isinstance-storebacked (StopInstances/StartInstancesanswerUnsupportedOperation); registering is the only opt-in, so with nothing registered EC2 never reaches for Docker.RebootInstancesalso now rejects an unknown id withInvalidInstanceID.NotFoundinstead of returningtruefor any id. Contributed by @iot-rocket. - SSM — Run Command —
SendCommand,GetCommandInvocation,ListCommandsandDescribeInstanceInformationreturnedInvalidAction. Invocations are now asynchronous as on AWS:SendCommandanswersPendingand the caller polls to a terminal state,AWS-RunShellScriptruns in the instance's container soStatusreflects the real exit code, and an instance with no agent answering is refusedInvalidInstanceId. Contributed by @bandle. - S3 — Glacier and Deep Archive restore (
RestoreObject) — an object in theGLACIERorDEEP_ARCHIVEstorage class is now unreadable until restored:GET/HEADis refused403 InvalidObjectState,RestoreObjectruns an asynchronous restore, andx-amz-restorereports the ongoing request then the restored copy's expiry.GLACIER_IRstays readable and aRestoreObjectagainst it failsInvalidObjectState, as on AWS. Reported by @mbenja086.
Changed
- Docker — the
fullimage is smaller — unused payload trimmed from the full variant. Reported by @Areson.
Fixed
- IAM — a CloudFormation-provisioned policy no longer breaks the read APIs — stack-created policies and attachments wrote shapes the IAM API never produced (
AttachedPoliciesas{PolicyName, PolicyArn}dicts,Versionsas a list), soGetAccountAuthorizationDetails,ListAttachedRolePoliciesandListPolicyVersionserrored or never matched. They now go through the IAM module, so one shape reaches every reader,AWS::IAM::ManagedPolicyhonours itsRoles/Users/Groups, and both resource types return theFn::GetAttattributes CloudFormation documents. Reported by @iot-rocket. - Lambda — Node.js ESM handlers using top-level
awaitload correctly — a handler whose module graph contains a top-levelawaitthrows Node'sERR_REQUIRE_ASYNC_MODULE, which fell through to an uncaughtRuntimeError; both Node bootstraps now treat it likeERR_REQUIRE_ESMand fall back to dynamicimport(). Contributed by @ryan-bennett. - Cognito —
ListUsersFiltermatches values case-insensitively — every comparison was an exact string match, soemail = "user@example.com"missed a profile stored asUser@Example.com. Values are now matched case-insensitively foremail,phone_number,name,suband the other profile attributes, whileusernameandstatusstay case-sensitive per the API reference. Contributed by @ppettitau. - DynamoDB — an
UpdateExpressionalias is resolved before the key-attribute check —set #pk = :pkwith#pkmapped to a non-key attribute was wrongly refused withCannot update attribute pk. This attribute is part of the key; the check now reads the alias-resolved roots, so only a path that resolves to the partition or sort key is rejected. Reported by @ppettitau. - RDS —
DescribeDBInstanceshonors SDKFilters— clients serialize filters asFilters.Filter.NwithValues.Value.N, but only the internalFilters.member.Nform was parsed, so filters such asdb-cluster-idwere ignored. Both wire forms are now parsed. Contributed by @jayjanssen. - S3 — a conditional delete of a key with no current object answers 404 —
DeleteObjectwithIf-Matchreturned 204 for a key that was absent or hidden by a delete marker, so a compare-and-swap delete reported success it never did. The condition is now evaluated against the current version only: no current object answersNoSuchKey, a differing ETagPreconditionFailed, and a matching ETag orIf-Match: *deletes. Reverted and fixed from 1.4.21. - S3 — one canonical owner ID across every S3 API —
ListBuckets,GetBucketAcl,GetObjectAcland object listings returned the account id (or a placeholder) and disagreed with one another; they now return a single stable opaque 64-character hex canonical ID, as real S3 does. Reported by @jin-gizmo. - EC2 —
DescribeAvailabilityZonesreports the zone-group fields — each zone was missinggroupName,networkBorderGroupandoptInStatus, so a consumer that reads them (Terraform'saws_availability_zonesdata source) saw them absent; standard zones now report them with anopt-in-not-requiredstatus.