Skip to content

Conversation

@johannes-gehrs
Copy link
Contributor

@johannes-gehrs johannes-gehrs commented Jul 29, 2025

Rollback Plan

If a change needs to be reverted, we will publish an updated version of the library.

Changes to Security Controls

no security related changes as far as I can tell

Description

tl;dr


Removes the warning which makes the user provide either filter or prefix.

The documentation clearly states that omitting the filter rule is possible. In this respect, the TF resource differs from the AWS API, which requires a filter.

If no filter is set, then the provider code will set an empty filter

	// The AWS API requires a value for `filter` unless `prefix` is set. If `filter` is set, only one of
	// `and`, `object_size_greater_than`, `object_size_less_than`, `prefix`, or `tags` can be set,
	// and an empty `filter` is valid. Setting `filter.prefix` to "" is equivalent to an empty `filter`.
	// However, the provider historically has allowed `filter` to be null, empty, or have one child value set.
	// (Setting multiple elements would result in a run-time error)
	// For null `filter`, send an empty LifecycleRuleFilter

This PR also makes an attempt to improve the documentation for this aspect of the provider, bringing it in line with what the documentation actually says.

Relations

Closes #42714
Closes #43439
Closes #41917

Bottom line:

The issue affects users following the documented pattern of using filter {} for bucket-wide lifecycle rules, with the problem persisting across multiple provider versions from v5.90.0 onwards.

Issues:

Major Issues:

Closed but not fixed:

PRs:

Related Issues:

Timeline Summary

  1. PR resource/aws_s3_bucket_lifecycle_configuration: Fix additional "Invalid XML" errors #41662 (merged in v5.90.0) - Introduced the problematic ExactlyOneOf validator
  2. Issue [Bug]: aws_s3_bucket_lifecycle_configuration using recommended empty filter issues warning #41710 - First major report of the warning issue (155 reactions!)
  3. PR resource/aws_s3_bucket_lifecycle_configuration: Validation and remove spurious "known after apply" #42036 (merged in v5.94.0) - Added more validation, making the problem worse
  4. Multiple duplicate issues - Since v5.90.0, Invalid Attribute Combination on filter prefix for aws_s3_bucket_lifecycle_configuration #42274, How do I specify a lifecycle rule that applies to the whole bucket? the saga continues... #42112, [Bug]: s3_bucket_lifecycle_configuration warning: filter is required? #41782, etc.
  5. PR [Bug fix] Remove warning when the filter argument in aws_s3_bucket_lifecycle_configuration is empty #41917 - Validator modification approach
  6. PR Fix misleading S3 Lifecycle rule warning #43590 - Validator removal approach (recommended solution)

References

#41268 (comment)

Output from Acceptance Testing

