What's Changed
New Contributors
- @jeffreyheller made their first contribution in #2386
[1.5.32] — 2026-10-23
Added
- EC2 — Verified Access control plane — instances, trust providers (
oidc, andjamf,crowdstrikeandjumpclouddevices), groups,load-balancerandnetwork-interfaceendpoints, trust provider attachments, instance logging configuration, and group and endpoint policies, as theaws_verifiedaccess_*Terraform resources call them, with AWS's codes, messages and check order. UnderAUTH=trueeach call is authorized on every resource AWS checks it against. No access evaluation or Cedar parsing;rdsandcidrendpoints andNativeApplicationOidcOptionsanswerUnsupportedOperation. Contributed by @kharabasz. - Step Functions — Distributed Map — a Map whose
ProcessorConfigmode isDISTRIBUTEDran inline, with no map run and itsItemReaderignored; it now creates a Map Run (ListMapRuns,DescribeMapRun,UpdateMapRun,ListExecutionswithmapRunArn) whose items run as child executions under<state machine>/<label>, reads its items from S3 (s3:getObjectas JSON, JSONL or CSV,s3:listObjectsV2object metadata,MaxItems), and fails withStates.ExceedToleratedFailureThresholdpast its tolerated failures. Reported by @cupidchan. - SSM — service settings —
GetServiceSetting,UpdateServiceSettingandResetServiceSetting, per account and region, persisted.SettingValueis validated for the ids whose accepted values AWS documents, and/ssm/parameter-store/default-parameter-tiersets theTierof aPutParameterthat names none. Unblocks Terraform'saws_ssm_service_setting. Contributed by @skialpine. - Auth — SigV4a signatures are verified under
AUTH=true— requests signed withAWS4-ECDSA-P256-SHA256, which SDKs use for Multi-Region Access Points, were refused for every IAM user. Header and presigned S3 signatures are now checked with the P-256 key SigV4a derives from the secret, with their date or expiry, and anX-Amz-Region-Setthat leaves out the serving region is refused (RegionSetMismatchon S3, the unknown-key error elsewhere). Contributed by @iot-rocket.
Fixed
- Auth — requests without credentials are anonymous in every service — under
AUTH=truea request with noAuthorizationheader and no query signature ran as the account root everywhere but S3; it is now refused in the service's own error, as on AWS:MissingAuthenticationToken403 from Query and REST-XML services,MissingAuthenticationTokenExceptionfrom JSON services,AccessDenied403 from SQS,UnrecognizedClientExceptionfrom Secrets Manager. Operations the SDKs send unsigned (Cognito sign-in,GetId,AssumeRoleWithWebIdentity), SNSConfirmSubscriptionandUnsubscribe, API Gateway and Function URL invokes and S3 keep their behaviour. Contributed by @iot-rocket. - Auth — a query signed for
s3is refused by other services — underAUTH=truea SigV4 presigned query with ans3credential scope skipped the signature check when another service served it; it is now refused withSignatureDoesNotMatch"Credential should be scoped to correct service: ''. ", as AWS answers, while S3 keeps verifying its own presigned URLs. Reported by @iot-rocket. - S3 — access points and Multi-Region Access Points under
AUTH=true— an access point policy was stored but never applied, and unsigned requests, SigV2Authorizationheaders andPutBucketPolicy/DeleteBucketPolicythrough an access point were served; a request through an access point alias or ARN is now allowed on the access point by an identity policy or its policy, an unsigned or SigV2-header one gets 400InvalidRequest, bucket policy writes get 403AccessDenied, and SigV2 presigned URLs for an access point ARN verify. MRAP requests are authorized on the member bucket and then on the MRAP. Contributed by @iot-rocket. - S3 — ACLs and Block Public Access — on a
BucketOwnerEnforcedbucket ACL writes answered 200 and a stored grant still opened the bucket;PutBucketAclandPutObjectAclnow answer 400AccessControlListNotSupported, uploads refuse any ACL but an owner-only one, andCreateBucketor a switch toBucketOwnerEnforcedrefuses a granting ACL withInvalidBucketAclWithObjectOwnership. UnderAUTH=truea new bucket has all four Block Public Access settings on, as on AWS, so a public policy or ACL answers 403AccessDeniedandCreateBucketwith a public ACLInvalidBucketAclWithBlockPublicAccessError;RestrictPublicBucketsdrops a bucket policy only when it is public. Contributed by @iot-rocket. - S3 — CORS under
AUTH=true— every preflight answered 200 withAccess-Control-Allow-Origin: *, whatever the bucket's CORS configuration; a preflight now has to match one of the bucket's rules (403AccessForbiddenwithout a configuration or a match, 400BadRequestwithoutOrigin) and gets that rule's headers. Contributed by @iot-rocket. - S3 — presigned expiry and multipart object size — under
AUTH=truea presigned URL withoutX-Amz-Expiresnever expired; it now answers 400AuthorizationQueryParametersError"Query-string authentication version 4 requires the X-Amz-Algorithm, X-Amz-Credential, X-Amz-Signature, X-Amz-Date, X-Amz-SignedHeaders, and X-Amz-Expires parameters.", and a negative value "X-Amz-Expires must be non-negative".CompleteMultipartUploadchecksx-amz-mp-object-size: a size other than the parts' total answers 400InvalidRequest"The provided 'x-amz-mp-object-size' header value 11 does not match what was computed: 10", a non-numeric one "Value for x-amz-mp-object-size header is invalid: 'abc'". Reported by @adzcodemi. - CloudFront — origins that name a load balancer or a Function URL in this MiniStack — a custom origin at a load balancer's
DNSNameor a Function URL's<url-id>.lambda-url.<region>.on.awsanswered 502, as for any AWS hostname. A load balancer is now reached on its HTTP listener at the origin'sHTTPPortand a Function URL over HTTPS, with the origin's custom headers, so a target that checks a secret header works;OriginReadTimeoutapplies (504). A Function URL refuses a forwarded viewerHostwith 403{"Message":null}and an unsignedAWS_IAMURL answers 403{"Message":"Forbidden"}, as on AWS. Reported by @kinoh and @smiley-uriux. - CloudFront — functions — a viewer-request function that returned the request it was given rebuilt the query string, so
?flagreached the origin as?flag=; it is now rebuilt only when the returnedquerystringdiffers.CreateFunctionkeeps itsTags(deleted with the function), answers invalid base64 code withMalformedInput"Invalid Base64 encoding", and refuses a missing code, configuration, runtime or name and invalid tags in oneMalformedXMLbefore the name lookup, thenInvalidTaggingfor repeated,aws:or more than 50 keys. Contributed by @jeffreyheller and @kharabasz. - ALB —
X-Forwarded-*andX-Amzn-Trace-Idas the load balancer sets them — targets got an incomingX-Forwarded-Forunchanged and a client-sentX-Forwarded-Proto/X-Forwarded-Port, and Lambda targets none of them; all targets now getX-Forwarded-Forwith the client address appended (kept or dropped underrouting.http.xff_header_processing.modepreserve/remove),X-Forwarded-ProtoandX-Forwarded-Portfrom the listener, and anX-Amzn-Trace-Idwith a newRoot, or aSelfadded to or updated in the one sent. Reported by @kinoh. - Lambda — Function URLs as AWS serves them — URL ids are 32 lowercase letters and digits; the event's headers carry the URL's own
host,x-forwarded-for(the first address sent, or the caller),x-forwarded-port443,x-forwarded-protohttps,x-amzn-trace-idand the TLS fields;requestContext.accountIdisanonymousfor anAuthTypeNONEURL; and responses carryx-amzn-RequestIdandX-Amzn-Trace-Id, withx-amzn-ErrorTypeAccessDeniedExceptionon a 403. Reported by @smiley-uriux. - Lambda — versions, layers and containers —
Publish: trueon create or code update overwrote$LATEST'sVersion, so$LATESTdisappeared fromListVersionsByFunction; it now stays$LATEST. A layer MiniStack doesn't hold from another account, such as Datadog's, resolves as an empty layer instead ofAccessDeniedException. Function containers no longer publish port 8080 on every host address: none withDOCKER_NETWORK,127.0.0.1otherwise. Contributed by @skialpine and @kharabasz. Reported by @cupidchan. - API Gateway — HTTP API request ids and
AWS_IAMheaders — an HTTP API's responses carriedx-amzn-requestidandx-amz-request-id; they now carryapigw-requestid, 16 base64 characters, as AWS does. UnderAUTH=truea RESTAWS_IAMmethod served a bearer token or a lower-case algorithm; it now answers 403IncompleteSignatureExceptionwith API Gateway's message. Contributed by @jeffreyheller and @iot-rocket. - API Gateway v2 — WebSocket connections —
DeleteConnectionanswered 204 but left the socket open; it now closes it,GetConnectionandPostToConnectionanswer 410GoneException, and$disconnectruns after the close. A route whose Lambda is a container image or another runtime now runs it,PostToConnectionsends a text frame, and routes and stages keepRouteResponseSelectionExpression,ModelSelectionExpression,AccessLogSettings,ClientCertificateIdandDeploymentId. Contributed by @toby6578. Reported by @cupidchan. - AppSync Events —
AUTH=truechecks the Event API's authorization — an HTTP publish, a WebSocket connection or a subscription was accepted with any API key or none unlessAPPSYNC_EVENTS_ENFORCE_AUTHwas set; it now needs what the API or channel namespace accepts (an API key, a SigV4 signature, a Cognito or OIDC token), and a refused publish answers 401UnauthorizedException"You are not authorized to make this call.". Contributed by @iot-rocket. - Cognito — signing keys, managed login and federation — every pool signed with one shared key (
kidministack-key-1); each pool now has its own access and ID token keys at its JWKS URI. Managed login refuses PKCEplain, an unregisteredredirect_uriand an unknowngrant_type(400unsupported_grant_type); a federated user joins<user pool id>_<provider name>and carriesidentities; an OIDC provider with onlyoidc_issuertakes its endpoints from the issuer's/.well-known/openid-configuration. Contributed by @kinoh. Reported by @cupidchan. - Cognito —
client_credentials—/oauth2/tokenissued a token to a client withoutclient_credentialsinAllowedOAuthFlows; it now answersinvalid_grant(invalid_scopefirst for an unknown scope), and the pre token generation trigger runs for this grant only whenLambdaVersionisV3_0. Contributed by @iot-rocket. - IoT — MQTT delivery as AWS IoT does — an unacknowledged QoS 1 message was resent every 10 seconds with DUP set; it is now resent after 30 seconds with DUP 0, on the open connection and after a persistent session resumes, and a No Local subscription receives the client's own messages, as AWS IoT Core ignores that option. Contributed by @iot-rocket.
- IoT — thing-group membership by ARN —
AddThingToThingGroupandRemoveThingFromThingGroupignoredthingGroupArnandthingArnand were authorized on the request path; they now act on the group and thing the ARNs name, refuse a mismatched or foreign ARN with 400InvalidRequestException, and underAUTH=trueare checked on the group and then the thing. Contributed by @iot-rocket. - CloudWatch — alarm tags and
DatapointsToAlarm—PutMetricAlarmandPutCompositeAlarmdroppedTagson create; they are now stored over CBOR, JSON 1.0 and Query and ignored on update, as on AWS, with AWS'sValidationError,MalformedInputandaws:-key refusals. An alarm withoutDatapointsToAlarmno longer reports it asEvaluationPeriods. Contributed by @kharabasz. - DynamoDB — PartiQL statements are parsed as DynamoDB parses them — a parser replaces the regular-expression reader and answers malformed statements with AWS's messages (
Statement wasn't well formed, can't be processed: Unexpected term,Missing right-hand side expression of infix operator,Aliasing is not supported, positions asat <line>:<column>:<length>); it skips comments, reads every number literal form, and supportsORDER BY,attribute_exists,attribute_not_exists,size,attribute_type,IS,set_add,set_delete,FROM ... WHERE ... SETandEXISTS(SELECT ...)inExecuteTransaction. Reported by @hicksy (paritysuite.org). - DynamoDB — validation order, numbers and limits — transactions and batches report their member errors together before any table lookup; numbers are range-checked with their full exponent (
Number overflow) and duplicate set members reported in byte order; legacyExpectedconditions are validated; UpdateItem's 400KB check charges the request clause by clause before the condition;SET l[n]past the end appends instead of padding withNULL. Reported by @hicksy (paritysuite.org). - ElastiCache — transit encryption, AUTH tokens and subnet groups — a group with
TransitEncryptionEnabledand anAuthTokenserved plaintext without a password; it now serves TLS only, signed by the CA at/_ministack/elasticache/ca.pem, requires the token, andModifyReplicationGroupappliesROTATE,SETandDELETE.CreateCacheSubnetGroupnow keeps its subnets, VPC and tags, and answersInvalidSubnet,CacheSubnetGroupAlreadyExistsandCacheSubnetGroupInUse. Reported by @aditya-drizz. - ECS — capacity provider strategies — a service or task with
capacityProviderStrategydropped it and reportedlaunchTypeEC2; the strategy is now kept without alaunchType, the cluster's default applies when neither is given, both together are refused withInvalidParameterException"Specifying both a launch type and capacity provider strategy is not supported. Remove one and try again.", andAWS::ECS::Servicepasses it through. Reported by @aditya-drizz. - RDS —
MaxAllocatedStorageonly with storage autoscaling — every DB instance reportedMaxAllocatedStorageequal to its allocated storage; it is now present only when storage autoscaling was turned on. Reported by @aditya-drizz. - Reset —
/_ministack/resetno longer removes another MiniStack's containers — the OpenSearch, OpenSearch Serverless, DSQL, ECS and EKS resets removed every container with the service's label on the Docker daemon; they now remove only this instance's. Contributed by @jeffreyheller.