55 id = null # string, must be specified and unique
66
77 abort_incomplete_multipart_upload_days = null # number
8+ filter_prefix_only = null # string See https://github.com/hashicorp/terraform-provider-aws/issues/23882
89 filter_and = {
910 object_size_greater_than = null # integer >= 0
1011 object_size_less_than = null # integer >= 1
@@ -39,9 +40,16 @@ locals {
3940 id = rule.id
4041
4142 abort_incomplete_multipart_upload_days = rule.abort_incomplete_multipart_upload_days # number
43+
44+ # Due to https://github.com/hashicorp/terraform-provider-aws/issues/23882
45+ # we have to treat having only the `prefix` set differently than having any other setting.
46+ filter_prefix_only = (try (rule. filter_and . object_size_greater_than , null ) == null &&
47+ try (rule. filter_and . object_size_less_than , null ) == null &&
48+ try (length (rule. filter_and . tags ), 0 ) == 0 &&
49+ try (length (rule. filter_and . prefix ), 0 ) > 0 ) ? rule.filter_and.prefix : null
50+
4251 filter_and = (try (rule. filter_and . object_size_greater_than , null ) == null &&
4352 try (rule. filter_and . object_size_less_than , null ) == null &&
44- try (length (rule. filter_and . prefix ), 0 ) == 0 &&
4553 try (length (rule. filter_and . tags ), 0 ) == 0 ) ? null : {
4654 object_size_greater_than = try (rule. filter_and . object_size_greater_than , null )
4755 object_size_less_than = try (rule. filter_and . object_size_less_than , null )
@@ -84,7 +92,9 @@ locals {
8492 id = try (var. lifecycle_rule_ids [i ], " rule-${ i + 1 } " )
8593
8694 abort_incomplete_multipart_upload_days = rule.abort_incomplete_multipart_upload_days # number
87- filter_and = try (length (rule. prefix ), 0 ) == 0 && try (length (rule. tags ), 0 ) == 0 ? null : {
95+
96+ filter_prefix_only = try (length (rule. prefix ), 0 ) > 0 && try (length (rule. tags ), 0 ) == 0 ? rule.prefix : null
97+ filter_and = try (length (rule. tags ), 0 ) == 0 ? null : {
8898 object_size_greater_than = null # integer >= 0
8999 object_size_less_than = null # integer >= 1
90100 prefix = rule.prefix == " " ? null : rule.prefix # string
@@ -133,7 +143,7 @@ locals {
133143 # enabled the transition for both current and non-current version.
134144 rule. enable_deeparchive_transition != true ? [] :
135145 [{
136- newer_noncurrent_versions = null # string
146+ newer_noncurrent_versions = null # integer >= 0
137147 noncurrent_days = rule.noncurrent_version_deeparchive_transition_days # integer >= 0
138148 storage_class = " DEEP_ARCHIVE"
139149 }],
@@ -156,14 +166,28 @@ resource "aws_s3_bucket_lifecycle_configuration" "default" {
156166 status = rule. value . enabled == true ? " Enabled" : " Disabled"
157167
158168 # Filter is always required due to https://github.com/hashicorp/terraform-provider-aws/issues/23299
159- filter {
160- dynamic "and" {
161- for_each = rule. value . filter_and == null ? [] : [rule . value . filter_and ]
162- content {
163- object_size_greater_than = and. value . object_size_greater_than
164- object_size_less_than = and. value . object_size_less_than
165- prefix = and. value . prefix
166- tags = and. value . tags
169+ dynamic "filter" {
170+ for_each = rule. value . filter_prefix_only == null && rule. value . filter_and == null ? [" empty" ] : []
171+ content {}
172+ }
173+
174+ # When only specifying `prefix`, do not use `and` due to https://github.com/hashicorp/terraform-provider-aws/issues/23882
175+ dynamic "filter" {
176+ for_each = rule. value . filter_prefix_only == null ? [] : [" prefix" ]
177+ content {
178+ prefix = rule. value . filter_prefix_only
179+ }
180+ }
181+
182+ # When specifying more than 1 filter criterion, use `and`
183+ dynamic "filter" {
184+ for_each = rule. value . filter_and == null ? [] : [" and" ]
185+ content {
186+ and {
187+ object_size_greater_than = rule. value . filter_and . object_size_greater_than
188+ object_size_less_than = rule. value . filter_and . object_size_less_than
189+ prefix = rule. value . filter_and . prefix
190+ tags = rule. value . filter_and . tags
167191 }
168192 }
169193 }
0 commit comments