What's Changed
New Contributors
- @HarrisonTCodes made their first contribution in #793
- @LiamMacP made their first contribution in #798
- @b-rajesh made their first contribution in #794
- @neriyaco made their first contribution in #797
[1.3.57] — 2026-06-03
Added
- EC2 Fleet —
CreateFleet+DescribeFleets— Tier-1 capacity allocation: parsesTargetCapacitySpecification(incl.DefaultTargetCapacityTypefor spot vs on-demand),LaunchTemplateConfigs[*]withOverrides[*], andTagSpecifications.Type=instantlaunches synchronously and returns the populatedInstances/Errorsblocks;Type=maintain/requestreturnFleetIdalone withActivityStatus=pending_fulfillmentandFulfilledCapacity=0per the AWS contract. Total capacity is round-robin distributed across every(config, override)slot, with oneInstances[*]item per non-empty slot carrying its ownLaunchTemplateAndOverrides.DescribeFleetson an unknownFleetIdreturnsInvalidFleetId.NotFound(was silently empty). Unblocks Karpenter / Cluster Autoscaler local validation. Contributed by @b-rajesh. - EKS — OIDC Identity Provider Config —
AssociateIdentityProviderConfig,DescribeIdentityProviderConfig,DisassociateIdentityProviderConfigat/clusters/{name}/identity-provider-configs/{verb}. Required-field validation (oidc.identityProviderConfigName,issuerUrl,clientId); duplicate or any-second OIDC config rejected withResourceInUseException(real AWS allows one OIDC IdP per cluster); IdP ARNarn:aws:eks:{region}:{account}:identityproviderconfig/{cluster}/oidc/{name}/{uuid}returned at associate time and stable across describes so Terraform / CDK / Pulumi don't see drift; tags wired throughListTagsForResource(resourceArn=idp_arn). Issuer URL + client ID + optional username/groups claims are forwarded to the k3s API server via--kube-apiserver-arg=oidc-*flags on restart. Cluster status staysACTIVEthroughout (the work is carried in the returnedupdaterecord, not on the cluster). Contributed by @b-rajesh. - SQS —
/_ministack/sqs/messagesadmin endpoint —GETreturns every queue's messages grouped by account (MessageId,Body,MD5OfBody,SentTimestamp,VisibleAt,IsVisible,ReceiveCount,FirstReceiveTimestamp,MessageAttributes,Attributes,MessageGroupId,MessageDeduplicationId,SequenceNumber). Optional?account=<12-digit>and?QueueUrl=<url>filters. Pure introspection — does not mutatevisible_at/receive_count/ any field a concurrentReceiveMessagetouches. Mirrors the existing/_ministack/ses/messagespattern. Reported by @mbamber. MINISTACK_RDS_PUBLIC_ENDPOINTenv var — set1when ministack itself runs in Docker but RDS clients reach the engine from outside that Docker network (remote ministack host, CI runners, host-side clients).DescribeDBInstancesthen returns{MINISTACK_HOST, host_port}— the published host port — instead of the container-internal address that's invisible from outside the network. Off by default, so existing deployments (native, or in-Docker with apps on the same network) keep their current behavior byte-for-byte.
Fixed
- AppConfigData —
StartConfigurationSessionaccepts identifier by ID or name —ApplicationIdentifier,EnvironmentIdentifier, andConfigurationProfileIdentifierare documented inservice-2.jsonas accepting either form; ministack previously treated them as IDs only, so passing names (a perfectly valid AWS pattern) produced a session token that referred to a non-resolvable triple. Each identifier is now resolved through ID-first / name-fallback lookups; unresolved →ResourceNotFoundException404. Contributed by @LiamMacP. - DynamoDB —
ExportTableToPointInTimereturnsIN_PROGRESSat submit,COMPLETEDonly after the grace window — the handler previously setIN_PROGRESSthen overwrote it toCOMPLETEDon the very nextDescribeExportcall, so callers never observed an in-progress export. Submit now returnsIN_PROGRESSand the flip happens in_describe_exportonly afterMINISTACK_DDB_EXPORT_COMPLETE_AFTER_SEC(default 1s) has elapsed — matching real AWS, which always reportsIN_PROGRESSat submit time. Reported by @hicksy. Contributed by @HarrisonTCodes. - DynamoDB —
ImportTablereturnsIN_PROGRESSat submit,COMPLETEDonly after the grace window — same fix shape:ImportTablewas building the response withImportStatus=COMPLETEDsynchronously, never giving callers a chance to observe the in-progress state real AWS guarantees. Now startsIN_PROGRESSwith noEndTime;DescribeImportflips toCOMPLETEDand stampsEndTimeafterMINISTACK_DDB_IMPORT_COMPLETE_AFTER_SEC(default 1s). Reported by @hicksy. - DynamoDB PartiQL —
UPDATE/DELETEwith a false non-key predicate now returnsConditionalCheckFailedException—UPDATE "t" SET n=9 WHERE pk='x' AND name='beta'against an item withname='alpha'previously silently no-op'd (PartiQL handlers iterated all rows and matched none). AWS treats the non-key clauses as a conditional check on the PK-targeted item: if the targeted item doesn't exist or any non-PK predicate fails, the request must surfaceConditionalCheckFailedExceptionand leave the item unchanged. Also:UPDATE/DELETEwithout an=clause on every primary-key attribute now returnsValidationExceptionup front instead of falling through to the table scan. Reported by @hicksy. - EKS — IdP changes no longer mutate cluster status —
AssociateIdentityProviderConfig/DisassociateIdentityProviderConfigpreviously flippedcluster.statustoUPDATINGduring the k3s restart, then back toACTIVE. Real AWS keeps the clusterACTIVEthroughout — the work is carried in the returnedUpdaterecord, not on the cluster shape. Onlycfg.statusis mutated now. The destructive k3s restart that wipes in-cluster workloads on associate/disassociate (a local-emulator limitation — k3s can't hot-swap kube-apiserver flags) is logged as a warning so the side effect is surfaced. - EC2
CreateFleet— shape parity restored —InstancesandErrorsare now emitted only whenType=instant(the AWS-documented constraint); formaintain/requestthe response is<fleetId>alone, instances launch asynchronously,FulfilledCapacity=0,ActivityStatus=pending_fulfillment.DefaultTargetCapacityType(notType) drivesLifecycle/SpotTargetCapacity/OnDemandTargetCapacity— the previous code comparedfleet_type == "spot", which is dead since theFleetTypeenum is{request, maintain, instant}and never contains"spot". Multi-config × multi-override distribution: everyLaunchTemplateConfigs[*].Overrides[*]slot now receives its share ofTotalTargetCapacity(round-robin) and renders its ownInstances[*]item with the correctLaunchTemplateAndOverrides. Tag-spec parser also accepts the AWS pluralTagSpecifications[*].Tags[*]shape alongside the previous singular. - EC2
DescribeFleetswith an unknownFleetId→InvalidFleetId.NotFound— previously dropped silently from the fleet set, so callers had no signal that a typo'd ID hadn't matched anything. Real EC2 returns the error envelope (HTTP 400); known IDs are preserved in the requested order alongside.
Changed
MINISTACK_HOSThonored consistently across services —ecs._discover_poll_endpoint,elasticache._spawn_redis_container,opensearch._spawn_dataplane,lambda_svc._execute_function_local(subprocessAWS_ENDPOINT_URL) and several response-URL builders previously had"localhost"hardcoded and ignoredMINISTACK_HOST. They now resolve through a module-level_MINISTACK_HOST = os.environ.get("MINISTACK_HOST", "localhost"), so a ministack running on a different host can be reached over the network with the standard describe-... commands (setMINISTACK_HOST=<remote-ip>at boot). Default behavior unchanged for existing localhost deployments. Contributed by @neriyaco.