make testacc PKG=s3 TESTS=TestAccS3BucketLifecycleConfiguration_
make: Verifying source code with gofmt...
==> Checking that code complies with gofmt requirements...
TF_ACC=1 go1.24.5 test ./internal/service/s3/... -v -count 1 -parallel 20 -run='TestAccS3BucketLifecycleConfiguration_'  -timeout 360m -vet=off
2025/07/29 17:01:55 Creating Terraform AWS Provider (SDKv2-style)...
2025/07/29 17:01:55 Initializing Terraform AWS Provider (SDKv2-style)...
=== RUN   TestAccS3BucketLifecycleConfiguration_frameworkMigrationV0_rule_NoFilterOrPrefix
=== PAUSE TestAccS3BucketLifecycleConfiguration_frameworkMigrationV0_rule_NoFilterOrPrefix
=== RUN   TestAccS3BucketLifecycleConfiguration_frameworkMigrationV0_FilterWithPrefix
=== PAUSE TestAccS3BucketLifecycleConfiguration_frameworkMigrationV0_FilterWithPrefix
=== RUN   TestAccS3BucketLifecycleConfiguration_frameworkMigrationV0_filterWithEmptyPrefix
=== PAUSE TestAccS3BucketLifecycleConfiguration_frameworkMigrationV0_filterWithEmptyPrefix
=== RUN   TestAccS3BucketLifecycleConfiguration_frameworkMigrationV0_Filter_objectSizeGreaterThanToPrefix
=== PAUSE TestAccS3BucketLifecycleConfiguration_frameworkMigrationV0_Filter_objectSizeGreaterThanToPrefix
=== RUN   TestAccS3BucketLifecycleConfiguration_frameworkMigrationV0_Filter_objectSizeLessThanToPrefix
=== PAUSE TestAccS3BucketLifecycleConfiguration_frameworkMigrationV0_Filter_objectSizeLessThanToPrefix
=== RUN   TestAccS3BucketLifecycleConfiguration_frameworkMigrationV0_Filter_ObjectSizeGreaterThan
=== PAUSE TestAccS3BucketLifecycleConfiguration_frameworkMigrationV0_Filter_ObjectSizeGreaterThan
=== RUN   TestAccS3BucketLifecycleConfiguration_frameworkMigrationV0_Filter_ObjectSizeLessThan
=== PAUSE TestAccS3BucketLifecycleConfiguration_frameworkMigrationV0_Filter_ObjectSizeLessThan
=== RUN   TestAccS3BucketLifecycleConfiguration_frameworkMigrationV0_Filter_ObjectSizeRange
=== PAUSE TestAccS3BucketLifecycleConfiguration_frameworkMigrationV0_Filter_ObjectSizeRange
=== RUN   TestAccS3BucketLifecycleConfiguration_frameworkMigrationV0_Filter_ObjectSizeRangeAndPrefix
=== PAUSE TestAccS3BucketLifecycleConfiguration_frameworkMigrationV0_Filter_ObjectSizeRangeAndPrefix
=== RUN   TestAccS3BucketLifecycleConfiguration_frameworkMigrationV0_Filter_And_Tags
=== PAUSE TestAccS3BucketLifecycleConfiguration_frameworkMigrationV0_Filter_And_Tags
=== RUN   TestAccS3BucketLifecycleConfiguration_frameworkMigrationV0_Filter_And_ZeroLessThan_ChangeOnUpdate
=== PAUSE TestAccS3BucketLifecycleConfiguration_frameworkMigrationV0_Filter_And_ZeroLessThan_ChangeOnUpdate
=== RUN   TestAccS3BucketLifecycleConfiguration_frameworkMigrationV0_Filter_Tag
=== PAUSE TestAccS3BucketLifecycleConfiguration_frameworkMigrationV0_Filter_Tag
=== RUN   TestAccS3BucketLifecycleConfiguration_frameworkMigrationV0_EmptyFilter_NonCurrentVersions
=== PAUSE TestAccS3BucketLifecycleConfiguration_frameworkMigrationV0_EmptyFilter_NonCurrentVersions
=== RUN   TestAccS3BucketLifecycleConfiguration_frameworkMigrationV0_EmptyFilter_NonCurrentVersions_WithChange
=== PAUSE TestAccS3BucketLifecycleConfiguration_frameworkMigrationV0_EmptyFilter_NonCurrentVersions_WithChange
=== RUN   TestAccS3BucketLifecycleConfiguration_frameworkMigrationV0_nonCurrentVersionExpiration
=== PAUSE TestAccS3BucketLifecycleConfiguration_frameworkMigrationV0_nonCurrentVersionExpiration
=== RUN   TestAccS3BucketLifecycleConfiguration_frameworkMigrationV0_ruleAbortIncompleteMultipartUpload
=== PAUSE TestAccS3BucketLifecycleConfiguration_frameworkMigrationV0_ruleAbortIncompleteMultipartUpload
=== RUN   TestAccS3BucketLifecycleConfiguration_frameworkMigrationV0_RuleExpiration_expireMarkerOnly
=== PAUSE TestAccS3BucketLifecycleConfiguration_frameworkMigrationV0_RuleExpiration_expireMarkerOnly
=== RUN   TestAccS3BucketLifecycleConfiguration_frameworkMigrationV0_RuleExpiration_emptyBlock
=== PAUSE TestAccS3BucketLifecycleConfiguration_frameworkMigrationV0_RuleExpiration_emptyBlock
=== RUN   TestAccS3BucketLifecycleConfiguration_frameworkMigrationV0_RulePrefix
=== PAUSE TestAccS3BucketLifecycleConfiguration_frameworkMigrationV0_RulePrefix
=== RUN   TestAccS3BucketLifecycleConfiguration_frameworkMigrationV0_TransitionDate
=== PAUSE TestAccS3BucketLifecycleConfiguration_frameworkMigrationV0_TransitionDate
=== RUN   TestAccS3BucketLifecycleConfiguration_frameworkMigrationV0_TransitionStorageClassOnly_intelligentTiering
=== PAUSE TestAccS3BucketLifecycleConfiguration_frameworkMigrationV0_TransitionStorageClassOnly_intelligentTiering
=== RUN   TestAccS3BucketLifecycleConfiguration_frameworkMigrationV0_TransitionZeroDays_intelligentTiering
=== PAUSE TestAccS3BucketLifecycleConfiguration_frameworkMigrationV0_TransitionZeroDays_intelligentTiering
=== RUN   TestAccS3BucketLifecycleConfiguration_basic
=== PAUSE TestAccS3BucketLifecycleConfiguration_basic
=== RUN   TestAccS3BucketLifecycleConfiguration_disappears
=== PAUSE TestAccS3BucketLifecycleConfiguration_disappears
=== RUN   TestAccS3BucketLifecycleConfiguration_rule_NoFilterOrPrefix
=== PAUSE TestAccS3BucketLifecycleConfiguration_rule_NoFilterOrPrefix
=== RUN   TestAccS3BucketLifecycleConfiguration_filterWithPrefix
=== PAUSE TestAccS3BucketLifecycleConfiguration_filterWithPrefix
=== RUN   TestAccS3BucketLifecycleConfiguration_filterWithEmptyPrefix
=== PAUSE TestAccS3BucketLifecycleConfiguration_filterWithEmptyPrefix
=== RUN   TestAccS3BucketLifecycleConfiguration_Filter_objectSizeGreaterThanToPrefix
=== PAUSE TestAccS3BucketLifecycleConfiguration_Filter_objectSizeGreaterThanToPrefix
=== RUN   TestAccS3BucketLifecycleConfiguration_Filter_objectSizeLessThanToPrefix
=== PAUSE TestAccS3BucketLifecycleConfiguration_Filter_objectSizeLessThanToPrefix
=== RUN   TestAccS3BucketLifecycleConfiguration_Filter_ObjectSizeGreaterThan
=== PAUSE TestAccS3BucketLifecycleConfiguration_Filter_ObjectSizeGreaterThan
=== RUN   TestAccS3BucketLifecycleConfiguration_Filter_ObjectSizeGreaterThanZero
=== PAUSE TestAccS3BucketLifecycleConfiguration_Filter_ObjectSizeGreaterThanZero
=== RUN   TestAccS3BucketLifecycleConfiguration_Filter_ObjectSizeLessThan
=== PAUSE TestAccS3BucketLifecycleConfiguration_Filter_ObjectSizeLessThan
=== RUN   TestAccS3BucketLifecycleConfiguration_Filter_ObjectSizeRange
=== PAUSE TestAccS3BucketLifecycleConfiguration_Filter_ObjectSizeRange
=== RUN   TestAccS3BucketLifecycleConfiguration_Filter_ObjectSizeRangeAndPrefix
=== PAUSE TestAccS3BucketLifecycleConfiguration_Filter_ObjectSizeRangeAndPrefix
=== RUN   TestAccS3BucketLifecycleConfiguration_Filter_PrefixToAnd
=== PAUSE TestAccS3BucketLifecycleConfiguration_Filter_PrefixToAnd
=== RUN   TestAccS3BucketLifecycleConfiguration_disableRule
=== PAUSE TestAccS3BucketLifecycleConfiguration_disableRule
=== RUN   TestAccS3BucketLifecycleConfiguration_multipleRules
=== PAUSE TestAccS3BucketLifecycleConfiguration_multipleRules
=== RUN   TestAccS3BucketLifecycleConfiguration_multipleRules_noFilterOrPrefix
=== PAUSE TestAccS3BucketLifecycleConfiguration_multipleRules_noFilterOrPrefix
=== RUN   TestAccS3BucketLifecycleConfiguration_nonCurrentVersionExpiration
=== PAUSE TestAccS3BucketLifecycleConfiguration_nonCurrentVersionExpiration
=== RUN   TestAccS3BucketLifecycleConfiguration_nonCurrentVersionTransition
=== PAUSE TestAccS3BucketLifecycleConfiguration_nonCurrentVersionTransition
=== RUN   TestAccS3BucketLifecycleConfiguration_RulePrefix
=== PAUSE TestAccS3BucketLifecycleConfiguration_RulePrefix
=== RUN   TestAccS3BucketLifecycleConfiguration_RulePrefixToFilter
=== PAUSE TestAccS3BucketLifecycleConfiguration_RulePrefixToFilter
=== RUN   TestAccS3BucketLifecycleConfiguration_Filter_Tag
=== PAUSE TestAccS3BucketLifecycleConfiguration_Filter_Tag
=== RUN   TestAccS3BucketLifecycleConfiguration_RuleExpiration_expireMarkerOnly
=== PAUSE TestAccS3BucketLifecycleConfiguration_RuleExpiration_expireMarkerOnly
=== RUN   TestAccS3BucketLifecycleConfiguration_RuleExpiration_emptyBlock
=== PAUSE TestAccS3BucketLifecycleConfiguration_RuleExpiration_emptyBlock
=== RUN   TestAccS3BucketLifecycleConfiguration_ruleAbortIncompleteMultipartUpload
=== PAUSE TestAccS3BucketLifecycleConfiguration_ruleAbortIncompleteMultipartUpload
=== RUN   TestAccS3BucketLifecycleConfiguration_TransitionDate_standardIa
=== PAUSE TestAccS3BucketLifecycleConfiguration_TransitionDate_standardIa
=== RUN   TestAccS3BucketLifecycleConfiguration_TransitionDate_intelligentTiering
=== PAUSE TestAccS3BucketLifecycleConfiguration_TransitionDate_intelligentTiering
=== RUN   TestAccS3BucketLifecycleConfiguration_TransitionStorageClassOnly_intelligentTiering
=== PAUSE TestAccS3BucketLifecycleConfiguration_TransitionStorageClassOnly_intelligentTiering
=== RUN   TestAccS3BucketLifecycleConfiguration_TransitionZeroDays_intelligentTiering
=== PAUSE TestAccS3BucketLifecycleConfiguration_TransitionZeroDays_intelligentTiering
=== RUN   TestAccS3BucketLifecycleConfiguration_TransitionUpdateBetweenDaysAndDate_intelligentTiering
=== PAUSE TestAccS3BucketLifecycleConfiguration_TransitionUpdateBetweenDaysAndDate_intelligentTiering
=== RUN   TestAccS3BucketLifecycleConfiguration_EmptyFilter_NonCurrentVersions
=== PAUSE TestAccS3BucketLifecycleConfiguration_EmptyFilter_NonCurrentVersions
=== RUN   TestAccS3BucketLifecycleConfiguration_migrateFromBucket_noChange
=== PAUSE TestAccS3BucketLifecycleConfiguration_migrateFromBucket_noChange
=== RUN   TestAccS3BucketLifecycleConfiguration_migrateFromBucket_withChange
=== PAUSE TestAccS3BucketLifecycleConfiguration_migrateFromBucket_withChange
=== RUN   TestAccS3BucketLifecycleConfiguration_Update_filterWithAndToFilterWithPrefix
=== PAUSE TestAccS3BucketLifecycleConfiguration_Update_filterWithAndToFilterWithPrefix
=== RUN   TestAccS3BucketLifecycleConfiguration_directoryBucket
=== PAUSE TestAccS3BucketLifecycleConfiguration_directoryBucket
=== RUN   TestAccS3BucketLifecycleConfiguration_transitionDefaultMinimumObjectSize_update
=== PAUSE TestAccS3BucketLifecycleConfiguration_transitionDefaultMinimumObjectSize_update
=== RUN   TestAccS3BucketLifecycleConfiguration_transitionDefaultMinimumObjectSize_remove
=== PAUSE TestAccS3BucketLifecycleConfiguration_transitionDefaultMinimumObjectSize_remove
=== RUN   TestAccS3BucketLifecycleConfiguration_removeRule
=== PAUSE TestAccS3BucketLifecycleConfiguration_removeRule
=== RUN   TestAccS3BucketLifecycleConfiguration_upgradeV5_86_0_rule_NoFilterOrPrefix
=== PAUSE TestAccS3BucketLifecycleConfiguration_upgradeV5_86_0_rule_NoFilterOrPrefix
=== RUN   TestAccS3BucketLifecycleConfiguration_upgradeV5_86_0_FilterWithPrefix
=== PAUSE TestAccS3BucketLifecycleConfiguration_upgradeV5_86_0_FilterWithPrefix
=== RUN   TestAccS3BucketLifecycleConfiguration_upgradeV5_86_0_Filter_ObjectSizeGreaterThan
=== PAUSE TestAccS3BucketLifecycleConfiguration_upgradeV5_86_0_Filter_ObjectSizeGreaterThan
=== RUN   TestAccS3BucketLifecycleConfiguration_upgradeV5_86_0_Filter_ObjectSizeLessThan
=== PAUSE TestAccS3BucketLifecycleConfiguration_upgradeV5_86_0_Filter_ObjectSizeLessThan
=== RUN   TestAccS3BucketLifecycleConfiguration_upgradeV5_86_0_Filter_ObjectSizeRange
=== PAUSE TestAccS3BucketLifecycleConfiguration_upgradeV5_86_0_Filter_ObjectSizeRange
=== RUN   TestAccS3BucketLifecycleConfiguration_upgradeV5_86_0_Filter_ObjectSizeRangeAndPrefix
=== PAUSE TestAccS3BucketLifecycleConfiguration_upgradeV5_86_0_Filter_ObjectSizeRangeAndPrefix
=== RUN   TestAccS3BucketLifecycleConfiguration_upgradeV5_86_0_Filter_And_Tags
=== PAUSE TestAccS3BucketLifecycleConfiguration_upgradeV5_86_0_Filter_And_Tags
=== RUN   TestAccS3BucketLifecycleConfiguration_upgradeV5_86_0_Filter_Tag
=== PAUSE TestAccS3BucketLifecycleConfiguration_upgradeV5_86_0_Filter_Tag
=== RUN   TestAccS3BucketLifecycleConfiguration_upgradeV5_86_0_EmptyFilter_NonCurrentVersions
=== PAUSE TestAccS3BucketLifecycleConfiguration_upgradeV5_86_0_EmptyFilter_NonCurrentVersions
=== RUN   TestAccS3BucketLifecycleConfiguration_upgradeV5_86_0_EmptyFilter_NonCurrentVersions_WithChange
=== PAUSE TestAccS3BucketLifecycleConfiguration_upgradeV5_86_0_EmptyFilter_NonCurrentVersions_WithChange
=== RUN   TestAccS3BucketLifecycleConfiguration_upgradeV5_86_0_nonCurrentVersionExpiration
=== PAUSE TestAccS3BucketLifecycleConfiguration_upgradeV5_86_0_nonCurrentVersionExpiration
=== RUN   TestAccS3BucketLifecycleConfiguration_upgradeV5_86_0_ruleAbortIncompleteMultipartUpload
=== PAUSE TestAccS3BucketLifecycleConfiguration_upgradeV5_86_0_ruleAbortIncompleteMultipartUpload
=== RUN   TestAccS3BucketLifecycleConfiguration_upgradeV5_86_0_RuleExpiration_expireMarkerOnly
=== PAUSE TestAccS3BucketLifecycleConfiguration_upgradeV5_86_0_RuleExpiration_expireMarkerOnly
=== RUN   TestAccS3BucketLifecycleConfiguration_upgradeV5_86_0_RuleExpiration_emptyBlock
=== PAUSE TestAccS3BucketLifecycleConfiguration_upgradeV5_86_0_RuleExpiration_emptyBlock
=== RUN   TestAccS3BucketLifecycleConfiguration_upgradeV5_86_0_RulePrefix
=== PAUSE TestAccS3BucketLifecycleConfiguration_upgradeV5_86_0_RulePrefix
=== RUN   TestAccS3BucketLifecycleConfiguration_upgradeV5_86_0_TransitionDate
=== PAUSE TestAccS3BucketLifecycleConfiguration_upgradeV5_86_0_TransitionDate
=== RUN   TestAccS3BucketLifecycleConfiguration_upgradeV5_86_0_TransitionStorageClassOnly_intelligentTiering
=== PAUSE TestAccS3BucketLifecycleConfiguration_upgradeV5_86_0_TransitionStorageClassOnly_intelligentTiering
=== RUN   TestAccS3BucketLifecycleConfiguration_upgradeV5_86_0_TransitionZeroDays_intelligentTiering
=== PAUSE TestAccS3BucketLifecycleConfiguration_upgradeV5_86_0_TransitionZeroDays_intelligentTiering
=== CONT  TestAccS3BucketLifecycleConfiguration_frameworkMigrationV0_rule_NoFilterOrPrefix
=== CONT  TestAccS3BucketLifecycleConfiguration_nonCurrentVersionTransition
=== CONT  TestAccS3BucketLifecycleConfiguration_removeRule
=== CONT  TestAccS3BucketLifecycleConfiguration_upgradeV5_86_0_EmptyFilter_NonCurrentVersions_WithChange
=== CONT  TestAccS3BucketLifecycleConfiguration_frameworkMigrationV0_TransitionStorageClassOnly_intelligentTiering
=== CONT  TestAccS3BucketLifecycleConfiguration_upgradeV5_86_0_Filter_ObjectSizeRange
=== CONT  TestAccS3BucketLifecycleConfiguration_upgradeV5_86_0_EmptyFilter_NonCurrentVersions
=== CONT  TestAccS3BucketLifecycleConfiguration_upgradeV5_86_0_Filter_Tag
=== CONT  TestAccS3BucketLifecycleConfiguration_upgradeV5_86_0_Filter_And_Tags
=== CONT  TestAccS3BucketLifecycleConfiguration_upgradeV5_86_0_Filter_ObjectSizeRangeAndPrefix
=== CONT  TestAccS3BucketLifecycleConfiguration_upgradeV5_86_0_RulePrefix
=== CONT  TestAccS3BucketLifecycleConfiguration_upgradeV5_86_0_TransitionZeroDays_intelligentTiering
=== CONT  TestAccS3BucketLifecycleConfiguration_upgradeV5_86_0_TransitionStorageClassOnly_intelligentTiering
=== CONT  TestAccS3BucketLifecycleConfiguration_upgradeV5_86_0_TransitionDate
=== CONT  TestAccS3BucketLifecycleConfiguration_upgradeV5_86_0_Filter_ObjectSizeGreaterThan
=== CONT  TestAccS3BucketLifecycleConfiguration_upgradeV5_86_0_Filter_ObjectSizeLessThan
=== CONT  TestAccS3BucketLifecycleConfiguration_Filter_ObjectSizeGreaterThanZero
=== CONT  TestAccS3BucketLifecycleConfiguration_upgradeV5_86_0_FilterWithPrefix
=== CONT  TestAccS3BucketLifecycleConfiguration_disableRule
=== CONT  TestAccS3BucketLifecycleConfiguration_nonCurrentVersionExpiration
--- PASS: TestAccS3BucketLifecycleConfiguration_nonCurrentVersionExpiration (170.86s)
=== CONT  TestAccS3BucketLifecycleConfiguration_multipleRules_noFilterOrPrefix
--- PASS: TestAccS3BucketLifecycleConfiguration_removeRule (171.27s)
=== CONT  TestAccS3BucketLifecycleConfiguration_multipleRules
--- PASS: TestAccS3BucketLifecycleConfiguration_nonCurrentVersionTransition (171.46s)
=== CONT  TestAccS3BucketLifecycleConfiguration_upgradeV5_86_0_RuleExpiration_expireMarkerOnly
--- PASS: TestAccS3BucketLifecycleConfiguration_Filter_ObjectSizeGreaterThanZero (171.91s)
=== CONT  TestAccS3BucketLifecycleConfiguration_upgradeV5_86_0_RuleExpiration_emptyBlock
--- PASS: TestAccS3BucketLifecycleConfiguration_disableRule (238.69s)
=== CONT  TestAccS3BucketLifecycleConfiguration_upgradeV5_86_0_rule_NoFilterOrPrefix
--- PASS: TestAccS3BucketLifecycleConfiguration_upgradeV5_86_0_Filter_ObjectSizeGreaterThan (254.53s)
=== CONT  TestAccS3BucketLifecycleConfiguration_filterWithPrefix
--- PASS: TestAccS3BucketLifecycleConfiguration_multipleRules_noFilterOrPrefix (85.17s)
=== CONT  TestAccS3BucketLifecycleConfiguration_Filter_ObjectSizeGreaterThan
--- PASS: TestAccS3BucketLifecycleConfiguration_multipleRules (86.27s)
=== CONT  TestAccS3BucketLifecycleConfiguration_Filter_objectSizeLessThanToPrefix
--- PASS: TestAccS3BucketLifecycleConfiguration_upgradeV5_86_0_TransitionZeroDays_intelligentTiering (270.38s)
=== CONT  TestAccS3BucketLifecycleConfiguration_Filter_objectSizeGreaterThanToPrefix
--- PASS: TestAccS3BucketLifecycleConfiguration_upgradeV5_86_0_Filter_ObjectSizeRange (285.98s)
=== CONT  TestAccS3BucketLifecycleConfiguration_filterWithEmptyPrefix
--- PASS: TestAccS3BucketLifecycleConfiguration_upgradeV5_86_0_Filter_ObjectSizeLessThan (299.53s)
=== CONT  TestAccS3BucketLifecycleConfiguration_upgradeV5_86_0_ruleAbortIncompleteMultipartUpload
--- PASS: TestAccS3BucketLifecycleConfiguration_upgradeV5_86_0_EmptyFilter_NonCurrentVersions (308.73s)
=== CONT  TestAccS3BucketLifecycleConfiguration_disappears
--- PASS: TestAccS3BucketLifecycleConfiguration_upgradeV5_86_0_TransitionStorageClassOnly_intelligentTiering (309.29s)
=== CONT  TestAccS3BucketLifecycleConfiguration_rule_NoFilterOrPrefix
--- PASS: TestAccS3BucketLifecycleConfiguration_upgradeV5_86_0_FilterWithPrefix (320.61s)
=== CONT  TestAccS3BucketLifecycleConfiguration_frameworkMigrationV0_Filter_And_ZeroLessThan_ChangeOnUpdate
--- PASS: TestAccS3BucketLifecycleConfiguration_upgradeV5_86_0_TransitionDate (341.64s)
=== CONT  TestAccS3BucketLifecycleConfiguration_frameworkMigrationV0_TransitionDate
--- PASS: TestAccS3BucketLifecycleConfiguration_upgradeV5_86_0_Filter_And_Tags (343.32s)
=== CONT  TestAccS3BucketLifecycleConfiguration_frameworkMigrationV0_RulePrefix
--- PASS: TestAccS3BucketLifecycleConfiguration_upgradeV5_86_0_Filter_ObjectSizeRangeAndPrefix (351.00s)
=== CONT  TestAccS3BucketLifecycleConfiguration_frameworkMigrationV0_RuleExpiration_emptyBlock
--- PASS: TestAccS3BucketLifecycleConfiguration_upgradeV5_86_0_RulePrefix (351.16s)
=== CONT  TestAccS3BucketLifecycleConfiguration_frameworkMigrationV0_RuleExpiration_expireMarkerOnly
--- PASS: TestAccS3BucketLifecycleConfiguration_upgradeV5_86_0_Filter_Tag (351.45s)
=== CONT  TestAccS3BucketLifecycleConfiguration_frameworkMigrationV0_ruleAbortIncompleteMultipartUpload
--- PASS: TestAccS3BucketLifecycleConfiguration_upgradeV5_86_0_EmptyFilter_NonCurrentVersions_WithChange (357.98s)
=== CONT  TestAccS3BucketLifecycleConfiguration_frameworkMigrationV0_nonCurrentVersionExpiration
--- PASS: TestAccS3BucketLifecycleConfiguration_frameworkMigrationV0_TransitionStorageClassOnly_intelligentTiering (363.79s)
=== CONT  TestAccS3BucketLifecycleConfiguration_frameworkMigrationV0_EmptyFilter_NonCurrentVersions_WithChange
--- PASS: TestAccS3BucketLifecycleConfiguration_upgradeV5_86_0_RuleExpiration_expireMarkerOnly (227.64s)
=== CONT  TestAccS3BucketLifecycleConfiguration_frameworkMigrationV0_EmptyFilter_NonCurrentVersions
--- PASS: TestAccS3BucketLifecycleConfiguration_upgradeV5_86_0_RuleExpiration_emptyBlock (229.66s)
=== CONT  TestAccS3BucketLifecycleConfiguration_frameworkMigrationV0_Filter_Tag
--- PASS: TestAccS3BucketLifecycleConfiguration_disappears (93.13s)
=== CONT  TestAccS3BucketLifecycleConfiguration_basic
--- PASS: TestAccS3BucketLifecycleConfiguration_rule_NoFilterOrPrefix (103.32s)
=== CONT  TestAccS3BucketLifecycleConfiguration_upgradeV5_86_0_nonCurrentVersionExpiration
--- PASS: TestAccS3BucketLifecycleConfiguration_frameworkMigrationV0_rule_NoFilterOrPrefix (436.84s)
=== CONT  TestAccS3BucketLifecycleConfiguration_TransitionZeroDays_intelligentTiering
--- PASS: TestAccS3BucketLifecycleConfiguration_Filter_objectSizeLessThanToPrefix (198.50s)
=== CONT  TestAccS3BucketLifecycleConfiguration_transitionDefaultMinimumObjectSize_remove
--- PASS: TestAccS3BucketLifecycleConfiguration_filterWithPrefix (201.63s)
=== CONT  TestAccS3BucketLifecycleConfiguration_transitionDefaultMinimumObjectSize_update
--- PASS: TestAccS3BucketLifecycleConfiguration_Filter_ObjectSizeGreaterThan (200.21s)
=== CONT  TestAccS3BucketLifecycleConfiguration_directoryBucket
--- PASS: TestAccS3BucketLifecycleConfiguration_upgradeV5_86_0_rule_NoFilterOrPrefix (236.19s)
=== CONT  TestAccS3BucketLifecycleConfiguration_Update_filterWithAndToFilterWithPrefix
--- PASS: TestAccS3BucketLifecycleConfiguration_Filter_objectSizeGreaterThanToPrefix (207.11s)
=== CONT  TestAccS3BucketLifecycleConfiguration_migrateFromBucket_withChange
--- PASS: TestAccS3BucketLifecycleConfiguration_filterWithEmptyPrefix (200.05s)
=== CONT  TestAccS3BucketLifecycleConfiguration_migrateFromBucket_noChange
--- PASS: TestAccS3BucketLifecycleConfiguration_basic (103.16s)
=== CONT  TestAccS3BucketLifecycleConfiguration_EmptyFilter_NonCurrentVersions
--- PASS: TestAccS3BucketLifecycleConfiguration_upgradeV5_86_0_ruleAbortIncompleteMultipartUpload (227.12s)
=== CONT  TestAccS3BucketLifecycleConfiguration_TransitionUpdateBetweenDaysAndDate_intelligentTiering
--- PASS: TestAccS3BucketLifecycleConfiguration_directoryBucket (90.96s)
=== CONT  TestAccS3BucketLifecycleConfiguration_Filter_ObjectSizeRangeAndPrefix
--- PASS: TestAccS3BucketLifecycleConfiguration_migrateFromBucket_withChange (97.13s)
=== CONT  TestAccS3BucketLifecycleConfiguration_Filter_PrefixToAnd
--- PASS: TestAccS3BucketLifecycleConfiguration_migrateFromBucket_noChange (98.18s)
=== CONT  TestAccS3BucketLifecycleConfiguration_frameworkMigrationV0_Filter_ObjectSizeGreaterThan
--- PASS: TestAccS3BucketLifecycleConfiguration_TransitionZeroDays_intelligentTiering (163.71s)
=== CONT  TestAccS3BucketLifecycleConfiguration_frameworkMigrationV0_Filter_And_Tags
--- PASS: TestAccS3BucketLifecycleConfiguration_transitionDefaultMinimumObjectSize_remove (169.02s)
=== CONT  TestAccS3BucketLifecycleConfiguration_frameworkMigrationV0_Filter_ObjectSizeRangeAndPrefix
--- PASS: TestAccS3BucketLifecycleConfiguration_transitionDefaultMinimumObjectSize_update (169.51s)
=== CONT  TestAccS3BucketLifecycleConfiguration_frameworkMigrationV0_Filter_ObjectSizeRange
--- PASS: TestAccS3BucketLifecycleConfiguration_Filter_ObjectSizeRangeAndPrefix (85.20s)
=== CONT  TestAccS3BucketLifecycleConfiguration_frameworkMigrationV0_Filter_ObjectSizeLessThan
--- PASS: TestAccS3BucketLifecycleConfiguration_frameworkMigrationV0_nonCurrentVersionExpiration (275.69s)
=== CONT  TestAccS3BucketLifecycleConfiguration_Filter_ObjectSizeRange
--- PASS: TestAccS3BucketLifecycleConfiguration_frameworkMigrationV0_EmptyFilter_NonCurrentVersions_WithChange (296.48s)
=== CONT  TestAccS3BucketLifecycleConfiguration_frameworkMigrationV0_Filter_objectSizeGreaterThanToPrefix
--- PASS: TestAccS3BucketLifecycleConfiguration_upgradeV5_86_0_nonCurrentVersionExpiration (258.76s)
=== CONT  TestAccS3BucketLifecycleConfiguration_frameworkMigrationV0_Filter_objectSizeLessThanToPrefix
--- PASS: TestAccS3BucketLifecycleConfiguration_frameworkMigrationV0_Filter_And_ZeroLessThan_ChangeOnUpdate (356.13s)
=== CONT  TestAccS3BucketLifecycleConfiguration_frameworkMigrationV0_TransitionZeroDays_intelligentTiering
--- PASS: TestAccS3BucketLifecycleConfiguration_EmptyFilter_NonCurrentVersions (171.89s)
=== CONT  TestAccS3BucketLifecycleConfiguration_RuleExpiration_emptyBlock
--- PASS: TestAccS3BucketLifecycleConfiguration_frameworkMigrationV0_EmptyFilter_NonCurrentVersions (285.57s)
=== CONT  TestAccS3BucketLifecycleConfiguration_TransitionStorageClassOnly_intelligentTiering
--- PASS: TestAccS3BucketLifecycleConfiguration_frameworkMigrationV0_RuleExpiration_emptyBlock (346.95s)
=== CONT  TestAccS3BucketLifecycleConfiguration_TransitionDate_intelligentTiering
--- PASS: TestAccS3BucketLifecycleConfiguration_frameworkMigrationV0_RulePrefix (371.66s)
=== CONT  TestAccS3BucketLifecycleConfiguration_TransitionDate_standardIa
--- PASS: TestAccS3BucketLifecycleConfiguration_Update_filterWithAndToFilterWithPrefix (245.60s)
=== CONT  TestAccS3BucketLifecycleConfiguration_ruleAbortIncompleteMultipartUpload
--- PASS: TestAccS3BucketLifecycleConfiguration_frameworkMigrationV0_RuleExpiration_expireMarkerOnly (372.81s)
=== CONT  TestAccS3BucketLifecycleConfiguration_Filter_Tag
--- PASS: TestAccS3BucketLifecycleConfiguration_frameworkMigrationV0_ruleAbortIncompleteMultipartUpload (380.26s)
=== CONT  TestAccS3BucketLifecycleConfiguration_RuleExpiration_expireMarkerOnly
--- PASS: TestAccS3BucketLifecycleConfiguration_frameworkMigrationV0_Filter_Tag (330.34s)
=== CONT  TestAccS3BucketLifecycleConfiguration_RulePrefixToFilter
--- PASS: TestAccS3BucketLifecycleConfiguration_frameworkMigrationV0_TransitionDate (390.49s)
=== CONT  TestAccS3BucketLifecycleConfiguration_frameworkMigrationV0_filterWithEmptyPrefix
--- PASS: TestAccS3BucketLifecycleConfiguration_Filter_PrefixToAnd (171.10s)
=== CONT  TestAccS3BucketLifecycleConfiguration_frameworkMigrationV0_FilterWithPrefix
--- PASS: TestAccS3BucketLifecycleConfiguration_TransitionUpdateBetweenDaysAndDate_intelligentTiering (243.25s)
=== CONT  TestAccS3BucketLifecycleConfiguration_RulePrefix
--- PASS: TestAccS3BucketLifecycleConfiguration_TransitionDate_intelligentTiering (88.58s)
=== CONT  TestAccS3BucketLifecycleConfiguration_Filter_ObjectSizeLessThan
--- PASS: TestAccS3BucketLifecycleConfiguration_Filter_ObjectSizeRange (176.24s)
--- PASS: TestAccS3BucketLifecycleConfiguration_frameworkMigrationV0_Filter_ObjectSizeGreaterThan (230.04s)
--- PASS: TestAccS3BucketLifecycleConfiguration_frameworkMigrationV0_Filter_And_Tags (228.18s)
--- PASS: TestAccS3BucketLifecycleConfiguration_RuleExpiration_emptyBlock (161.88s)
--- PASS: TestAccS3BucketLifecycleConfiguration_TransitionStorageClassOnly_intelligentTiering (162.78s)
--- PASS: TestAccS3BucketLifecycleConfiguration_frameworkMigrationV0_Filter_ObjectSizeRangeAndPrefix (234.82s)
--- PASS: TestAccS3BucketLifecycleConfiguration_frameworkMigrationV0_Filter_ObjectSizeLessThan (228.21s)
--- PASS: TestAccS3BucketLifecycleConfiguration_frameworkMigrationV0_Filter_ObjectSizeRange (240.74s)
--- PASS: TestAccS3BucketLifecycleConfiguration_TransitionDate_standardIa (167.19s)
--- PASS: TestAccS3BucketLifecycleConfiguration_ruleAbortIncompleteMultipartUpload (168.98s)
--- PASS: TestAccS3BucketLifecycleConfiguration_Filter_Tag (167.96s)
--- PASS: TestAccS3BucketLifecycleConfiguration_RuleExpiration_expireMarkerOnly (165.92s)
--- PASS: TestAccS3BucketLifecycleConfiguration_RulePrefixToFilter (165.73s)
--- PASS: TestAccS3BucketLifecycleConfiguration_frameworkMigrationV0_TransitionZeroDays_intelligentTiering (249.93s)
--- PASS: TestAccS3BucketLifecycleConfiguration_RulePrefix (157.56s)
--- PASS: TestAccS3BucketLifecycleConfiguration_Filter_ObjectSizeLessThan (159.53s)
--- PASS: TestAccS3BucketLifecycleConfiguration_frameworkMigrationV0_filterWithEmptyPrefix (219.64s)
--- PASS: TestAccS3BucketLifecycleConfiguration_frameworkMigrationV0_FilterWithPrefix (221.55s)
--- PASS: TestAccS3BucketLifecycleConfiguration_frameworkMigrationV0_Filter_objectSizeLessThanToPrefix (303.66s)
--- PASS: TestAccS3BucketLifecycleConfiguration_frameworkMigrationV0_Filter_objectSizeGreaterThanToPrefix (314.75s)
PASS
ok      github.com/hashicorp/terraform-provider-aws/internal/service/s3 981.018s

