What's Changed
New Contributors
- @david-hay made their first contribution in #436
[1.3.12] — 2026-04-24
Added
- CloudFront Functions API (stub) —
CreateFunction,DescribeFunction,GetFunction,ListFunctions,PublishFunction,UpdateFunction, andDeleteFunctionunder/2020-05-31/function*, returning XMLFunctionSummary/FunctionListplusETagheaders where the AWS SDK expects them, and raw function bytes onGetFunction. Covers Terraformaws_cloudfront_function(create +publish+ read + delete) and attaching a function ARN to distribution cache behaviors. Limitations: in-memory only (same persistence bucket as other CloudFront state); noTestFunction;KeyValueStoreAssociationsare not modeled (responses use empty associations); no execution of CloudFront Functions at the edge;DescribeFunctionrequires theStagequery parameter (DEVELOPMENT|LIVE), matching AWS;UpdateFunctioninvalidates the emulated LIVE revision until the nextPublishFunction. Contributed by @david-hay.
Fixed
- EC2
AuthorizeSecurityGroupIngressfailed on duplicate rules — ingress authorization returnedInvalidPermission.Duplicatewhen Terraform re-submitted an unchanged rule, while egress already treated duplicates as a no-op. Ingress is now idempotent in the same way, soaws_security_groupupdates no longer fail on re-authorize. Contributed by @david-hay. - IAM
CreatePolicyDescriptionfield lost on warm boot — the field was silently dropped on create and never emitted byGetPolicy. BecausedescriptionisForceNewin the Terraform AWS provider, everyaws_iam_policywith a description planned destroy-and-recreate on every warm boot, taking every attachedaws_iam_role_policy_attachmentwith it.CreatePolicynow storesDescriptionand the managed-policy XML emits<Description>when non-empty (omitted otherwise, matching real AWS). Reported by @whittin3. - IAM
GetUseromitted tags —_user_xml()never emitted a<Tags>block even thoughCreateUser/TagUserstored them correctly, so Terraform refresh sawtags_all = {}and replanneddefault_tagson every apply._user_xml()now mirrors_role_xml()'s tag serialization. Reported by @whittin3. - Lambda
CreateAlias/UpdateAliasechoed phantomRoutingConfig— Terraform sendsRoutingConfig: {"AdditionalVersionWeights": {}}even when no weighted routing is declared; the existing truthy guard stored the empty shape andGetAliasreplayed it, so Terraform planned to remove the block on every apply. Routing config is now stored only whenAdditionalVersionWeightsis non-empty, matching real AWS's "omit when empty" response shape; clearing to empty viaUpdateAliasexplicitly removes the field. Reported by @whittin3. - Lambda
CreateEventSourceMappingsilently droppedTags— the request body'sTagsparameter was never read, soListTagsreturned{}for any ESM ARN and Terraform re-added tags on every apply.CreateEventSourceMappingnow storesTags, andListTags/TagResource/UntagResourceall route ESM ARNs (arn:aws:lambda:…:event-source-mapping:<uuid>) to the ESM record. Reported by @whittin3. - API Gateway v2
contentHandlingStrategynot persisted —CreateIntegrationaccepted the field but never stored it,UpdateIntegrationwasn't in the allowlist, andGetIntegrationnever echoed it. Terraform planned an in-place update adding the field back on everyapply, and at runtime requests lostCONVERT_TO_TEXT/CONVERT_TO_BINARYpayload translation. All three paths now honour the field. Reported by @whittin3.