What's Changed
New Contributors
- @liammizrahi made their first contribution in #1029
[1.3.71] — 2026-07-06
Added
- EventBridge Scheduler — standalone schedules now fire their targets — a background sweep evaluates each
ENABLEDschedule and invokes its target when due, soaws_scheduler_scheduleresources actually deliver instead of being stored inert. Supportsat(yyyy-mm-ddThh:mm:ss)one-time,rate(...), andcron(...)expressions; honorsState,StartDate/EndDate, andActionAfterCompletion: DELETE(one-shot cleanup after a firedat()schedule); and dispatches to Lambda, SQS, SNS, and Step Functions targets, reusing the EventBridge rule dispatch so behavior matches the rules path.FlexibleTimeWindowfires at the nominal time. Reported by @BarkinBalci. - Lambda — event source mappings accept and persist
ScalingConfig(MaximumConcurrency) —CreateEventSourceMappingandUpdateEventSourceMappingnow accept aScalingConfigblock and echo it back on create,GetEventSourceMapping, andListEventSourceMappings, so the SQS-triggerscaling_config { maximum_concurrency = N }on the Terraformaws_lambda_event_source_mappingresource round-trips instead of being silently dropped (which surfaced as a perpetual plan diff).MaximumConcurrencyoutside the AWS-valid 2–1000 range is rejected withValidationException;ScalingConfigis honored only for Amazon SQS event sources (rejected withInvalidParameterValueExceptionon any non-SQS source, matching AWS), and a non-integerMaximumConcurrencyis rejected as a validation error rather than causing a 500.BatchSizeandMaximumBatchingWindowInSecondswere already supported. Contributed by @liammizrahi. - Organizations —
ListParents+ tag ops for the OU Terraform round-trip — addsListParents(ChildId)(returns the single parent AWS reports —{"Parents": [{"Id", "Type"}]},Type=ROOTfor the org root elseORGANIZATIONAL_UNIT— from the_ParentIdalready stored on every OU and account; unknownChildId→ChildNotFoundException) andTagResource/UntagResource/ListTagsForResourcefor taggable org resources. The Terraform/OpenTofuaws_organizations_organizational_unitRead calls bothListParents(to populateparent_id, whichDescribeOrganizationalUnitomits) andListTagsForResourceon every create + refresh — even for an untagged OU. With either missing,applyhard-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 —
CreateTrailpersistsKmsKeyId—CreateTrailacceptedKmsKeyIdbut dropped it (onlyUpdateTrailstored it), soDescribeTrails/GetTrailread it back empty and Terraform'saws_cloudtraildid not converge in a single apply: the firstplanafterapplyshowed akms_key_iddiff that only cleared on a second apply (viaUpdateTrail).CreateTrailnow stores and returnsKmsKeyId, normalized to a full key ARN as real AWS echoes it (a bare key id is expanded; an ARN oralias/...is kept), and omits the field when no CMK is set so an unset trail shows no diff.UpdateTrailnormalizes it the same way and likewise omits it from its response when unset. Contributed by @b-rajesh. - S3 —
GetObjectreturnsx-amz-tagging-count(TagCount) —GetObjectnow reports the object's tag count via thex-amz-tagging-countresponse header (surfaced by SDKs asTagCount), 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 noTagCountfor a tagged object. Reported by @vschreiner. - API Gateway v2 —
rawQueryStringstays percent-encoded — the payload-format-2.0 proxy event'srawQueryStringwas rebuilt from URL-decoded query parameters, so%20became a literal space (and a decoded=/&inside a value corrupted the query structure). Rust functions onlambda_http— which build the request URI fromrawQueryString— rejected the space withInvalidUriCharand returned 502. Each key and value is now re-encoded, sorawQueryStringmatches AWS and SDKs parse it correctly. Reported by @crestonbunch. - CloudFormation —
AWS::Lambda::EventSourceMappinground-trips all optional properties and updates in place — a CloudFormation-created mapping previously kept onlyFilterCriteriaand silently droppedDestinationConfig,ParallelizationFactor,MaximumRetryAttempts,MaximumRecordAgeInSeconds,BisectBatchOnFunctionError, andScalingConfig, 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), matchingUpdateEventSourceMapping, 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.