@github-actions
Copy link
Contributor

Community Guidelines

This comment is added to every new Pull Request to provide quick reference to how the Terraform AWS Provider is maintained. Please review the information below, and thank you for contributing to the community that keeps the provider thriving! 🚀

Voting for Prioritization

  • Please vote on this Pull Request by adding a 👍 reaction to the original post to help the community and maintainers prioritize it.
  • Please see our prioritization guide for additional information on how the maintainers handle prioritization.
  • Please do not leave +1 or other comments that do not add relevant new information or questions; they generate extra noise for others following the Pull Request and do not help prioritize the request.

Pull Request Authors

  • Review the contribution guide relating to the type of change you are making to ensure all of the necessary steps have been taken.
  • Whether or not the branch has been rebased will not impact prioritization, but doing so is always a welcome surprise.

@github-actions github-actions bot added needs-triage Waiting for first response or review from a maintainer. documentation Introduces or discusses updates to documentation. service/s3 Issues and PRs that pertain to the s3 service. size/XS Managed by automation to categorize the size of a PR. labels Jul 29, 2025
@johannes-gehrs johannes-gehrs force-pushed the b-fix_misleading_lifecyle_rule_warning branch from 9f72d67 to 0b4b85b Compare July 30, 2025 07:07
@johannes-gehrs johannes-gehrs marked this pull request as ready for review July 30, 2025 09:03
@johannes-gehrs johannes-gehrs requested a review from a team as a code owner July 30, 2025 09:03
@github-actions
Copy link
Contributor

