@@ -283,7 +283,7 @@ func resourceAwsS3BucketObjectPut(d *schema.ResourceData, meta interface{}) erro
283283 }
284284
285285 if v , ok := d .GetOk ("object_lock_retain_until_date" ); ok {
286- putInput .ObjectLockRetainUntilDate = expandS3ObjectLockRetainUntilDate (v .(string ))
286+ putInput .ObjectLockRetainUntilDate = expandS3ObjectDate (v .(string ))
287287 }
288288
289289 if _ , err := s3conn .PutObject (putInput ); err != nil {
@@ -343,24 +343,12 @@ func resourceAwsS3BucketObjectRead(d *schema.ResourceData, meta interface{}) err
343343 d .Set ("website_redirect" , resp .WebsiteRedirectLocation )
344344 d .Set ("object_lock_legal_hold_status" , resp .ObjectLockLegalHoldStatus )
345345 d .Set ("object_lock_mode" , resp .ObjectLockMode )
346- d .Set ("object_lock_retain_until_date" , flattenS3ObjectLockRetainUntilDate (resp .ObjectLockRetainUntilDate ))
346+ d .Set ("object_lock_retain_until_date" , flattenS3ObjectDate (resp .ObjectLockRetainUntilDate ))
347347
348- // Only set non-default KMS key ID (one that doesn't match default)
349- if resp .SSEKMSKeyId != nil {
350- // retrieve S3 KMS Default Master Key
351- kmsconn := meta .(* AWSClient ).kmsconn
352- kmsresp , err := kmsconn .DescribeKey (& kms.DescribeKeyInput {
353- KeyId : aws .String ("alias/aws/s3" ),
354- })
355- if err != nil {
356- return fmt .Errorf ("Failed to describe default S3 KMS key (alias/aws/s3): %s" , err )
357- }
358-
359- if * resp .SSEKMSKeyId != * kmsresp .KeyMetadata .Arn {
360- log .Printf ("[DEBUG] S3 object is encrypted using a non-default KMS Key ID: %s" , * resp .SSEKMSKeyId )
361- d .Set ("kms_key_id" , resp .SSEKMSKeyId )
362- }
348+ if err := resourceAwsS3BucketObjectSetKMS (d , meta , resp .SSEKMSKeyId ); err != nil {
349+ return fmt .Errorf ("bucket object KMS: %w" , err )
363350 }
351+
364352 // See https://forums.aws.amazon.com/thread.jspa?threadID=44003
365353 d .Set ("etag" , strings .Trim (aws .StringValue (resp .ETag ), `"` ))
366354
@@ -427,15 +415,15 @@ func resourceAwsS3BucketObjectUpdate(d *schema.ResourceData, meta interface{}) e
427415 Key : aws .String (key ),
428416 Retention : & s3.ObjectLockRetention {
429417 Mode : aws .String (d .Get ("object_lock_mode" ).(string )),
430- RetainUntilDate : expandS3ObjectLockRetainUntilDate (d .Get ("object_lock_retain_until_date" ).(string )),
418+ RetainUntilDate : expandS3ObjectDate (d .Get ("object_lock_retain_until_date" ).(string )),
431419 },
432420 }
433421
434422 // Bypass required to lower or clear retain-until date.
435423 if d .HasChange ("object_lock_retain_until_date" ) {
436424 oraw , nraw := d .GetChange ("object_lock_retain_until_date" )
437- o := expandS3ObjectLockRetainUntilDate (oraw .(string ))
438- n := expandS3ObjectLockRetainUntilDate (nraw .(string ))
425+ o := expandS3ObjectDate (oraw .(string ))
426+ n := expandS3ObjectDate (nraw .(string ))
439427 if n == nil || (o != nil && n .Before (* o )) {
440428 req .BypassGovernanceRetention = aws .Bool (true )
441429 }
@@ -482,6 +470,27 @@ func resourceAwsS3BucketObjectDelete(d *schema.ResourceData, meta interface{}) e
482470 return nil
483471}
484472
473+ func resourceAwsS3BucketObjectSetKMS (d * schema.ResourceData , meta interface {}, sseKMSKeyId * string ) error {
474+ // Only set non-default KMS key ID (one that doesn't match default)
475+ if sseKMSKeyId != nil {
476+ // retrieve S3 KMS Default Master Key
477+ kmsconn := meta .(* AWSClient ).kmsconn
478+ kmsresp , err := kmsconn .DescribeKey (& kms.DescribeKeyInput {
479+ KeyId : aws .String ("alias/aws/s3" ),
480+ })
481+ if err != nil {
482+ return fmt .Errorf ("Failed to describe default S3 KMS key (alias/aws/s3): %s" , err )
483+ }
484+
485+ if * sseKMSKeyId != * kmsresp .KeyMetadata .Arn {
486+ log .Printf ("[DEBUG] S3 object is encrypted using a non-default KMS Key ID: %s" , * sseKMSKeyId )
487+ d .Set ("kms_key_id" , sseKMSKeyId )
488+ }
489+ }
490+
491+ return nil
492+ }
493+
485494func validateMetadataIsLowerCase (v interface {}, k string ) (ws []string , errors []error ) {
486495 value := v .(map [string ]interface {})
487496
@@ -693,7 +702,7 @@ func deleteS3ObjectVersion(conn *s3.S3, b, k, v string, force bool) error {
693702 return err
694703}
695704
696- func expandS3ObjectLockRetainUntilDate (v string ) * time.Time {
705+ func expandS3ObjectDate (v string ) * time.Time {
697706 t , err := time .Parse (time .RFC3339 , v )
698707 if err != nil {
699708 return nil
@@ -702,7 +711,7 @@ func expandS3ObjectLockRetainUntilDate(v string) *time.Time {
702711 return aws .Time (t )
703712}
704713
705- func flattenS3ObjectLockRetainUntilDate (t * time.Time ) string {
714+ func flattenS3ObjectDate (t * time.Time ) string {
706715 if t == nil {
707716 return ""
708717 }
0 commit comments