What's Changed
New Contributors
- @iot-rocket made their first contribution in #1347
[1.4.16] — 2026-08-12
Added
- Aurora DSQL emulator — control plane over the REST-JSON API (cluster lifecycle, tags, and cluster policies;
clientTokenidempotency,deletionProtectionEnabled,expectedPolicyVersionconcurrency). WithDSQL_STRICT=1and Docker, each cluster gets a real Postgres container fronted by an in-process wire-protocol proxy enforcing DSQL's SQL subset; otherwise it goesACTIVEmetadata-only. Tunable viaDSQL_BASE_PORT/DSQL_STRICT/DSQL_PERSIST/DSQL_PG_IMAGE. Contributed by @ry-allan.
Fixed
- CloudFormation — resources unchanged by a stack update are left alone — an unchanged resource was reprocessed on every update, and a type with no update handler fell back to create with a fresh random name, orphaning the real resource (and any
Ref/Fn::GetAttto it). Unchanged resources are now skipped, and auto-generated names are a deterministic hash of (stack name, logical id). Also fixes theAWS::Events::EventBus"already exists" update failure. Contributed by @ryan-bennett. - CloudFormation —
AWS::ApiGatewayV2::Authorizersurvives a property update — with no update handler, changing a property fell back to create and minted a second, orphaned authorizer; an update handler now mutates the existing record in place. Contributed by @ryan-bennett. - CloudFormation —
AWS::SSM::Parameter::Value<...>parameters resolve against SSM — the SSM parameter name was passed straight through, soRefreturned the name instead of the stored value; it's now resolved against Parameter Store (a missing name fails the stack withValidationError). Contributed by @ryan-bennett. - CloudFormation — a
DELETE_COMPLETEstack's name can be re-created — a deleted stack stayed addressable by name, sodeploytook the update path ("cannot be updated") instead of re-creating. A deleted stack is now addressable only by its 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. - S3 — versioned objects retain their custom metadata — the per-version record dropped
x-amz-meta-*, preserved headers, and content-encoding, and versionedGetObject/HeadObjectbypassed the metadata emitter; each version now stores and returns its own metadata. Reported by @Kaphaalor. - S3 —
GetBucketLocationreturns the bucket's stored region — the location was compared against the configurable default region (so a non-us-east-1default blanked it) and buckets created without aLocationConstraintstored no region; a bucket now records its signing region andGetBucketLocationechoes it, returning empty only forus-east-1. Contributed by @iot-rocket. - API Gateway (REST) — custom Lambda authorizers are invoked on the request path — a
CUSTOMmethod never called its authorizer.TOKEN/REQUESTauthorizers now run on the data path:401on a missing identity source,403onDeny/no-match,authorizerResultTtlInSecondscaching, andcontext(stringified) plusprincipalIdinjected intorequestContext.authorizer.AWS_IAMmethods require anAuthorizationheader (403); SigV4 is not verified. Reported by @iot-rocket. - API Gateway (REST) — an unsupported resource or method returns
403— an unmatched path returned404and a matched resource with no method returned405; both now return403 Missing Authentication Token(a methodless resource does not fall through to a{proxy+}sibling). Reported by @iot-rocket. - Route 53 — a change is born
PENDINGthen flips toINSYNC— every change was createdINSYNC, soGetChangenever returnedPENDING; changes are nowPENDINGand flip toINSYNCon the firstGetChangeread. Reported by @jayjanssen.