What's Changed
New Contributors
[1.5.34] — 2026-10-29
Added
- Aurora DSQL —
AWS IAM GRANTandAWS IAM REVOKE— withDSQL_STRICT=1both were a syntax error, so a migration that maps a Postgres role to an IAM role stopped there. Sent on their own over the simple query protocol (psql, psycopg2), a GRANT maps one or more ARNs to a role and a REVOKE unmaps them; the mappings read back throughsys.iam_pg_role_mappingswith DSQL's six columns and types, a rollback undoes a GRANT, and a GRANT after other DDL in the same transaction answers DSQL's0A000. Re-granting raises DSQL's NOTICE and revoking a missing mapping its WARNING; an unknown role answers42704, a value that is not an ARN0P000, and granting the signed-in role to itself42501. Contributed by @toby6578. - Step Functions —
glue:startJobRunoptimized integration —arn:aws:states:::glue:startJobRunfailed with "not yet implemented"; it now starts the job run and returns itsJobNameandJobRunId. With.syncthe task waits for the run to end: aSUCCEEDEDrun returns the job run, with its timestamps in epoch milliseconds, and aFAILED,ERROR,TIMEOUTorSTOPPEDrun fails the task withStates.TaskFailedand the job run as the cause. Contributed by @mishukdutta-cz.
Changed
- S3 — with
AUTH=falsea presigned URL is accepted like a header-signed request — SigV4 presigned URLs were verified whateverAUTHwas set to, so a URL signed with a key MiniStack did not know, a wrong secret or a missing or wrong session token got 403InvalidAccessKeyId,SignatureDoesNotMatchor 400InvalidTokenwhile the same client's header-signed calls succeeded. WithAUTH=falsethe credential and signature are no longer checked; the key still selects the tenant and an expired URL still answers 403AccessDenied.AUTH=trueverifies presigned URLs as before. Contributed by @fabio-andre-rodrigues.
Fixed
- API Gateway — REST API custom domain names report
domainNameStatus—CreateDomainName,GetDomainNameandGetDomainNameshad nodomainNameStatus, so Terraform AWS provider 6.x waited forAVAILABLEuntil it timed out; they now answerAVAILABLE. A private custom domain name also has itsdomainNameIdand thedomainNameArnarn:aws:apigateway:<region>:<account>:/domainnames/<name>+<id>, whichAWS::ApiGateway::DomainNameDomainNameArnreturns too. Reported by @cupidchan. - AppConfig — KMS keys, version descriptions and deployment tags are kept —
CreateConfigurationProfileandUpdateConfigurationProfiledroppedKmsKeyIdentifier,StartDeploymentdroppedKmsKeyIdentifierandTags, andCreateHostedConfigurationVersiondropped itsDescriptionheader, so Terraform re-planned the profile and replaced the hosted version and the deployment on every apply. The profile and the deployment now returnKmsKeyIdentifieras given and the key'sKmsKeyArnwhen MiniStack's KMS holds it, the version returns itsDescriptionon create, get and list, and the deployment's tags are readable withListTagsForResource. Reported by @kharabasz. - AppConfig — Secrets Manager configuration profiles — a profile whose
LocationUriis a secret (secretsmanager://<name or ARN>or its ARN) got an empty body fromGetLatestConfigurationand its deployments reportedConfigurationLocationUrihosted.CreateConfigurationProfilenow checks theRetrievalRoleArn, the type and the secret as AWS does,StartDeploymentreads the secret version named byConfigurationVersionand keeps its value, andGetLatestConfigurationserves it, typedapplication/jsonwhen it parses as JSON andapplication/octet-streamotherwise. A missing version or deleted secret answers "Secret not found", and a secret under a customer managed key needs aKmsKeyIdentifier. Another account's secret must be named by its exact ARN, and underAUTH=trueits resource policy must let the retrieval role callGetSecretValue.StartDeploymentalso reports AWS's member validation errors first and, for a deployment in progress, "Environment currently has a state of DEPLOYING. The current deployment must finish before a new deployment can be started." Contributed by @kharabasz. - Athena — an enforced workgroup overrides the client-side result location — when a workgroup has
EnforceWorkGroupConfiguration: true,StartQueryExecutionnow writes results to the workgroup'sOutputLocation, even when the request gives its ownResultConfiguration.OutputLocation, as AWS does. Before, the request's location was used. Contributed by @mishukdutta-cz. - Athena — the result file is saved at the reported
OutputLocation— a query's<id>.csvand<id>.csv.metadataare now saved directly under the result location, at the path thatGetQueryExecutionreports, as AWS does. Before, they were saved one folder too deep, at<location>/<id>.csv/<id>.csv, so a client that read the reported path gotNoSuchKey. Contributed by @mishukdutta-cz. - Auto Scaling — a group's launch template is the EC2 template it names — a group created with
LaunchTemplateNamereported the name as itsLaunchTemplateId, andUpdateAutoScalingGroupignoredLaunchTemplate. Both calls, and CloudFormation, now look the template up and report its id and name, with theVersionas given (none when none was given), and refuse what AWS refuses withValidationError: "The specified launch template, with template name , does not exist.", "Malformed launch template Id: " and "Could not find the specified version for the launch template with ID ." Reported by @kharabasz. - CloudFront — Functions stages, statuses and ETags —
DescribeFunctionandGetFunctionwithoutStageanswer theDEVELOPMENTstage instead ofInvalidArgument, and aStageother thanDEVELOPMENTorLIVEanswersMalformedXML"1 validation error detected: Value '' at 'stage' failed to satisfy constraint: Member must satisfy enum value set: [LIVE, DEVELOPMENT]".PublishFunctiongivesLIVEtheDEVELOPMENTstage's ETag, both stages reportUNASSOCIATEDonce published (DEPLOYEDwhile a distribution uses the function) and anUpdateFunctionno longer turns them back toUNPUBLISHED. ETags have AWS's form (Eand 13 characters) andGetFunctionanswersapplication/octet-stream. Reported by @kharabasz. - EventBridge Scheduler — an event bus target publishes with its
EventBridgeParameters— a schedule whose target is an event bus put its event on the bus asaws.scheduler/Scheduled Event, so a rule matching the target's ownSourceandDetailTypenever fired; the event now carries theEventBridgeParametersSourceandDetailType, withInputas its detail. Reported by @kharabasz. - EventBridge Scheduler — schedule error messages —
GetSchedule,UpdateScheduleandDeleteSchedulefor a missing schedule now answerSchedule <name> does not exist., and a duplicateCreateScheduleanswersSchedule <name> already exists., as on AWS; the messages no longer name the group. Contributed by @kharabasz. - Glue — Glue 5 file writes to the bucket that holds
--extra-py-files— a CSV (or other plain-file) write to that bucket stayed an open multipart upload, so the job succeeded but the output folder had only a 0-bytepart-*marker under__magic_job-…/.spark-submitdownloadss3://--extra-py-filesbefore Spark starts, and the S3A filesystem it makes for that bucket saved the magicv2 committer's upload list in S3, where the commit did not look. Every S3A filesystem now tracks these uploads in memory, so the commit completes them. Glue 4 jobs useDirectFileOutputCommitterand do not change. Contributed by @mishukdutta-cz. - HTTP/2 — a connection is no longer cut after 1000 requests — Hypercorn's default
keep_alive_max_requests(1000) sent GOAWAY on an HTTP/2 connection's 1001st request and dropped its response, so a client that keeps one connection (Node's undici, gRPC) lost one request in every thousand (undici:other side closed). AWS closes client connections by keepalive duration, not request count; the limit is now 10,000,000, more than one connection sends in AWS's default hour. Contributed by @skialpine. - Kinesis — resource policies are validated and stored as AWS does —
PutResourcePolicyaccepted most invalid documents. It now runs Kinesis's checks in AWS's order with its messages (size, JSON,Version,Statement, required and prohibited fields,Sid, actions per stream or consumer, wildcard and non-AWS principals, oneResourceequal to the ARN) and, underAUTH=true, refuses principals that do not exist.GetResourcePolicyreturns the document compact, as AWS stores it. Another account's ARN answersAccessDeniedExceptionwhen MiniStack knows the account (it holds an IAM identity or a stream) andUnrecognizedClientExceptionwhen it does not, and Kinesis authorization denials name the stream. Contributed by @Jolley71717. - Lambda — a partial ARN as the
FunctionName—123456789012:function:my-function[:qualifier]resolved to the account ID as the function name, soInvokeand the other function operations failed withFunction not found: ...:function:123456789012; it now resolves as the full ARN in the caller's region, as on AWS, and gives the same result as that full ARN. Contributed by @mishukdutta-cz. - Lambda — event source mappings answer as AWS does — a Kinesis or DynamoDB Streams mapping now reports AWS's defaults (
BatchSize100,MaximumRetryAttemptsandMaximumRecordAgeInSeconds-1,BisectBatchOnFunctionErrorfalse,ParallelizationFactor1,TumblingWindowInSeconds0,DestinationConfig{"OnFailure": {}}),StateTransitionReasonUser action, andLastProcessingResultOKorPROBLEM: Function call failedinstead ofOK - N recordsandFAILED. An SQS mapping has noLastProcessingResult, as on AWS. Create, update and delete answer the transitional state (Creating,Updating,Enabling,Disabling,Deleting),UpdateEventSourceMappinganswers 202, a second mapping for the same source and function is refused withResourceConflictException, and an unknown mapping's message is AWS's. A mapping created by CloudFormation reports the same. MiniStack's states settle at once, where AWS's SQS mappings stayCreatingfor a few seconds. Contributed by @Jolley71717. - RDS — Aurora cluster Performance Insights inheritance — explicit cluster PI settings now round-trip through create/modify/describe and propagate to existing and future members. Instance-managed clusters retain their independent settings until an explicit cluster handoff. Enabled responses include the retention and PI KMS key; cluster disablement survives removal of all members. Contributed by @jayjanssen.
- Secrets Manager — a partial ARN resolves only its own secret — a partial ARN (the full ARN without the
-XXXXXXsuffix) matched any secret whose ARN started with it, so withmy-secretandmy-secret-adminboth stored, the partial ARN ofmy-secretreturnedmy-secret-adminwhen that one was created first, and a partial ARN that names no secret, such asmy-secret-adm, returnedmy-secret-admininstead ofResourceNotFoundException. It now matches only the secret whose ARN is the partial ARN plus the suffix, as on AWS. Contributed by @zach-tyl. - Step Functions —
aws-sdk:schedulertasks — a Task witharn:aws:states:::aws-sdk:scheduler:<action>failed withStates.Runtime("Service 'scheduler' is not supported in MiniStack aws-sdk integrations").createSchedule,getSchedule,updateSchedule,deleteSchedule,listSchedules,createScheduleGroup,getScheduleGroup,deleteScheduleGroupandlistScheduleGroupsnow call EventBridge Scheduler in the execution's account and region, as on AWS. The output keeps Scheduler's member names, timestamps are ISO-8601 UTC strings,StartDate/EndDateare read from ISO-8601 strings withZor a+hh:mmoffset (cut to milliseconds),listSchedulesfilters byGroupName,NamePrefixandState, and a JSON object or array given asTarget.Inputis sent as compact JSON text. A failed call reportsScheduler.<ErrorCode>with the cause suffix(Service: Scheduler, Status Code: <status>, Request ID: <id>) (SDK Attempt Count: 1). Contributed by @kharabasz. - Step Functions — JSONPath workflow variables — a JSONPath state ignored
Assign, and$namewas not resolved inParametersor intrinsic-function arguments, so a workflow that saved a result in a variable lost it.Assignnow works in JSONPath states as AWS documents:$is the result in Task, Map and Parallel states, the effective input in Choice and Wait, and the result in Pass; all assignments read the values from state entry (JSONataAssigntoo); and a Parallel branch's variables stay in the branch. Contributed by @jayjanssen. - Step Functions — state events inside a Map or a Parallel branch — the states in an inline Map item or a Parallel branch wrote no
<Type>StateEnteredor<Type>StateExitedevents, soGetExecutionHistorydid not show them. They are now in the execution history, as on AWS; for a Distributed Map they are in each child execution's history and not in the parent's. Events added at the same time from several Map items or branches can no longer get the sameid. Contributed by @mishukdutta-cz.