What's Changed
New Contributors
[1.4.10] — 2026-08-03
Added
- CloudFront — cache, origin request, and response headers policies — full CRUD plus
GetConfigandListDistributionsBy...IdforCachePolicy(/2020-05-31/cache-policy),OriginRequestPolicy(/origin-request-policy), andResponseHeadersPolicy(/response-headers-policy), so Terraform'saws_cloudfront_cache_policy,aws_cloudfront_origin_request_policy, andaws_cloudfront_response_headers_policycreate, read, update, and delete end-to-end. Each config round-trips in full:CachePolicyConfig(MinTTL/DefaultTTL/MaxTTLandParametersInCacheKeyAndForwardedToOrigin),OriginRequestPolicyConfig(header/cookie/query-string behaviors and name lists), andResponseHeadersPolicyConfig(CORS, security headers, server-timing, custom and remove headers).ETagis returned on every read,If-Matchis enforced on update/delete (InvalidIfMatchVersion/PreconditionFailed), and the...AlreadyExists/NoSuch.../...InUseerror codes match AWS. Reported by @wparad. - Cognito — state is now account- and region-scoped — user pools, pool domains, identity pools, and identity tags were account-scoped and leaked across regions. They now scope by account and region, and unsigned IDP / Identity data-plane requests infer the owning region from pool and identity IDs, tokens, sessions, or unambiguous client ownership. Persisted state carries the versioned regional schema (on-disk format v3) that an older binary refuses rather than misreads; legacy resources self-place from their region-bearing IDs. Contributed by @Areson.
- CloudFormation — state is now account- and region-scoped — stacks, stack events, exports, and change sets were account-scoped, so same-name stacks collided across regions and exports leaked into cross-region
Fn::ImportValuelookups. They now scope by account and region; asynchronous stack work retains the owning region and nested stacks stay co-located with their parent. Contributed by @Areson. - EKS —
ListIdentityProviderConfigs—GET /clusters/{name}/identity-provider-configswas unimplemented and returnedNo route. It now returns the AWS-shapedidentityProviderConfigslist ({name, type}) and aResourceNotFoundExceptionfor an unknown cluster. Contributed by @b-rajesh. - DynamoDB PartiQL —
RETURNING,REMOVE, and richerWHEREpredicates —ExecuteStatementnow supportsRETURNING ALL OLD */ALL NEW */MODIFIED OLD */MODIFIED NEW *onUPDATEandRETURNING ALL OLD *onDELETE, theREMOVEclause, andbegins_with/IN/IS MISSING/IS NOT MISSINGpredicates. AnUPDATEwhoseWHEREmatches no item now returnsConditionalCheckFailedExceptionrather than a silent no-op, matching AWS.
Fixed
- IoT — binary topic-rule payloads are no longer corrupted — the rules engine built every rule event by decoding the payload as UTF-8 with
errors="replace", so a payload that is not valid UTF-8 reached the action with each non-ASCII byte replaced byU+FFFD.encode(<expr>, 'base64')is now supported and encodes the payload as published, soSELECT encode(*, 'base64') AS data FROM 'telemetry'delivers{"data": "<base64>"}that decodes back to the published bytes — the documented way to reach a Lambda action, which does not accept binary input. No lossy decode remains on the publish → rule → invoke path; a payload that is not valid UTF-8 and whose SELECT projects no attributes dispatches no action rather than dispatching corrupted text. Contributed by @maximoosemine. - IoT — topic-rule SQL is now evaluated — the rules engine routed a publish to its actions but ignored the rule's
SELECTclause, so a rule declaringSELECT deviceId AS id FROM 'sensors/+/telemetry'delivered the whole message instead of the projection. The SELECT clause is now parsed and projected —*, attribute paths,ASaliases,topic()/topic(n),timestamp(), and literals, with unaliased items named as AWS names them and missing attributes omitted — for both delivery paths, Basic Ingest (wheretopic()reports the topic after the rule prefix) and a publish matching theFROMfilter. A JSON payload underSELECT *still arrives as the parsed object. Contributed by @maximoosemine. - ACM — wildcard SAN DNS validation record now matches its base domain — a certificate with a wildcard subject alternative name emitted a validation
ResourceRecordnamed_acme-challenge.*.example.com, so Terraform'saws_acm_certificate_validationnever found the record itsaws_route53_recordhad created and failed withmissing DNS validation record. Real ACM strips the leading*., so*.example.comandexample.comshare one_acme-challenge.example.comCNAME with an identical name and value.RequestCertificatenow emits that collapsed record, so the wildcard and apex entries line up and the validation resource resolves. Reported by @wparad. - API Gateway — HTTP API routes are selected by specificity, not creation order — the v2 router returned the first route whose method and path matched in insertion order, so a dedicated route (e.g.
POST /items) could lose to a greedyANY /{proxy+}catch-all depending on which was created first duringterraform apply. Matching routes are now ranked so the most specific one wins, as real API Gateway always dispatches to the most specific match. Contributed by @Lukasdoe. - EC2 —
DescribeAvailabilityZonesnow returns real AZ IDs — every zone reported itsZoneIdas a copy of itsZoneName(e.g.us-east-1aunder both), but AWS deliberately differs: names are shuffled per account while IDs are region-coded and stable.ZoneIdis now the region-coded form (use1-az1,euc1-az1,apse2-az1, …), matching AWS's coding across every region. Contributed by @bandle. - DynamoDB —
ProjectionExpressionlist-index results no longer carrynullplaceholders — projecting a list element (e.g.#i[2]) returned the element behind sparsenullentries ([null, null, {…}]) instead of the single projected element, and a sibling attribute in the same projection left the placeholders in place. Projected list results are now compacted to only the referenced elements. - Persistence — MediaConnect state now persists, and regionalized services carry downgrade protection — MediaConnect had restore logic but was never registered for saves, so its state was lost across restarts; it now persists. Kinesis, Firehose, KMS, EventBridge, ElastiCache, Pipes, Scheduler, SNS, and MediaConnect now advertise the on-disk format version (v3) that an older binary refuses rather than misreading their region-scoped state. Contributed by @Areson.
- CloudWatch —
DescribeAlarmsover CBOR broke the Terraform AWS provider ≥ 6.50 — alarmStateUpdatedTimestamp/AlarmConfigurationUpdatedTimestampwere serialized as bare unsigned integers in the smithy-rpc-v2-cbor response, so the provider's typed decoder (CloudWatch uses CBOR from provider 6.50) failed the read-back withunexpected value type cbor.Uintandaws_cloudwatch_metric_alarmcould not be created. Timestamp members are now encoded as CBOR tag 1 (epoch date-time), which the decoder expects; integer members such asPeriodandEvaluationPeriodsare unchanged. Reported by @sdreger.