What's Changed
[1.5.33] — 2026-10-26
Added
- Kinesis — stream and consumer resource policies —
PutResourcePolicy,GetResourcePolicyandDeleteResourcePolicyansweredInvalidAction; they now store a policy per stream or consumer, persisted and dropped with it, with AWS's checks in AWS's order: the ARN's region (InvalidArgumentException"The region specified in the ARN '' does not match the endpoint region"), the policy ("Policy validation error: This policy contains invalid Json", "Missing required field Version" or "Statement", and per statement the actions a stream or consumer can share and aResourceequal to the ARN, with the statement's line and column), then the resource ("Stream under account not found.").GetResourcePolicywithout a policy answers{"Policy": "{}"}andDeleteResourcePolicy"No resource policy found for resource ARN .". Reported by @Jolley71717. - Lambda — Kinesis event source mappings across accounts — a function can map a stream in another account in the same region;
CreateEventSourceMappingreads the stream first and answers "Received Exception while reading from provided stream. " with the reason ("No account found for the given parameters", "Stream under account not found.", or underAUTH=truethe read the stream's policy doesn't allow the function's execution role), and the policy is checked again on every poll. Another region's stream answers "Event source region must match Lambda region ". Reported by @Jolley71717. - CloudFormation —
AWS::Athena::WorkGroup— created with itsDescription,State,TagsandWorkGroupConfiguration, updated in place, replaced whenNamechanges and deleted with the stack;Refreturns the name andFn::GetAttCreationTimeand the effective engine version. Reported by @mishukdutta-cz.
Fixed
- S3 — GET, HEAD and DELETE error order and responses — under
AUTH=trueordinary header-signed downloads check the endpoint and signing region before the bucket's home region, then credentials and missing buckets, and HeadObject, HeadBucket and DeleteObject check the home region first; a DELETE sent to another regional endpoint no longer deletes the object. In both auth modes aNoSuchKeycarriesKey, HEAD errors have an empty body and noContent-Length, and HeadBucket reports the bucket's region (also on a denial) and its ARN. Iceberg REST HEAD requests keep their JSON errors. Contributed by @gakuto-cw21. - S3 — persisted keys that a file path can't hold survive a restart — with
S3_PERSIST=1a folder marker such asproject/Incoming/came back without its slash, and keys under it, a key under another key's object (a/bbesidea) or one with doubled or dot segments (x//y) were lost or rewritten; they are now stored by an encoded name under the bucket's.ministack-keysdirectory, and every other key keeps its path, so earlier data still loads. Reported by @jasonthagerty. - ALB — requests reach targets as sent — instance and IP targets now get the path with its percent-encoding, the query string unchanged, the client's
Hostas the load balancer sends it (no port on 80 or 443, the listener's port otherwise, unmodified withrouting.http.preserve_host_header.enabled), the client'sAccept-Encoding, and OPTIONS requests instead of a gateway-made CORS answer. A Lambda target's event carries the last value of a repeated query key, not decoded, no multi-value keys unless enabled, andbody: "". Contributed by @skialpine. - ALB — responses and actions — the load balancer's own responses (a Lambda target's, fixed-response, redirect, authentication, its errors) carry
Server: awselb/2.0unlessrouting.http.response.server.enabledisfalse, it writes its ownDateover an instance or IP target's, and the listener's response-header attributes (the CORS ones,strict_transport_security,content_security_policy,x_content_type_options,x_frame_options) are applied. A redirect fills#{protocol},#{port}and#{query}from the listener and request (http://host:80/path), andauthenticate-oidcon a 443 listener names its callback without the client's port. Contributed by @skialpine. - CloudFront — response headers — responses carry only the origin's headers plus CloudFront's own, with
X-Amz-Cf-Idas URL-safe base64 of 40 bytes andVia: 1.1 <32 hex>.cloudfront.net (CloudFront);Server: CloudFrontis added only when a viewer-response function ran and the origin sent none, and a Lambda Function URL origin's response carries a singlex-amzn-RequestId. Contributed by @skialpine. - All services — status line,
DateandServer— HTTP/1.1 status lines carry their reason phrase (HTTP/1.1 200 OK), every response carries oneDate, also a WebSocket handshake and Hypercorn's own errors, and no response carriesServer: hypercorn-h11. Contributed by @skialpine. - API Gateway — an HTTP API's
rawQueryStringis the query string as sent —?flagreached the function asflag=; the Lambda proxy and REQUEST authorizer events now carry the request's own query string. Contributed by @skialpine. - Lambda — packages, code caches and restore —
CreateFunction,UpdateFunctionCodeandPublishLayerVersionrefuse a package that is not a zip, an empty one included, withInvalidParameterValueException"Could not unzip uploaded file. Please check your file, then try to upload again.", leaving the function's code as it was. Two MiniStacks on one host no longer remove each other's extracted code, and restoring persisted state keeps one copy of code that versions share. Contributed by @skialpine. - Lambda — Kinesis event source mapping filters — a
FilterCriteriapattern never matched a Kinesis record, so a filtered mapping dropped everything; metadata fields such aspartitionKeynow match at the top of the pattern anddataas base64-decoded JSON, and data that isn't JSON still matches metadata patterns. Contributed by @Jolley71717. - DynamoDB —
TransactWriteItemsfollows DynamoDB's check order — anUpdatewhose condition failed is cancelled withConditionalCheckFailedeven when its update expression can't be applied to the item, an update-expression error on one member no longer hides a failed condition on another, a missing table answersResourceNotFoundException, and abegins_withcondition with a number operand answersValidationException. Contributed by @jun-ut. - Step Functions — JSONata on
Map,Paralleland variables — an inlineMapevaluatesItems,ItemSelector,MaxConcurrency,OutputandAssign(anItemsthat isn't an array fails withStates.QueryEvaluationError), aCatchonMaporParallelapplies itsOutputandAssign, and a variable assignednullreads back asnull. Contributed by @mishukdutta-cz. - Glue — Spark job arguments and botocore — Spark scripts get
--JOB_NAMEand--JOB_RUN_ID(a run'sArgumentsstill win,pythonshellscripts don't get them), and a job's own botocore loads from where the script asks, so a--py-fileszip that holds botocore no longer fails withDataNotFoundError. Contributed by @mishukdutta-cz. - OpenSearch — engine heap and the container reaper — engine containers run with a 512 MB heap instead of the image's 1 GB, and the reaper no longer removes a live domain's stopped engine. Contributed by @skialpine.