July 6, 2026 · v1.3.71
v1.3.71 makes standalone EventBridge Scheduler schedules actually fire their targets, alongside Lambda ScalingConfig and Organizations read-back support, and fixes for S3 GetObject tag count, API Gateway v2 rawQueryString encoding, CloudFormation Lambda event source mappings, and CloudTrail KmsKeyId.
ENABLED schedule and dispatches to its target — Lambda, SQS, SNS, or Step Functions — reusing the same target dispatch as EventBridge rules, so behavior matches the rules path. It supports at(yyyy-mm-ddThh:mm:ss) one-time, rate(...), and cron(...) expressions, honors State, StartDate / EndDate, and ActionAfterCompletion: DELETE (one-shot cleanup after an at() schedule fires), with FlexibleTimeWindow firing at the nominal time. Previously the scheduler API stored schedules but never fired them, so an aws_scheduler_schedule resource was inert against MiniStack.ScalingConfig (MaximumConcurrency). CreateEventSourceMapping and UpdateEventSourceMapping now accept a ScalingConfig block and echo it back on create, GetEventSourceMapping, and ListEventSourceMappings, so the SQS-trigger scaling_config { maximum_concurrency = N } on the Terraform aws_lambda_event_source_mapping resource round-trips instead of being silently dropped. MaximumConcurrency outside the AWS-valid 2–1000 range is rejected with ValidationException; ScalingConfig is honored only for Amazon SQS event sources (rejected with InvalidParameterValueException on any non-SQS source, matching AWS), and a non-integer value is rejected rather than causing a 500. Contributed by @liammizrahi.ListParents plus tag ops for the OU Terraform round-trip. Adds ListParents(ChildId) (returns the single parent AWS reports, Type=ROOT for the org root else ORGANIZATIONAL_UNIT, from the parent already stored on every OU and account; unknown ChildId raises ChildNotFoundException) and TagResource / UntagResource / ListTagsForResource. The Terraform/OpenTofu aws_organizations_organizational_unit Read calls both ListParents (to populate parent_id, which DescribeOrganizationalUnit omits) and ListTagsForResource on every create and refresh — even for an untagged OU — so with either missing a multi-OU hierarchy never finished creating; with both, it applies cleanly and re-applies as a no-op. Contributed by @b-rajesh.CreateTrail persists KmsKeyId. CreateTrail accepted KmsKeyId but dropped it (only UpdateTrail stored it), so DescribeTrails / GetTrail read it back empty and Terraform's aws_cloudtrail did not converge in a single apply. CreateTrail now stores and returns KmsKeyId, normalized to a full key ARN as real AWS echoes it, and omits the field when no CMK is set so an unset trail shows no diff. Contributed by @b-rajesh.GetObject returns x-amz-tagging-count (TagCount). GetObject now reports the object's tag count via the x-amz-tagging-count response header (surfaced by SDKs as TagCount), present only when the object carries at least one tag and omitted otherwise, matching AWS. Previously the header was never sent, so boto3 and the AWS SDK for C++ reported no TagCount for a tagged object.rawQueryString stays percent-encoded. The payload-format-2.0 proxy event's rawQueryString was rebuilt from URL-decoded query parameters, so %20 became a literal space (and a decoded = / & inside a value corrupted the query structure). Rust functions on lambda_http — which build the request URI from rawQueryString — rejected the space with InvalidUriChar and returned 502. Each key and value is now re-encoded, so rawQueryString matches AWS and SDKs parse it correctly.AWS::Lambda::EventSourceMapping round-trips all optional properties and updates in place. A CloudFormation-created mapping previously kept only FilterCriteria and silently dropped DestinationConfig, ParallelizationFactor, MaximumRetryAttempts, MaximumRecordAgeInSeconds, BisectBatchOnFunctionError, and ScalingConfig, causing perpetual Terraform/CDK diffs; all are now preserved on create. A stack update that changes the mapping now mutates it in place (same physical id), matching UpdateEventSourceMapping, instead of re-running create and leaking a duplicate mapping that double-invoked the function; an immutable change (EventSourceArn / StartingPosition) is a proper replacement.docker pull ministackorg/ministack:1.3.71 docker run -d -p 4566:4566 ministackorg/ministack:1.3.71
Or pin in compose.yaml:
services:
ministack:
image: ministackorg/ministack:1.3.71
ports:
- "4566:4566"
Issues and PRs welcome on GitHub. Discussion on r/ministack.