What's Changed
[1.5.6] — 2026-09-02
Added
- Amazon Transcribe (
transcribe) — new service emulator for batch transcription jobs:StartTranscriptionJob,GetTranscriptionJob,ListTranscriptionJobs,DeleteTranscriptionJob, verified against botocoretranscribe-2017-10-26. Jobs walkQUEUED→IN_PROGRESS→COMPLETED(paced byTRANSCRIBE_JOB_RUN_SECONDS), read their media from MiniStack S3 bys3://, path-style or virtual-hosted URI, and write the transcript back to S3 in the real result format, withIdentifyLanguage/IdentifyMultipleLanguages,ContentRedaction,Subtitlesand speaker labels honoured and aTranscribe Job State Changeevent published on the default bus at terminal states. The transcript is deterministic canned text — there is no speech recognition. Streaming, call-analytics and medical jobs, custom vocabularies and tagging are not implemented. Contributed by @ppettitau. - Lambda — SnapStart — the
SnapStartparameter onCreateFunctionandUpdateFunctionConfigurationwas silently swallowed, so a deployment that enables it saw permanent Terraform drift. It now round-trips:$LATESTechoesApplyOnwithOptimizationStatus: Off, a published version reportsOnand walksPending→Active, and the documented constraints are enforced — Java 11+/Python 3.12+/.NET 8+ zip runtimes only (container images accepted), no ephemeral storage above 512 MB, refused withInvalidParameterValueException. The mechanism is emulated, not just the shape: publishing initializes the version's execution environment right then (warm worker or RIE container), so the first invoke is warm, invoking whilePendinganswersResourceConflictException, a broken init fails the publish (State: Failed), andsnapshot-restore-pybefore-snapshot/after-restore hooks run during a published version's init. No snapshot exists locally; Java CRaC and .NET hooks do not fire. - RDS — MySQL writer quiescence primitives — writer-fence verification, transaction/XA drain inventory and fenced GTID capture for Aurora MySQL global-cluster switchover, deadline-bounded and fail-closed; dormant until a switchover orchestrator calls them. Contributed by @Areson.
- Glue / S3 Tables — Iceberg-Spark catalog for Glue 5.0 — jobs declaring
GlueVersion5.0 resolve the Iceberg-Spark catalog, covering the dispatch and parse differences between Spark 3.5 and 3.3 and Iceberg v3, and the embedded Iceberg REST catalog now serves clients beyond DuckDB and Spark:createNamespaceis routed instead of answering an internal error, and the pyiceberg-visible defects (format-version, unresolved schema-id) are fixed. Reported by @kevinprince.
Fixed
- ALB — the
authenticate-oidclistener action authenticates — the action's config was accepted and discarded, so every request reached the target unauthenticated. The documented flow now runs end to end: redirect to theAuthorizationEndpoint, code exchange at theTokenEndpoint, claims from theUserInfoEndpoint, session in shardedAWSELBAuthSessionCookiecookies, and targets receivex-amzn-oidc-identity,x-amzn-oidc-accesstokenandx-amzn-oidc-data— the last as AWS's signed ES256 JWT (kid,signer,iss,client,exp; base64 segments padded, as ALB emits them) with client-supplied copies stripped. Rule actions now run as a chain inOrder, andModifyListenerupdates the default rule the data plane serves.authenticate-cognitoanswers501. Contributed by @dhanesh. - Router — an unregistered
Hostis no longer routed by service-token substring — the host-pattern step ran unanchorediot\.,logs\.,email\.regexes over any unclassifiedHost, soprobe.iot.example.comansweredUnsupported IoT pathandlogs.example.comlanded in CloudWatch Logs. Host patterns are now consulted only for hosts the stack serves — a single label, a two-label alias, an IP literal, or a name underlocalhost,amazonaws.com,MINISTACK_HOSTor the container hostname, matched at a label boundary — and each service token is anchored at a label start, soprobe-iot.localhostis not IoT while<bucket>.s3.<region>,<api-id>.execute-api.<region>and the other AWS shapes route exactly as before. Contributed by @iot-rocket. - IAM — the AWS-managed policies a CDK, SAM or Serverless deployment attaches resolve by their real ARNs — the seeded catalogue filed the Lambda execution-role policies under
arn:aws:iam::aws:policy/<Name>while AWS publishes them under…:policy/service-role/<Name>, the only ARN those tools emit, soGetPolicyansweredNoSuchEntityand underAUTH=truean attached policy granted nothing. The catalogue now carries them under their real path with the documents from the AWS Managed Policy Reference, reportsPolicyNameandPathas AWS does, and adds the missing CDK/API Gateway/IoT and SQS/Kinesis/DynamoDB execution-role policies. The path-less spellings answerNoSuchEntity, as on AWS. Contributed by @iot-rocket. - IAM enforcement — the
aws:ResourceAccountcondition key resolves — withAUTH=truea statement conditioned onaws:ResourceAccount(ors3:ResourceAccount) never matched, so CDK's own bootstrap template failed asset publishing. The key resolves to the resource-owning account (the ARN's account field wins); a condition naming another account still denies, and every other unknown key keeps denying. Contributed by @iot-rocket. - IAM enforcement — S3 multipart uploads authorize as
s3:PutObject—CreateMultipartUploadwas checked as a literal action no policy grants, so every upload above the SDK's multipart threshold was denied. The multipart operations now map to the actions S3 documents (s3:PutObject,s3:AbortMultipartUpload, the two listing actions),?versionsiss3:ListBucketVersions, object-level?tagging/?acluse the object actions, and configurationDELETEs authorize as theirPut*action. Contributed by @iot-rocket. - Lambda — a failed Docker cold start no longer leaks its extraction directory — anything raised between unpacking the code/layers and the container start (a corrupt layer zip, a Docker socket read-timeout) orphaned a full
ministack-lambda-docker-*tree, compounding to gigabytes under Docker-API pressure. Cleanup now covers every exit until the container is handed to the warm pool. Reported by @iot-rocket. - RDS — a container worker no longer clobbers an intervened stop —
StopDBInstancelanding while the background worker was still starting the instance's container was undone when the worker finished and set the status back toavailable; the worker now finishes without overwriting a stop, soDBInstanceStatusand DB-proxyTargetHealthstaystopped/UNAVAILABLE.