github-actions bot commented Jul 30, 2025

✅ Thank you for correcting the previously detected issues! The maintainers appreciate your efforts to make the review process as smooth as possible.

@johannes-gehrs johannes-gehrs force-pushed the b-fix_misleading_lifecyle_rule_warning branch from 0b4b85b to 1fda0c5 Compare July 30, 2025 20:18
@justinretzolk justinretzolk removed the needs-triage Waiting for first response or review from a maintainer. label Jul 31, 2025
@YakDriver
Copy link
Member

YakDriver commented Oct 2, 2025

Context & History

The Terraform AWS Provider’s aws_s3_bucket_lifecycle_configuration resource lets users manage S3 bucket lifecycle rules. According to Terraform’s documentation, the correct way to apply a lifecycle rule to an entire bucket is to include an empty filter block (filter {}).

However, starting with changes introduced in PR #41662, users began seeing confusing warnings when using the documented empty filter syntax.

The root issue lies in the mismatch between how AWS’s API enforces filters and how Terraform has historically handled them:

  • AWS S3 API behavior: requires a filter object (even if empty).
  • Terraform provider behavior: allowed omitting the filter block entirely, automatically sending an empty filter to AWS.
  • Documentation guidance: recommends explicitly using filter {} for bucket-wide rules.

The provider’s validator logic did not distinguish between “no filter block” and “empty filter block” — both of which work fine at the AWS API level — and instead warned in both cases, creating a catch-22, no-win scenario for users.

