What's Changed
New Contributors
- @felixp-square made their first contribution in #1215
[1.4.8] — 2026-07-28
Added
- IoT — state is now account- and region-scoped — the control plane (Things, thing types, thing groups, certificates, policies, topic rules, device shadows) and the MQTT broker (clients, persistent sessions, subscriptions, retained messages) were account-scoped, so same-name resources, subscriptions, and retained messages collided or leaked across regions. All of it now scopes by account and region; the request region threads through the HTTP and WebSocket MQTT paths, and exact account/region scope is required before topic-wildcard matching so signer-controlled values can't cross regions. Persisted state carries a versioned regional schema (on-disk format v3) that an older binary refuses rather than misreads; legacy resources migrate by ARN region and retained messages migrate to the boot region. Contributed by @Areson.
- AppSync Events — state is now account- and region-scoped — Event APIs, channel namespaces, and API keys were account-scoped and collided across regions. They now scope by account and region, with the WebSocket and HTTP data planes resolving an API's creation region while preserving SigV4 credential-region enforcement, advertised-host validation, and per-API fan-out isolation. Persisted state carries the versioned regional schema (on-disk format v3) an older binary refuses; legacy child records migrate with their parent API. Contributed by @Areson.
Fixed
- Step Functions — context object paths now resolve array indexes — JSONPath references such as
$$.Map.Item.Value.values[0].namereturnednullbecause context paths used a separate dotted-key-only resolver. Context paths now retain their distinct$$.root while sharing the standard path traversal, so indexed references work inItemSelectorfields and intrinsic-function arguments. Contributed by @felixp-square. - S3 Tables — Iceberg REST commits duplicated schema/spec/sort-order entries, crashing Spark on load —
_iceberg_commit_tableappended unconditionally onadd-schema/add-spec/add-sort-order, but Spark re-declares its current unchanged schema, partition spec, and sort order on every write, so a second commit produced a duplicate id and the next table load failed building Iceberg's id-keyed maps (Multiple entries with same key). These updates are now idempotent by id, matching the invariant Iceberg's ownTableMetadatabuilder enforces.add-snapshotdeduplication is intentionally not added — that is an optimistic-concurrency concern, not a structural one. Contributed by @squirmy. - S3 Tables —
AWS::S3Tables::TableCloudFormation ignored the declared schema — the provisioner hardcoded an empty Iceberg schema and never readIcebergMetadata.IcebergSchema.SchemaFieldList, so every table created through CloudFormation had zero columns regardless of the template, and downstream consumers failed (a Firehose Iceberg-destination delivery errored withdoes not have a column with name …). The provisioner now parsesSchemaFieldList(Name/Type/Required) into the table's Iceberg schema, the same way theCreateTableAPI path does. Contributed by @ryan-bennett. - CloudFormation — cross-stack CDK deploys crashed with
'dict' object has no attribute 'startswith'—aws-cdk-localrewrites a CDK cross-stack reference into the non-AWSFn::GetStackOutputintrinsic instead ofFn::ImportValue, and the engine never resolved it, so the unresolved dict reached a provisioner (for example anAWS::Lambda::PermissionFunctionName) and rolled the stack back. The engine now resolvesFn::GetStackOutputto the named output of the referenced already-deployed stack, socdklocal deploy --allacross dependent stacks works. Reported by @jacsonrsasse.