What's Changed
New Contributors
[1.4.2] — 2026-07-13
Added
- IoT —
AWS::IoT::TopicRuleCloudFormation support — deploying anAWS::IoT::TopicRulepreviously failed withUnsupported resource type: AWS::IoT::TopicRuleand rolled the stack back. A provisioner now creates and deletes the rule (normalizing the PascalCaseTopicRulePayload—Sql,Actions,Lambda/FunctionArn, … — to the API's camelCase shape),Refreturns the rule name andFn::GetAtt Arnthe rule ARN. The IoT control plane gains the backing operations:CreateTopicRule,GetTopicRule,ListTopicRules,ReplaceTopicRule, andDeleteTopicRule. Rules are account-scoped and persisted with the rest of the IoT state. Contributed by @maximoosemine.
Changed
- SNS, Kinesis, KMS, and ElastiCache — region-isolated state — continuing the 1.4.0 multi-region work, four more services move their state to account+region scope: SNS (topics, subscriptions, platform applications, platform endpoints), Kinesis (streams, shard iterators — which now also survive a warm boot, still subject to their 5-minute expiry — and enhanced-fan-out consumers), KMS (keys and aliases — the same alias name can now target different keys per region, as on AWS), and ElastiCache (clusters, replication groups, subnet/parameter groups, snapshots, users, user groups, and events; local Redis/Memcached container names now carry the account and region so same-name clusters coexist across regions). Same-name resources in different regions no longer collide, cross-region lookups return the same errors real AWS returns, and background pollers process each resource under its own account and region. Legacy persisted state migrates by recovering each record's region from its stored ARNs; records without an ARN migrate to the default region (
MINISTACK_REGION). Contributed by @Areson.
Fixed
- DynamoDB — validation parity with real AWS on reads, deletes, batches, and transactions — validation gaps that let malformed requests succeed silently (all verified against real AWS DynamoDB): (1)
GetItem,DeleteItem, andBatchGetItemnow reject key attributes carrying an empty string/binary value, asPutItemalready did; (2)BatchWriteItemvalidates every member before applying any — previously a bad member returned the correctValidationExceptionbut earlier members were already written; (3)TransactWriteItemsvalidates every member before applying anything and matches real AWS's two failure shapes: an empty-string/binary key value (or malformed item) is an up-front top-levelValidationException, whereas a wrong-typed key or an update-expression type error is surfaced as aTransactionCanceledExceptionwith a positionalValidationErrorcancellation reason — previously an invalid member was silently committed with no error at all; (4)Queryrejects aKeyConditionExpressionBETWEENwith inverted bounds at parse time with the AWS error message, instead of returning an empty result; (5)Queryvalidates key-condition operands like key values — an empty string/binary operand on a key attribute is rejected; (6)Queryrejects anExclusiveStartKeywhose sort value violates the range-key predicate (The provided starting key does not match the range key predicate) — such a cursor can never have been issued by a previous page; (7)UpdateItemSETrejects a document path that doesn't resolve on the item (The provided expression refers to an attribute that does not exist in the item) — e.g.list_appendon a missing attribute, whereif_not_existsis the sanctioned form; previously the assignment was silently skipped; (8)UpdateItemADD/DELETEreject non-Number/Set operands (Incorrect operand type for operator or function, with the AWS quirk that thetypeSetis reported asALLOWED_FOR_ADD_OPERANDeven forDELETE) and operands whose type doesn't match the existing attribute (An operand in the update expression has an incorrect data type) — previouslyADDcould silently replace a set attribute with a number, andDELETEsilently no-opped. All error shapes verified against real AWS DynamoDB. Contributed by @ifutivic. - DynamoDB —
Query/ScanreturnLastEvaluatedKeywhen results end exactly atLimit— real DynamoDB doesn't look ahead: whenever it stops because of the limit it returns aLastEvaluatedKey, even if nothing remains, and the follow-up page comes back empty with no key. MiniStack only returned the key when strictly more items remained, so SDK pagination helpers that rely on the exact-limit page (e.g. "has more pages" checks) diverged from AWS. Verified against DynamoDB Local. Contributed by @ifutivic. - Step Functions —
aws-sdk:lambdawrite actions —createFunction,updateFunctionConfiguration,updateFunctionCode,createAlias, andupdateAliasnow dispatch through the Lambda REST emulator (previously they failed withStates.Runtime: not yet implemented; onlygetAliasandgetFunctionConfigurationwere covered). The SFN SDK-conventionKmsKeyArnparameter is mapped to Lambda's wire-formKMSKeyArnso it's honored instead of silently ignored, task output keys use the same SFN casing convention as the other dispatchers, and Lambda errors surface with prefixed codes soCatchclauses match. Contributed by @Areson. - API Gateway v2 — WebSocket
$connectinvokes JWT authorizers — a JWT authorizer configured on the$connectroute was ignored, so any client could connect without a token. The route's authorizer is now validated exactly like the HTTP API path — missing or invalid tokens close the connection with code 1008, and validated claims and scopes are injected intorequestContext.authorizer.jwtfor the integration. Reported by @Lukasdoe. - S3 — versioned
GetObjectreturns the body after a restart withS3_PERSIST=1— object-version records live in memory only, so after a restart aGetObjectwithversionId(for the id restored via the 1.4.1 metadata sidecar) found a version record with no data and returned an empty body. Restore now seeds the current version from the on-disk sidecar, and versioned reads fall back to the persisted object body on disk. Reported by @adzcodemi. - SQS — XML error responses carry the legacy query-protocol error codes — the query-protocol (XML) error path emitted the modern JSON-protocol code in
<Code>(e.g.QueueDoesNotExist), but SDKs speaking the legacy query protocol match on the namespaced codes (e.g.AWS.SimpleQueueService.NonExistentQueue) — the sameawsQueryCompatiblemapping already sent in thex-amzn-query-errorheader on the JSON path is now applied to the XML<Code>element. Reported by @play4uman.