Problem Summary

Reported in Bug #41710

  • Configuration:

    resource "aws_s3_bucket_lifecycle_configuration" "lifecycle_sensitive_access_log" {
      bucket = aws_s3_bucket.collector_bucket_sensitive_access_log.id
    
      rule {
        id     = "Delete"
        status = "Enabled"
        filter {}   # documented pattern
        expiration {
          days = 366
        }
      }
    }
  • Observed behavior:

    No attribute specified when one (and only one) of [rule[0].prefix.<.filter] is required
    This will be an error in a future version of the provider
    
  • Impact: Users following the docs correctly still received warnings. The provider gave no way to satisfy validation without warnings.

Why It Happened

  1. Validator intent: The WarnExactlyOneOfChildren validator was added to guide users toward explicit filters and align with AWS’s API (which requires a filter object). It also hinted at a future breaking change.

  2. Provider behavior: Terraform already handled this requirement by transparently sending an empty filter to AWS when none was specified.

  3. Mismatch:

    • filter {} → Warned about empty contents
    • No filter block → Warned about missing filter
    • Either way, users hit warnings despite the configuration being valid and functional.

Effectively, the validator enforced a stricter contract than AWS itself, breaking the documented workflow.

Timeline

  1. PR resource/aws_s3_bucket_lifecycle_configuration: Fix additional "Invalid XML" errors #41662 – Introduced stricter filter validation.
  2. Issue [Bug]: aws_s3_bucket_lifecycle_configuration using recommended empty filter issues warning #41710 – Reported warnings when using filter {}.
  3. PR resource/aws_s3_bucket_lifecycle_configuration: Validation and remove spurious "known after apply" #42036 (Commit db5cf53b) – Added a validator to enforce missing filter/prefix rules.
  4. Result: Problem worsened — both empty and missing filters now triggered warnings.
  5. Issue aws_s3_bucket_lifecycle_configuration empty filter block produces a warning #42714 – Confirmed problem persisted.
  6. PR Fix misleading S3 Lifecycle rule warning #43590 (proposed fix) – Removes the problematic validator entirely and clarifies documentation

