What's Changed
New Contributors
- @dmux made their first contribution in #1203
- @thejusdutt made their first contribution in #1201
[1.4.7] — 2026-07-26
Added
- Amazon Bedrock AgentCore — new service emulator — the agent-runtime control plane and data plane are now emulated. The
bedrock-agentcore-controlendpoint implementsCreateAgentRuntime,GetAgentRuntime,ListAgentRuntimes,UpdateAgentRuntime,DeleteAgentRuntime,ListAgentRuntimeVersions, and the runtime-endpoint operations (CreateAgentRuntimeEndpoint,GetAgentRuntimeEndpoint,ListAgentRuntimeEndpoints,UpdateAgentRuntimeEndpoint,DeleteAgentRuntimeEndpoint); thebedrock-agentcoredata-plane endpoint implementsInvokeAgentRuntime, which returns the invocation payload echoed back.CreateAgentRuntimereportsCREATINGandUpdateAgentRuntimereportsUPDATINGbefore settling toREADY, each update bumpsagentRuntimeVersion, ARNs follow the realagent/{uuid}:{version}andagentEndpoint/{uuid}shapes, and all state is account+region scoped. Reported by @wolfgangmeyers. - SNS —
ListPlatformApplications— the mobile-push action returnedInvalidActioneven though platform applications created withCreatePlatformApplicationwere already stored. It now lists the caller's platform applications with their attributes andNextTokenpagination; results are account+region scoped, matching AWS's per-region platform applications. Reported by @ctalibard-sk. - Kinesis Data Firehose —
AWS::KinesisFirehose::DeliveryStreamCloudFormation support — stacks containing a delivery stream failed withUnsupported resource typeeven though the Firehose API already implementedCreateDeliveryStream. The resource now provisions through CloudFormation into the existing Firehose control plane (S3, Extended S3, Iceberg, and the other destination configs),Refreturns the delivery stream name, andFn::GetAtt Arnreturns its ARN. Contributed by @squirmy. Reported by @ryan-bennett. - Kinesis Data Firehose — Apache Iceberg (S3 Tables) delivery — a DirectPut delivery stream with an
IcebergDestinationConfigurationnow actually writes records into the target S3 Tables Iceberg table, not just provisions the stream. Each record routes to its destination table from theDestinationTableConfigurationList(or a transform Lambda'smetadata.otfMetadata), and the row operation follows real Firehose Merge-on-Read semantics:insertby default,update/deletematched on the table'sUniqueKeys(a record whose operation needs keys but has none is dropped to the error path, as on AWS). Rows are written through the S3 Tables Iceberg REST catalog using the bundled DuckDB engine and are immediately queryable. Reported by @ryan-bennett. - Region scoping — Amazon MWAA, Amazon EKS, and AWS Transfer Family — state is now isolated by account and region, so same-named resources in different regions no longer collide. Persisted state carries a versioned regional schema (on-disk format v3) that an older binary refuses rather than misreads. Contributed by @Areson.
- S3 —
GetObjectAttributes—GET /{bucket}/{key}?attributesreturned the object body instead of the attributes document. It now returns aGetObjectAttributesResponsecarrying only the fields named in the requiredx-amz-object-attributesheader (ETag,Checksum,ObjectParts,StorageClass,ObjectSize): theETagis emitted without the surrounding quotes the HTTP header carries,StorageClassis omitted for S3 Standard objects (as on AWS),Checksumreports the object's stored checksum with itsChecksumType, andObjectPartslists the parts of a multipart-completed object. HonorsversionId, and returnsNoSuchKey/NoSuchBucketfor missing objects. Reported by @JayJuch.
Fixed
- SQS —
QueueUrlused a hardcodedlocalhosthost, breaking Docker-executed Lambdas — a Node.js Lambda running underLAMBDA_EXECUTOR=dockercould not post to SQS without hardcoding the endpoint in its client: the AWS JS SDK v3 SQS client uses the returnedQueueUrlas its request endpoint (useQueueUrlAsEndpoint), and every URL was rendered ashttp://localhost:4566/…, which inside the Lambda container resolves to the container itself rather than the host running MiniStack, so the request failed with connection refused.CreateQueue,GetQueueUrl, andListQueuesnow renderQueueUrl(s) using the caller's incomingHostheader (how they actually reached MiniStack, e.g.host.docker.internal:4566), the same approach LocalStack takes; internal queue state stays keyed on canonical URLs and lookups remain host-agnostic. An explicitly configuredMINISTACK_HOSTpins the host and disables the rewrite. Contributed by @thejusdutt. Reported by @Millroy094. - DynamoDB — validation and read metering aligned with real AWS — a batch of parity fixes driven by the dynamodb-conformance suite. Numeric values with surrounding whitespace or underscores (
" 5","1_000") are now rejected; document nesting is capped at 32 levels; partition and sort key values are capped at 2048 and 1024 bytes and expression strings at 4096 bytes.CreateTablevalidates indexProjectionsettings (INCLUDErequiresNonKeyAttributes,KEYS_ONLYforbids them, unknown types are rejected) and rejects aStreamSpecificationwithStreamEnabled: falsealongside aStreamViewType.UpdateTablemergesAttributeDefinitionsby name and prunes ones no longer referenced by the key schema or any index.PutItem,UpdateItem, andBatchWriteItemreject wrong-typed, non-scalar, or empty values written into a secondary-index key attribute.QueryandScanreject incompatibleSelect/ProjectionExpressioncombinations with the AWS messages, and a composite index excludes items missing its range key (sparse indexes).ConditionExpressionBETWEENvalidates that the lower bound does not exceed the upper at parse time. PartiQLUPDATE/DELETEreturn{"Items": []}rather than an empty object. Eventually-consistent reads now meter 0.5 RCU (strongly-consistent reads 1.0). Empty binary set members are accepted; only empty string-set members are rejected. - S3 Tables — Iceberg REST catalog returned AWS-shaped errors instead of the spec envelope — the
/icebergendpoints returned{"__type": "NotFoundException", ...}on a missing namespace or table, but the Iceberg REST OpenAPI requires{"error": {"message", "type", "code"}}. Spec-compliant REST clients (DuckDB, Spark, Trino) treat aLoadTable404 as "proceed to create", but only when it is a properNoSuchTableException; the AWS shape made them abort, so writing to an S3 Tables Iceberg table over the REST catalog failed. Errors on the/icebergsurface now use the REST spec envelope (NoSuchTableException/NoSuchNamespaceException), leaving the S3 Tables control plane's AWS error shape unchanged. - Lambda (Docker executor) — Docker-in-Docker ZIP functions failed with
invalid mount config for type "bind"— when MiniStack ran inside a container andLAMBDA_REMOTE_DOCKER_VOLUME_MOUNTwas set (as the README previously advised), the runtime container was created with a bind mount whose source was the volume name rather than an absolute path, so Docker rejected it withmount path must be absoluteand every ZIP invocation failed. In-container runs now always populate the sibling container's/var/task(and/var/runtimeforprovided.*) viadocker cpover the host socket — no shared volume required.LAMBDA_REMOTE_DOCKER_VOLUME_MOUNTis deprecated and ignored. Reported by @smoores-dev. - Cognito — pools with
UsernameAttributesused the raw email or phone number asUsernameinstead of a generated UUID — in a user pool configured for email or phone sign-in (UsernameAttributes),AdminCreateUserstored and returned the submitted email/phone as theUsername, but real Cognito treats that value as an alias and assigns an immutable system-generated UUID as the actualUsername. TheUsernameis now a UUID forUsernameAttributespools, the alias resolution paths (invitation email, duplicate detection, Hosted UI login) key off it, and changing the email attribute afterwards no longer changes theUsername. Contributed by @kjdev.