Skip to content

Commit 5b7c36d

Browse files
authored
r/s3_bucket: read-only versioning argument (#22606)
* feat: deprecate 'versioning' argument * Update CHANGELOG for #22606 * Update .changelog/22606.txt * update s3 bucket object docs with versioning resource * update additional s3 bucket object tests with versioning resource; update lifecycle config docs * add instructions for breaking change introduced in #22606 * fix SSE refs in tests
1 parent 6e1cd11 commit 5b7c36d

26 files changed

+596
-489
lines changed

.changelog/22606.txt

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
```release-note:breaking-change
2+
resource/aws_s3_bucket: The `versioning` argument has been deprecated and is now read-only. Use the `aws_s3_bucket_versioning` resource instead.
3+
```

internal/service/apigateway/domain_name_test.go

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -641,9 +641,12 @@ resource "aws_s3_bucket" "test" {
641641
bucket = %[1]q
642642
643643
force_destroy = true
644+
}
644645
645-
versioning {
646-
enabled = true
646+
resource "aws_s3_bucket_versioning" "test" {
647+
bucket = aws_s3_bucket.test.id
648+
versioning_configuration {
649+
status = "Enabled"
647650
}
648651
}
649652

internal/service/apigatewayv2/domain_name_test.go

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -499,9 +499,12 @@ resource "aws_s3_bucket" "test" {
499499
bucket = %[1]q
500500
501501
force_destroy = true
502+
}
502503
503-
versioning {
504-
enabled = true
504+
resource "aws_s3_bucket_versioning" "test" {
505+
bucket = aws_s3_bucket.test.id
506+
versioning_configuration {
507+
status = "Enabled"
505508
}
506509
}
507510

internal/service/athena/database_test.go

Lines changed: 11 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -363,18 +363,23 @@ resource "aws_kms_key" "hoge" {
363363
resource "aws_s3_bucket" "hoge" {
364364
bucket = "tf-test-athena-db-%[1]d"
365365
force_destroy = true
366+
}
367+
368+
resource "aws_s3_bucket_server_side_encryption_configuration" "test" {
369+
bucket = aws_s3_bucket.hoge.id
366370
367-
server_side_encryption_configuration {
368-
rule {
369-
apply_server_side_encryption_by_default {
370-
kms_master_key_id = aws_kms_key.hoge.arn
371-
sse_algorithm = "aws:kms"
372-
}
371+
rule {
372+
apply_server_side_encryption_by_default {
373+
kms_master_key_id = aws_kms_key.hoge.arn
374+
sse_algorithm = "aws:kms"
373375
}
374376
}
375377
}
376378
377379
resource "aws_athena_database" "hoge" {
380+
# Must have bucket SSE enabled first
381+
depends_on = [aws_s3_bucket_server_side_encryption_configuration.test]
382+
378383
name = "%[2]s"
379384
bucket = aws_s3_bucket.hoge.bucket
380385
force_destroy = %[3]t

internal/service/kafkaconnect/custom_plugin_test.go

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -260,13 +260,19 @@ func testAccCustomPluginConfigObjectVersion(name string) string {
260260
return fmt.Sprintf(`
261261
resource "aws_s3_bucket" "test" {
262262
bucket = %[1]q
263+
}
263264
264-
versioning {
265-
enabled = true
265+
resource "aws_s3_bucket_versioning" "test" {
266+
bucket = aws_s3_bucket.test.id
267+
versioning_configuration {
268+
status = "Enabled"
266269
}
267270
}
268271
269272
resource "aws_s3_object" "test" {
273+
# Must have versioning enabled first
274+
depends_on = [aws_s3_bucket_versioning.test]
275+
270276
bucket = aws_s3_bucket.test.id
271277
key = %[1]q
272278
source = "test-fixtures/mongodb-connector.jar"

internal/service/lambda/function_test.go

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3416,13 +3416,19 @@ resource "aws_s3_bucket" "artifacts" {
34163416
bucket = "%s"
34173417
acl = "private"
34183418
force_destroy = true
3419+
}
34193420
3420-
versioning {
3421-
enabled = true
3421+
resource "aws_s3_bucket_versioning" "artifacts" {
3422+
bucket = aws_s3_bucket.artifacts.id
3423+
versioning_configuration {
3424+
status = "Enabled"
34223425
}
34233426
}
34243427
34253428
resource "aws_s3_object" "o" {
3429+
# Must have versioning enabled first
3430+
depends_on = [aws_s3_bucket_versioning.artifacts]
3431+
34263432
bucket = aws_s3_bucket.artifacts.bucket
34273433
key = "%s"
34283434
source = "%s"

internal/service/mwaa/environment_test.go

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -519,9 +519,12 @@ resource "aws_security_group" "test" {
519519
resource "aws_s3_bucket" "test" {
520520
bucket = %[1]q
521521
acl = "private"
522+
}
522523
523-
versioning {
524-
enabled = true
524+
resource "aws_s3_bucket_versioning" "test" {
525+
bucket = aws_s3_bucket.test.id
526+
versioning_configuration {
527+
status = "Enabled"
525528
}
526529
}
527530
@@ -533,6 +536,9 @@ resource "aws_s3_bucket_public_access_block" "test" {
533536
}
534537
535538
resource "aws_s3_object" "dags" {
539+
# Must have bucket versioning enabled first
540+
depends_on = [aws_s3_bucket_versioning.test]
541+
536542
bucket = aws_s3_bucket.test.id
537543
acl = "private"
538544
key = "dags/"
@@ -579,6 +585,7 @@ resource "aws_iam_role_policy" "test" {
579585
POLICY
580586
}
581587
588+
582589
`, rName)
583590
}
584591

@@ -795,6 +802,9 @@ resource "aws_mwaa_environment" "test" {
795802
}
796803
797804
resource "aws_s3_object" "plugins" {
805+
# Must have bucket versioning enabled first
806+
depends_on = [aws_s3_bucket_versioning.test]
807+
798808
bucket = aws_s3_bucket.test.id
799809
acl = "private"
800810
key = "plugins.zip"

internal/service/s3/bucket.go

Lines changed: 9 additions & 109 deletions
Original file line numberDiff line numberDiff line change
@@ -220,21 +220,20 @@ func ResourceBucket() *schema.Resource {
220220
},
221221

222222
"versioning": {
223-
Type: schema.TypeList,
224-
Optional: true,
225-
Computed: true,
226-
MaxItems: 1,
223+
Type: schema.TypeList,
224+
Computed: true,
225+
Deprecated: "Use the aws_s3_bucket_versioning resource instead",
227226
Elem: &schema.Resource{
228227
Schema: map[string]*schema.Schema{
229228
"enabled": {
230-
Type: schema.TypeBool,
231-
Optional: true,
232-
Default: false,
229+
Type: schema.TypeBool,
230+
Computed: true,
231+
Deprecated: "Use the aws_s3_bucket_versioning resource instead",
233232
},
234233
"mfa_delete": {
235-
Type: schema.TypeBool,
236-
Optional: true,
237-
Default: false,
234+
Type: schema.TypeBool,
235+
Computed: true,
236+
Deprecated: "Use the aws_s3_bucket_versioning resource instead",
238237
},
239238
},
240239
},
@@ -751,23 +750,6 @@ func resourceBucketUpdate(d *schema.ResourceData, meta interface{}) error {
751750
}
752751
}
753752

754-
if d.HasChange("versioning") {
755-
v := d.Get("versioning").([]interface{})
756-
757-
if d.IsNewResource() {
758-
if versioning := expandVersioningWhenIsNewResource(v); versioning != nil {
759-
err := resourceBucketInternalVersioningUpdate(conn, d.Id(), versioning)
760-
if err != nil {
761-
return err
762-
}
763-
}
764-
} else {
765-
if err := resourceBucketInternalVersioningUpdate(conn, d.Id(), expandVersioning(v)); err != nil {
766-
return err
767-
}
768-
}
769-
}
770-
771753
if d.HasChange("acl") && !d.IsNewResource() {
772754
if err := resourceBucketACLUpdate(conn, d); err != nil {
773755
return err
@@ -1374,23 +1356,6 @@ func resourceBucketACLUpdate(conn *s3.S3, d *schema.ResourceData) error {
13741356
return nil
13751357
}
13761358

1377-
func resourceBucketInternalVersioningUpdate(conn *s3.S3, bucket string, versioningConfig *s3.VersioningConfiguration) error {
1378-
input := &s3.PutBucketVersioningInput{
1379-
Bucket: aws.String(bucket),
1380-
VersioningConfiguration: versioningConfig,
1381-
}
1382-
1383-
_, err := verify.RetryOnAWSCode(s3.ErrCodeNoSuchBucket, func() (interface{}, error) {
1384-
return conn.PutBucketVersioning(input)
1385-
})
1386-
1387-
if err != nil {
1388-
return fmt.Errorf("error putting S3 versioning for bucket (%s): %w", bucket, err)
1389-
}
1390-
1391-
return nil
1392-
}
1393-
13941359
func resourceBucketInternalObjectLockConfigurationUpdate(conn *s3.S3, d *schema.ResourceData) error {
13951360
// S3 Object Lock configuration cannot be deleted, only updated.
13961361
req := &s3.PutObjectLockConfigurationInput{
@@ -2233,71 +2198,6 @@ func expandS3ObjectLockConfiguration(vConf []interface{}) *s3.ObjectLockConfigur
22332198

22342199
// Versioning functions
22352200

2236-
func expandVersioning(l []interface{}) *s3.VersioningConfiguration {
2237-
if len(l) == 0 || l[0] == nil {
2238-
return nil
2239-
}
2240-
2241-
tfMap, ok := l[0].(map[string]interface{})
2242-
2243-
if !ok {
2244-
return nil
2245-
}
2246-
2247-
output := &s3.VersioningConfiguration{}
2248-
2249-
if v, ok := tfMap["enabled"].(bool); ok {
2250-
if v {
2251-
output.Status = aws.String(s3.BucketVersioningStatusEnabled)
2252-
} else {
2253-
output.Status = aws.String(s3.BucketVersioningStatusSuspended)
2254-
}
2255-
}
2256-
2257-
if v, ok := tfMap["mfa_delete"].(bool); ok {
2258-
if v {
2259-
output.MFADelete = aws.String(s3.MFADeleteEnabled)
2260-
} else {
2261-
output.MFADelete = aws.String(s3.MFADeleteDisabled)
2262-
}
2263-
}
2264-
2265-
return output
2266-
}
2267-
2268-
func expandVersioningWhenIsNewResource(l []interface{}) *s3.VersioningConfiguration {
2269-
if len(l) == 0 || l[0] == nil {
2270-
return nil
2271-
}
2272-
2273-
tfMap, ok := l[0].(map[string]interface{})
2274-
2275-
if !ok {
2276-
return nil
2277-
}
2278-
2279-
output := &s3.VersioningConfiguration{}
2280-
2281-
// Only set and return a non-nil VersioningConfiguration with at least one of
2282-
// MFADelete or Status enabled as the PutBucketVersioning API request
2283-
// does not need to be made for new buckets that don't require versioning.
2284-
// Reference: https://github.com/hashicorp/terraform-provider-aws/issues/4494
2285-
2286-
if v, ok := tfMap["enabled"].(bool); ok && v {
2287-
output.Status = aws.String(s3.BucketVersioningStatusEnabled)
2288-
}
2289-
2290-
if v, ok := tfMap["mfa_delete"].(bool); ok && v {
2291-
output.MFADelete = aws.String(s3.MFADeleteEnabled)
2292-
}
2293-
2294-
if output.MFADelete == nil && output.Status == nil {
2295-
return nil
2296-
}
2297-
2298-
return output
2299-
}
2300-
23012201
func flattenVersioning(versioning *s3.GetBucketVersioningOutput) []interface{} {
23022202
if versioning == nil {
23032203
return []interface{}{}

internal/service/s3/bucket_object_data_source_test.go

Lines changed: 28 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -548,13 +548,19 @@ func testAccBucketObjectDataSourceConfig_allParams(randInt int) string {
548548
return fmt.Sprintf(`
549549
resource "aws_s3_bucket" "object_bucket" {
550550
bucket = "tf-object-test-bucket-%[1]d"
551+
}
551552
552-
versioning {
553-
enabled = true
553+
resource "aws_s3_bucket_versioning" "test" {
554+
bucket = aws_s3_bucket.object_bucket.id
555+
versioning_configuration {
556+
status = "Enabled"
554557
}
555558
}
556559
557560
resource "aws_s3_object" "object" {
561+
# Must have bucket versioning enabled first
562+
depends_on = [aws_s3_bucket_versioning.test]
563+
558564
bucket = aws_s3_bucket.object_bucket.bucket
559565
key = "tf-testing-obj-%[1]d-all-params"
560566
@@ -586,16 +592,22 @@ func testAccBucketObjectDataSourceConfig_objectLockLegalHoldOff(randInt int) str
586592
resource "aws_s3_bucket" "object_bucket" {
587593
bucket = "tf-object-test-bucket-%[1]d"
588594
589-
versioning {
590-
enabled = true
591-
}
592-
593595
object_lock_configuration {
594596
object_lock_enabled = "Enabled"
595597
}
596598
}
597599
600+
resource "aws_s3_bucket_versioning" "test" {
601+
bucket = aws_s3_bucket.object_bucket.id
602+
versioning_configuration {
603+
status = "Enabled"
604+
}
605+
}
606+
598607
resource "aws_s3_object" "object" {
608+
# Must have bucket versioning enabled first
609+
depends_on = [aws_s3_bucket_versioning.test]
610+
599611
bucket = aws_s3_bucket.object_bucket.bucket
600612
key = "tf-testing-obj-%[1]d"
601613
content = "Hello World"
@@ -614,16 +626,22 @@ func testAccBucketObjectDataSourceConfig_objectLockLegalHoldOn(randInt int, reta
614626
resource "aws_s3_bucket" "object_bucket" {
615627
bucket = "tf-object-test-bucket-%[1]d"
616628
617-
versioning {
618-
enabled = true
619-
}
620-
621629
object_lock_configuration {
622630
object_lock_enabled = "Enabled"
623631
}
624632
}
625633
634+
resource "aws_s3_bucket_versioning" "test" {
635+
bucket = aws_s3_bucket.object_bucket.id
636+
versioning_configuration {
637+
status = "Enabled"
638+
}
639+
}
640+
626641
resource "aws_s3_object" "object" {
642+
# Must have bucket versioning enabled first
643+
depends_on = [aws_s3_bucket_versioning.test]
644+
627645
bucket = aws_s3_bucket.object_bucket.bucket
628646
key = "tf-testing-obj-%[1]d"
629647
content = "Hello World"

0 commit comments

Comments
 (0)