Skip to content

Commit ab935b2

Browse files
authored
r/s3_bucket: read-only server_side_encryption_configuration argument (#22605)
* feat: deprecate 'server_side_encryption_configuration' argument * Update CHANGELOG for #22605 * Update .changelog/22605.txt * correct S3 error codes * gofmt of course; fix incorrect map key 'rules' * Update website/docs/r/s3_bucket.html.markdown * set sse with nil if dne for bucket; remove tests that have migrated over to the separate resource * spell check while we're here... * remove lifecycle.ignore_changes from s3_bucket_sse_config tests * add instructions for breaking change introduced in #22605
1 parent 400170c commit ab935b2

File tree

6 files changed

+140
-398
lines changed

6 files changed

+140
-398
lines changed

.changelog/22605.txt

+3
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
```release-note:breaking-change
2+
resource/aws_s3_bucket: The `server_side_encryption_configuration` argument has been deprecated and is now read-only. Use the `aws_s3_bucket_server_side_encryption_configuration` resource instead.
3+
```

internal/service/s3/bucket.go

+61-115
Original file line numberDiff line numberDiff line change
@@ -557,38 +557,40 @@ func ResourceBucket() *schema.Resource {
557557
},
558558

559559
"server_side_encryption_configuration": {
560-
Type: schema.TypeList,
561-
MaxItems: 1,
562-
Optional: true,
560+
Type: schema.TypeList,
561+
Computed: true,
562+
Deprecated: "Use the aws_s3_bucket_server_side_encryption_configuration resource instead",
563563
Elem: &schema.Resource{
564564
Schema: map[string]*schema.Schema{
565565
"rule": {
566-
Type: schema.TypeList,
567-
MaxItems: 1,
568-
Required: true,
566+
Type: schema.TypeList,
567+
Computed: true,
568+
Deprecated: "Use the aws_s3_bucket_server_side_encryption_configuration resource instead",
569569
Elem: &schema.Resource{
570570
Schema: map[string]*schema.Schema{
571571
"apply_server_side_encryption_by_default": {
572-
Type: schema.TypeList,
573-
MaxItems: 1,
574-
Required: true,
572+
Type: schema.TypeList,
573+
Computed: true,
574+
Deprecated: "Use the aws_s3_bucket_server_side_encryption_configuration resource instead",
575575
Elem: &schema.Resource{
576576
Schema: map[string]*schema.Schema{
577577
"kms_master_key_id": {
578-
Type: schema.TypeString,
579-
Optional: true,
578+
Type: schema.TypeString,
579+
Computed: true,
580+
Deprecated: "Use the aws_s3_bucket_server_side_encryption_configuration resource instead",
580581
},
581582
"sse_algorithm": {
582-
Type: schema.TypeString,
583-
Required: true,
584-
ValidateFunc: validation.StringInSlice(s3.ServerSideEncryption_Values(), false),
583+
Type: schema.TypeString,
584+
Computed: true,
585+
Deprecated: "Use the aws_s3_bucket_server_side_encryption_configuration resource instead",
585586
},
586587
},
587588
},
588589
},
589590
"bucket_key_enabled": {
590-
Type: schema.TypeBool,
591-
Optional: true,
591+
Type: schema.TypeBool,
592+
Computed: true,
593+
Deprecated: "Use the aws_s3_bucket_server_side_encryption_configuration resource instead",
592594
},
593595
},
594596
},
@@ -788,12 +790,6 @@ func resourceBucketUpdate(d *schema.ResourceData, meta interface{}) error {
788790
}
789791
}
790792

791-
if d.HasChange("server_side_encryption_configuration") {
792-
if err := resourceBucketInternalServerSideEncryptionConfigurationUpdate(conn, d); err != nil {
793-
return err
794-
}
795-
}
796-
797793
if d.HasChange("object_lock_configuration") {
798794
if err := resourceBucketInternalObjectLockConfigurationUpdate(conn, d); err != nil {
799795
return err
@@ -1181,16 +1177,16 @@ func resourceBucketRead(d *schema.ResourceData, meta interface{}) error {
11811177
Bucket: aws.String(d.Id()),
11821178
})
11831179
})
1184-
if err != nil && !tfawserr.ErrMessageContains(err, "ServerSideEncryptionConfigurationNotFoundError", "encryption configuration was not found") {
1185-
return fmt.Errorf("error getting S3 Bucket encryption: %s", err)
1180+
if err != nil && !tfawserr.ErrMessageContains(err, ErrCodeServerSideEncryptionConfigurationNotFound, "encryption configuration was not found") {
1181+
return fmt.Errorf("error getting S3 Bucket encryption: %w", err)
11861182
}
11871183

1188-
serverSideEncryptionConfiguration := make([]map[string]interface{}, 0)
1189-
if encryption, ok := encryptionResponse.(*s3.GetBucketEncryptionOutput); ok && encryption.ServerSideEncryptionConfiguration != nil {
1190-
serverSideEncryptionConfiguration = flattenServerSideEncryptionConfiguration(encryption.ServerSideEncryptionConfiguration)
1191-
}
1192-
if err := d.Set("server_side_encryption_configuration", serverSideEncryptionConfiguration); err != nil {
1193-
return fmt.Errorf("error setting server_side_encryption_configuration: %s", err)
1184+
if encryption, ok := encryptionResponse.(*s3.GetBucketEncryptionOutput); ok {
1185+
if err := d.Set("server_side_encryption_configuration", flattenServerSideEncryptionConfiguration(encryption.ServerSideEncryptionConfiguration)); err != nil {
1186+
return fmt.Errorf("error setting server_side_encryption_configuration: %w", err)
1187+
}
1188+
} else {
1189+
d.Set("server_side_encryption_configuration", nil)
11941190
}
11951191

11961192
// Object Lock configuration.
@@ -1583,73 +1579,6 @@ func resourceBucketInternalVersioningUpdate(conn *s3.S3, bucket string, versioni
15831579
return nil
15841580
}
15851581

1586-
func resourceBucketInternalServerSideEncryptionConfigurationUpdate(conn *s3.S3, d *schema.ResourceData) error {
1587-
bucket := d.Get("bucket").(string)
1588-
serverSideEncryptionConfiguration := d.Get("server_side_encryption_configuration").([]interface{})
1589-
if len(serverSideEncryptionConfiguration) == 0 {
1590-
log.Printf("[DEBUG] Delete server side encryption configuration: %#v", serverSideEncryptionConfiguration)
1591-
i := &s3.DeleteBucketEncryptionInput{
1592-
Bucket: aws.String(bucket),
1593-
}
1594-
1595-
_, err := conn.DeleteBucketEncryption(i)
1596-
if err != nil {
1597-
return fmt.Errorf("error removing S3 bucket server side encryption: %s", err)
1598-
}
1599-
return nil
1600-
}
1601-
1602-
c := serverSideEncryptionConfiguration[0].(map[string]interface{})
1603-
1604-
rc := &s3.ServerSideEncryptionConfiguration{}
1605-
1606-
rcRules := c["rule"].([]interface{})
1607-
var rules []*s3.ServerSideEncryptionRule
1608-
for _, v := range rcRules {
1609-
rr := v.(map[string]interface{})
1610-
rrDefault := rr["apply_server_side_encryption_by_default"].([]interface{})
1611-
sseAlgorithm := rrDefault[0].(map[string]interface{})["sse_algorithm"].(string)
1612-
kmsMasterKeyId := rrDefault[0].(map[string]interface{})["kms_master_key_id"].(string)
1613-
rcDefaultRule := &s3.ServerSideEncryptionByDefault{
1614-
SSEAlgorithm: aws.String(sseAlgorithm),
1615-
}
1616-
if kmsMasterKeyId != "" {
1617-
rcDefaultRule.KMSMasterKeyID = aws.String(kmsMasterKeyId)
1618-
}
1619-
rcRule := &s3.ServerSideEncryptionRule{
1620-
ApplyServerSideEncryptionByDefault: rcDefaultRule,
1621-
}
1622-
1623-
if val, ok := rr["bucket_key_enabled"].(bool); ok {
1624-
rcRule.BucketKeyEnabled = aws.Bool(val)
1625-
}
1626-
1627-
rules = append(rules, rcRule)
1628-
}
1629-
1630-
rc.Rules = rules
1631-
i := &s3.PutBucketEncryptionInput{
1632-
Bucket: aws.String(bucket),
1633-
ServerSideEncryptionConfiguration: rc,
1634-
}
1635-
log.Printf("[DEBUG] S3 put bucket replication configuration: %#v", i)
1636-
1637-
_, err := tfresource.RetryWhenAWSErrCodeEquals(
1638-
propagationTimeout,
1639-
func() (interface{}, error) {
1640-
return conn.PutBucketEncryption(i)
1641-
},
1642-
s3.ErrCodeNoSuchBucket,
1643-
ErrCodeOperationAborted,
1644-
)
1645-
1646-
if err != nil {
1647-
return fmt.Errorf("error putting S3 server side encryption configuration: %s", err)
1648-
}
1649-
1650-
return nil
1651-
}
1652-
16531582
func resourceBucketInternalObjectLockConfigurationUpdate(conn *s3.S3, d *schema.ResourceData) error {
16541583
// S3 Object Lock configuration cannot be deleted, only updated.
16551584
req := &s3.PutObjectLockConfigurationInput{
@@ -1843,24 +1772,41 @@ func flattenBucketLoggingEnabled(loggingEnabled *s3.LoggingEnabled) []interface{
18431772
return []interface{}{m}
18441773
}
18451774

1846-
func flattenServerSideEncryptionConfiguration(c *s3.ServerSideEncryptionConfiguration) []map[string]interface{} {
1847-
var encryptionConfiguration []map[string]interface{}
1848-
rules := make([]interface{}, 0, len(c.Rules))
1849-
for _, v := range c.Rules {
1850-
if v.ApplyServerSideEncryptionByDefault != nil {
1851-
r := make(map[string]interface{})
1852-
d := make(map[string]interface{})
1853-
d["kms_master_key_id"] = aws.StringValue(v.ApplyServerSideEncryptionByDefault.KMSMasterKeyID)
1854-
d["sse_algorithm"] = aws.StringValue(v.ApplyServerSideEncryptionByDefault.SSEAlgorithm)
1855-
r["apply_server_side_encryption_by_default"] = []map[string]interface{}{d}
1856-
r["bucket_key_enabled"] = aws.BoolValue(v.BucketKeyEnabled)
1857-
rules = append(rules, r)
1858-
}
1859-
}
1860-
encryptionConfiguration = append(encryptionConfiguration, map[string]interface{}{
1861-
"rule": rules,
1862-
})
1863-
return encryptionConfiguration
1775+
func flattenServerSideEncryptionConfiguration(c *s3.ServerSideEncryptionConfiguration) []interface{} {
1776+
if c == nil {
1777+
return []interface{}{}
1778+
}
1779+
1780+
m := map[string]interface{}{
1781+
"rule": flattenServerSideEncryptionConfigurationRules(c.Rules),
1782+
}
1783+
1784+
return []interface{}{m}
1785+
}
1786+
1787+
func flattenServerSideEncryptionConfigurationRules(rules []*s3.ServerSideEncryptionRule) []interface{} {
1788+
var results []interface{}
1789+
1790+
for _, rule := range rules {
1791+
m := make(map[string]interface{})
1792+
1793+
if rule.BucketKeyEnabled != nil {
1794+
m["bucket_key_enabled"] = aws.BoolValue(rule.BucketKeyEnabled)
1795+
}
1796+
1797+
if rule.ApplyServerSideEncryptionByDefault != nil {
1798+
m["apply_server_side_encryption_by_default"] = []interface{}{
1799+
map[string]interface{}{
1800+
"kms_master_key_id": aws.StringValue(rule.ApplyServerSideEncryptionByDefault.KMSMasterKeyID),
1801+
"sse_algorithm": aws.StringValue(rule.ApplyServerSideEncryptionByDefault.SSEAlgorithm),
1802+
},
1803+
}
1804+
}
1805+
1806+
results = append(results, m)
1807+
}
1808+
1809+
return results
18641810
}
18651811

18661812
func flattenBucketCorsRules(rules []*s3.CORSRule) []interface{} {

internal/service/s3/bucket_server_side_encryption_configuration_test.go

-36
Original file line numberDiff line numberDiff line change
@@ -397,12 +397,6 @@ func testAccBucketServerSideEncryptionConfigurationBasicConfig(rName string) str
397397
return fmt.Sprintf(`
398398
resource "aws_s3_bucket" "test" {
399399
bucket = %[1]q
400-
401-
lifecycle {
402-
ignore_changes = [
403-
server_side_encryption_configuration
404-
]
405-
}
406400
}
407401
408402
resource "aws_s3_bucket_server_side_encryption_configuration" "test" {
@@ -422,12 +416,6 @@ resource "aws_kms_key" "test" {
422416
423417
resource "aws_s3_bucket" "test" {
424418
bucket = %[1]q
425-
426-
lifecycle {
427-
ignore_changes = [
428-
server_side_encryption_configuration
429-
]
430-
}
431419
}
432420
433421
resource "aws_s3_bucket_server_side_encryption_configuration" "test" {
@@ -452,12 +440,6 @@ resource "aws_kms_key" "test" {
452440
453441
resource "aws_s3_bucket" "test" {
454442
bucket = %[1]q
455-
456-
lifecycle {
457-
ignore_changes = [
458-
server_side_encryption_configuration
459-
]
460-
}
461443
}
462444
463445
resource "aws_s3_bucket_server_side_encryption_configuration" "test" {
@@ -477,12 +459,6 @@ func testAccBucketServerSideEncryptionConfigurationConfig_ApplySSEByDefault_SSEA
477459
return fmt.Sprintf(`
478460
resource "aws_s3_bucket" "test" {
479461
bucket = %[1]q
480-
481-
lifecycle {
482-
ignore_changes = [
483-
server_side_encryption_configuration
484-
]
485-
}
486462
}
487463
488464
resource "aws_s3_bucket_server_side_encryption_configuration" "test" {
@@ -501,12 +477,6 @@ func testAccBucketServerSideEncryptionConfigurationConfig_BucketKeyEnabled(rName
501477
return fmt.Sprintf(`
502478
resource "aws_s3_bucket" "test" {
503479
bucket = %[1]q
504-
505-
lifecycle {
506-
ignore_changes = [
507-
server_side_encryption_configuration
508-
]
509-
}
510480
}
511481
512482
resource "aws_s3_bucket_server_side_encryption_configuration" "test" {
@@ -528,12 +498,6 @@ resource "aws_kms_key" "test" {
528498
529499
resource "aws_s3_bucket" "test" {
530500
bucket = %[1]q
531-
532-
lifecycle {
533-
ignore_changes = [
534-
server_side_encryption_configuration
535-
]
536-
}
537501
}
538502
539503
resource "aws_s3_bucket_server_side_encryption_configuration" "test" {

0 commit comments

Comments
 (0)