github ministackorg/ministack v1.3.71

4 hours ago

What's Changed

New Contributors

[1.3.71] — 2026-07-06

Added

  • EventBridge Scheduler — standalone schedules now fire their targets — a background sweep evaluates each ENABLED schedule and invokes its target when due, so aws_scheduler_schedule resources actually deliver instead of being stored inert. Supports at(yyyy-mm-ddThh:mm:ss) one-time, rate(...), and cron(...) expressions; honors State, StartDate/EndDate, and ActionAfterCompletion: DELETE (one-shot cleanup after a fired at() schedule); and dispatches to Lambda, SQS, SNS, and Step Functions targets, reusing the EventBridge rule dispatch so behavior matches the rules path. FlexibleTimeWindow fires at the nominal time. Reported by @BarkinBalci.
  • Lambda — event source mappings accept and persist 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 (which surfaced as a perpetual plan diff). 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 MaximumConcurrency is rejected as a validation error rather than causing a 500. BatchSize and MaximumBatchingWindowInSeconds were already supported. Contributed by @liammizrahi.
  • Organizations — ListParents + tag ops for the OU Terraform round-trip — adds ListParents(ChildId) (returns the single parent AWS reports — {"Parents": [{"Id", "Type"}]}, Type=ROOT for the org root else ORGANIZATIONAL_UNIT — from the _ParentId already stored on every OU and account; unknown ChildIdChildNotFoundException) and TagResource / UntagResource / ListTagsForResource for taggable org resources. The Terraform/OpenTofu aws_organizations_organizational_unit Read calls both ListParents (to populate parent_id, which DescribeOrganizationalUnit omits) and ListTagsForResource on every create + refresh — even for an untagged OU. With either missing, apply hard-stops on the read-back (InvalidAction: Operation '<op>' not implemented), so a multi-OU hierarchy never finished creating and was never idempotent; with both, it applies cleanly and re-applies as a no-op. No new state. Contributed by @b-rajesh.

Fixed

  • CloudTrail — CreateTrail persists KmsKeyIdCreateTrail 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: the first plan after apply showed a kms_key_id diff that only cleared on a second apply (via UpdateTrail). CreateTrail now stores and returns KmsKeyId, normalized to a full key ARN as real AWS echoes it (a bare key id is expanded; an ARN or alias/... is kept), and omits the field when no CMK is set so an unset trail shows no diff. UpdateTrail normalizes it the same way and likewise omits it from its response when unset. Contributed by @b-rajesh.
  • S3 — 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. Reported by @vschreiner.
  • API Gateway v2 — 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. Reported by @crestonbunch.
  • CloudFormation — 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. Contributed by @maximoosemine.

Don't miss a new ministack release

NewReleases is sending notifications on new releases.