Where Things Stand

  • No fixes have been merged yet. Users still see warnings with both empty and missing filter blocks.

  • PR Fix misleading S3 Lifecycle rule warning #43590 is under review and proposes the correct resolution:

    • Restore alignment between Terraform docs, provider behavior, and AWS API requirements.
    • Remove confusing validator warnings.
    • Provide clearer warnings only in actual misconfiguration scenarios (e.g., multiple filter fields).

Bottom line: This is a validator misalignment issue, not an AWS API requirement. PR #43590 removes the problematic validator, ensuring empty filter blocks (filter {}) work as documented without spurious warnings, while still improving user guidance when multiple filters are incorrectly specified.

Copy link
Member

@YakDriver YakDriver left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@johannes-gehrs Thank you for your contribution!

% make t T='TestAccS3BucketLifecycleConfiguration_filterWithPrefix|TestAccS3BucketLifecycleConfiguration_rule_NoFilterOrPrefix|TestAccS3BucketLifecycleConfiguration_filterWithEmptyPrefix|TestAccS3BucketLifecycleConfiguration_Filter_objectSizeGreaterThanToPrefix|TestAccS3BucketLifecycleConfiguration_Filter_objectSizeLessThanToPrefix|TestAccS3BucketLifecycleConfiguration_Filter_ObjectSizeGreaterThan|TestAccS3BucketLifecycleConfiguration_Filter_ObjectSizeGreaterThanZero|TestAccS3BucketLifecycleConfiguration_Filter_ObjectSizeLessThan|TestAccS3BucketLifecycleConfiguration_Filter_ObjectSizeRange|TestAccS3BucketLifecycleConfiguration_Filter_ObjectSizeRangeAndPrefix|TestAccS3BucketLifecycleConfiguration_Filter_PrefixToAnd|TestAccS3BucketLifecycleConfiguration_multipleRules_noFilterOrPrefix|TestAccS3BucketLifecycleConfiguration_RulePrefixToFilter|TestAccS3BucketLifecycleConfiguration_Filter_Tag|TestAccS3BucketLifecycleConfiguration_EmptyFilter_NonCurrentVersions|TestAccS3BucketLifecycleConfiguration_Update_filterWithAndToFilterWithPrefix' K=s3
make: Verifying source code with gofmt...
==> Checking that code complies with gofmt requirements...
make: Running acceptance tests on branch: 🌿 b-fix_misleading_lifecyle_rule_warning 🌿...
TF_ACC=1 go1.24.6 test ./internal/service/s3/... -v -count 1 -parallel 20 -run='TestAccS3BucketLifecycleConfiguration_filterWithPrefix|TestAccS3BucketLifecycleConfiguration_rule_NoFilterOrPrefix|TestAccS3BucketLifecycleConfiguration_filterWithEmptyPrefix|TestAccS3BucketLifecycleConfiguration_Filter_objectSizeGreaterThanToPrefix|TestAccS3BucketLifecycleConfiguration_Filter_objectSizeLessThanToPrefix|TestAccS3BucketLifecycleConfiguration_Filter_ObjectSizeGreaterThan|TestAccS3BucketLifecycleConfiguration_Filter_ObjectSizeGreaterThanZero|TestAccS3BucketLifecycleConfiguration_Filter_ObjectSizeLessThan|TestAccS3BucketLifecycleConfiguration_Filter_ObjectSizeRange|TestAccS3BucketLifecycleConfiguration_Filter_ObjectSizeRangeAndPrefix|TestAccS3BucketLifecycleConfiguration_Filter_PrefixToAnd|TestAccS3BucketLifecycleConfiguration_multipleRules_noFilterOrPrefix|TestAccS3BucketLifecycleConfiguration_RulePrefixToFilter|TestAccS3BucketLifecycleConfiguration_Filter_Tag|TestAccS3BucketLifecycleConfiguration_EmptyFilter_NonCurrentVersions|TestAccS3BucketLifecycleConfiguration_Update_filterWithAndToFilterWithPrefix'  -timeout 360m -vet=off
2025/10/02 11:50:07 Creating Terraform AWS Provider (SDKv2-style)...
2025/10/02 11:50:07 Initializing Terraform AWS Provider (SDKv2-style)...
=== RUN   TestAccS3BucketLifecycleConfiguration_rule_NoFilterOrPrefix
=== PAUSE TestAccS3BucketLifecycleConfiguration_rule_NoFilterOrPrefix
=== RUN   TestAccS3BucketLifecycleConfiguration_filterWithPrefix
=== PAUSE TestAccS3BucketLifecycleConfiguration_filterWithPrefix
=== RUN   TestAccS3BucketLifecycleConfiguration_filterWithEmptyPrefix
=== PAUSE TestAccS3BucketLifecycleConfiguration_filterWithEmptyPrefix
=== RUN   TestAccS3BucketLifecycleConfiguration_Filter_objectSizeGreaterThanToPrefix
=== PAUSE TestAccS3BucketLifecycleConfiguration_Filter_objectSizeGreaterThanToPrefix
=== RUN   TestAccS3BucketLifecycleConfiguration_Filter_objectSizeLessThanToPrefix
=== PAUSE TestAccS3BucketLifecycleConfiguration_Filter_objectSizeLessThanToPrefix
=== RUN   TestAccS3BucketLifecycleConfiguration_Filter_ObjectSizeGreaterThan
=== PAUSE TestAccS3BucketLifecycleConfiguration_Filter_ObjectSizeGreaterThan
=== RUN   TestAccS3BucketLifecycleConfiguration_Filter_ObjectSizeGreaterThanZero
=== PAUSE TestAccS3BucketLifecycleConfiguration_Filter_ObjectSizeGreaterThanZero
=== RUN   TestAccS3BucketLifecycleConfiguration_Filter_ObjectSizeLessThan
=== PAUSE TestAccS3BucketLifecycleConfiguration_Filter_ObjectSizeLessThan
=== RUN   TestAccS3BucketLifecycleConfiguration_Filter_ObjectSizeRange
=== PAUSE TestAccS3BucketLifecycleConfiguration_Filter_ObjectSizeRange
=== RUN   TestAccS3BucketLifecycleConfiguration_Filter_ObjectSizeRangeAndPrefix
=== PAUSE TestAccS3BucketLifecycleConfiguration_Filter_ObjectSizeRangeAndPrefix
=== RUN   TestAccS3BucketLifecycleConfiguration_Filter_PrefixToAnd
=== PAUSE TestAccS3BucketLifecycleConfiguration_Filter_PrefixToAnd
=== RUN   TestAccS3BucketLifecycleConfiguration_multipleRules_noFilterOrPrefix
=== PAUSE TestAccS3BucketLifecycleConfiguration_multipleRules_noFilterOrPrefix
=== RUN   TestAccS3BucketLifecycleConfiguration_RulePrefixToFilter
=== PAUSE TestAccS3BucketLifecycleConfiguration_RulePrefixToFilter
=== RUN   TestAccS3BucketLifecycleConfiguration_Filter_Tag
=== PAUSE TestAccS3BucketLifecycleConfiguration_Filter_Tag
=== RUN   TestAccS3BucketLifecycleConfiguration_EmptyFilter_NonCurrentVersions
=== PAUSE TestAccS3BucketLifecycleConfiguration_EmptyFilter_NonCurrentVersions
=== RUN   TestAccS3BucketLifecycleConfiguration_Update_filterWithAndToFilterWithPrefix
=== PAUSE TestAccS3BucketLifecycleConfiguration_Update_filterWithAndToFilterWithPrefix
=== CONT  TestAccS3BucketLifecycleConfiguration_rule_NoFilterOrPrefix
=== CONT  TestAccS3BucketLifecycleConfiguration_Filter_ObjectSizeRange
=== CONT  TestAccS3BucketLifecycleConfiguration_Filter_objectSizeLessThanToPrefix
=== CONT  TestAccS3BucketLifecycleConfiguration_Filter_objectSizeGreaterThanToPrefix
=== CONT  TestAccS3BucketLifecycleConfiguration_Filter_ObjectSizeGreaterThanZero
=== CONT  TestAccS3BucketLifecycleConfiguration_RulePrefixToFilter
=== CONT  TestAccS3BucketLifecycleConfiguration_Filter_ObjectSizeGreaterThan
=== CONT  TestAccS3BucketLifecycleConfiguration_filterWithEmptyPrefix
=== CONT  TestAccS3BucketLifecycleConfiguration_Update_filterWithAndToFilterWithPrefix
=== CONT  TestAccS3BucketLifecycleConfiguration_Filter_PrefixToAnd
=== CONT  TestAccS3BucketLifecycleConfiguration_EmptyFilter_NonCurrentVersions
=== CONT  TestAccS3BucketLifecycleConfiguration_Filter_ObjectSizeLessThan
=== CONT  TestAccS3BucketLifecycleConfiguration_filterWithPrefix
=== CONT  TestAccS3BucketLifecycleConfiguration_Filter_Tag
=== CONT  TestAccS3BucketLifecycleConfiguration_Filter_ObjectSizeRangeAndPrefix
=== CONT  TestAccS3BucketLifecycleConfiguration_multipleRules_noFilterOrPrefix
--- PASS: TestAccS3BucketLifecycleConfiguration_multipleRules_noFilterOrPrefix (85.29s)
--- PASS: TestAccS3BucketLifecycleConfiguration_rule_NoFilterOrPrefix (85.91s)
--- PASS: TestAccS3BucketLifecycleConfiguration_Filter_ObjectSizeRangeAndPrefix (87.03s)
--- PASS: TestAccS3BucketLifecycleConfiguration_Filter_PrefixToAnd (163.60s)
--- PASS: TestAccS3BucketLifecycleConfiguration_Filter_ObjectSizeGreaterThanZero (165.68s)
--- PASS: TestAccS3BucketLifecycleConfiguration_Filter_Tag (165.87s)
--- PASS: TestAccS3BucketLifecycleConfiguration_filterWithEmptyPrefix (166.03s)
--- PASS: TestAccS3BucketLifecycleConfiguration_Filter_objectSizeLessThanToPrefix (166.09s)
--- PASS: TestAccS3BucketLifecycleConfiguration_Filter_ObjectSizeGreaterThan (166.23s)
--- PASS: TestAccS3BucketLifecycleConfiguration_filterWithPrefix (166.28s)
--- PASS: TestAccS3BucketLifecycleConfiguration_RulePrefixToFilter (166.56s)
--- PASS: TestAccS3BucketLifecycleConfiguration_Filter_ObjectSizeRange (166.56s)
--- PASS: TestAccS3BucketLifecycleConfiguration_Filter_objectSizeGreaterThanToPrefix (166.59s)
--- PASS: TestAccS3BucketLifecycleConfiguration_EmptyFilter_NonCurrentVersions (166.60s)
--- PASS: TestAccS3BucketLifecycleConfiguration_Filter_ObjectSizeLessThan (166.61s)
--- PASS: TestAccS3BucketLifecycleConfiguration_Update_filterWithAndToFilterWithPrefix (230.06s)
PASS
ok  	github.com/hashicorp/terraform-provider-aws/internal/service/s3	235.596s

