What's Changed
New Contributors
[1.5.13] — 2026-09-17
Added
- CloudFormation — the
AWS::LanguageExtensionstransform — a template declaring it was provisioned unexpanded, so anFn::ForEachleft the stack inCREATE_IN_PROGRESSfor good and anFn::ToJsonStringreached SSM as a Python dict. The transform now runs betweenAWS::Includeand SAM:Fn::ForEachover literal,CommaDelimitedListand intrinsic collections, nested and insideProperties, plusFn::LengthandFn::ToJsonString. Where the identifier is substituted, the error sentences and the unexpandedGetTemplateSummaryfollow measurements on a real account. Contributed by @iot-rocket. - RDS — IAM database authentication tokens are verified — a helper validates an SDK-generated token against the endpoint, port, database username, signing scope, lifetime and signature. Nothing calls it yet; database login itself is a later stage. Contributed by @Areson.
Changed
- Persistence — every saved snapshot is restored through the registry — a service restored its own state as a side effect of being imported, so the boot path carried a hand-maintained list of eager imports to cover the modules the router never reached. The registry now drives one restore loop, and the runtime work a restore implies runs from each module's
load_persisted_stateinstead of its import. No user-visible change. Contributed by @jgrumboe.
Fixed
- Router — the first request to any service no longer loads CloudFormation — the WaitCondition signal handler imported
cloudformation.wait_conditionsabove the path check, so every first request pulled in the whole package and, through its provisioners, AppSync and graphql; the first/_ministack/resetranappsync.reset()with it. The import now sits behind the path match, and a guard keeps it there. Reported by @ThailerL. - DynamoDB —
ImportTablereads the S3 source — the import created the table, reportedCOMPLETEDand imported nothing: the source objects were never opened. CSV andDYNAMODB_JSON, GZIP or uncompressed, are now read from the prefix and written into the table, with the counters reported as it runs and per-item errors in the/aws-dynamodb/importslog group. A missing bucket or prefix fails the import and leaves no table behind;IONandZSTDare refused with a stated reason. Contributed by @gakuto-cw21. - IAM — a Secrets Manager request is authorized against the stored secret ARN — the resource was built from the name in the request,
secret:<name>, while AWS evaluates the stored ARN with the six random characters minted atCreateSecret. The grant shape the CDK writes for a secret looked up by name,secret:<name>-??????orsecret:<name>-*, matched nothing underAUTH=true. The resource now comes from the store through the handlers' own lookup; a secret that does not exist keeps the name-derived ARN. Contributed by @iot-rocket. - IAM — a group policy document is validated, and an
AWS::IAM::Policynaming a missing entity fails —PutGroupPolicystored a malformed document; all three inline handlers now answerNoSuchEntitybeforeMalformedPolicyDocument. AnAWS::IAM::Policyskipped a Role, User or Group that was not there and reportedCREATE_COMPLETE; the resource now fails withThe role with name <name> cannot be found., and an update checks names and document before it takes the old policy off. Contributed by @iot-rocket. - IAM — three calls are authorized against the action and resource AWS uses — a Lambda Function URL invoke is checked against its function ARN, alias qualifier included, and supplies
lambda:FunctionUrlAuthType, so the policygrantInvokeUrlwrites matches. The WebSocket@connectionsAPI asks forexecute-api:ManageConnectionsinstead ofexecute-api:Invoke.iot-jobs-dataoperations are authorized underiotjobsdata:, exceptStartCommandExecution, which stays oniot:. A policy written for the old action names stops matching, as on AWS. Contributed by @iot-rocket. - Lambda — a layer shared through
AddLayerVersionPermissionattaches — every layer ARN from another account was refused before the stored policy was read. Attachment, from the API and from a CloudFormation function, andGetLayerVersionByArnnow evaluate it for account, root, public and organization grants, and an attached function keeps the content after the grant is revoked or the version is deleted. A foreign layer version that no grant covers stays refused. Contributed by @iot-rocket.