Copy link
Contributor

@ewbankkit ewbankkit left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM 🚀.

@YakDriver YakDriver merged commit 96c39eb into hashicorp:main Oct 2, 2025
44 checks passed
@github-actions
Copy link
Contributor

github-actions bot commented Oct 2, 2025

Warning

This Issue has been closed, meaning that any additional comments are much easier for the maintainers to miss. Please assume that the maintainers will not see them.

Ongoing conversations amongst community members are welcome, however, the issue will be locked after 30 days. Moving conversations to another venue, such as the AWS Provider forum, is recommended. If you have additional concerns, please open a new issue, referencing this one where needed.

@github-actions github-actions bot added this to the v6.15.0 milestone Oct 2, 2025
@github-actions
Copy link
Contributor

github-actions bot commented Oct 2, 2025

This functionality has been released in v6.15.0 of the Terraform AWS Provider. Please see the Terraform documentation on provider versioning or reach out if you need any assistance upgrading.

For further feature requests or bug reports with this functionality, please create a new GitHub issue following the template. Thank you!

@github-actions
Copy link
Contributor

github-actions bot commented Nov 2, 2025

I'm going to lock this pull request because it has been closed for 30 days ⏳. This helps our maintainers find and focus on the active issues.
If you have found a problem that seems related to this change, please open a new issue and complete the issue template so we can capture all the details necessary to investigate further.

@github-actions github-actions bot locked as resolved and limited conversation to collaborators Nov 2, 2025
Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

documentation Introduces or discusses updates to documentation. service/s3 Issues and PRs that pertain to the s3 service. size/XS Managed by automation to categorize the size of a PR.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

aws_s3_bucket_lifecycle_configuration regression starting in 5.90.0 aws_s3_bucket_lifecycle_configuration empty filter block produces a warning

4 participants