Skip to content

Commit 049ed26

Browse files
authored
Merge pull request #15461 from hashicorp/f-s3-obj-copy
s3_object_copy: New resource
2 parents 725b1f3 + f419e31 commit 049ed26

6 files changed

Lines changed: 962 additions & 23 deletions

aws/data_source_aws_s3_bucket_object.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -175,7 +175,7 @@ func dataSourceAwsS3BucketObjectRead(d *schema.ResourceData, meta interface{}) e
175175
d.Set("metadata", pointersMapToStringList(out.Metadata))
176176
d.Set("object_lock_legal_hold_status", out.ObjectLockLegalHoldStatus)
177177
d.Set("object_lock_mode", out.ObjectLockMode)
178-
d.Set("object_lock_retain_until_date", flattenS3ObjectLockRetainUntilDate(out.ObjectLockRetainUntilDate))
178+
d.Set("object_lock_retain_until_date", flattenS3ObjectDate(out.ObjectLockRetainUntilDate))
179179
d.Set("server_side_encryption", out.ServerSideEncryption)
180180
d.Set("sse_kms_key_id", out.SSEKMSKeyId)
181181
d.Set("version_id", out.VersionId)

aws/provider.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -930,6 +930,7 @@ func Provider() *schema.Provider {
930930
"aws_s3_bucket_notification": resourceAwsS3BucketNotification(),
931931
"aws_s3_bucket_metric": resourceAwsS3BucketMetric(),
932932
"aws_s3_bucket_inventory": resourceAwsS3BucketInventory(),
933+
"aws_s3_object_copy": resourceAwsS3ObjectCopy(),
933934
"aws_s3control_bucket": resourceAwsS3ControlBucket(),
934935
"aws_s3control_bucket_policy": resourceAwsS3ControlBucketPolicy(),
935936
"aws_s3control_bucket_lifecycle_configuration": resourceAwsS3ControlBucketLifecycleConfiguration(),

aws/resource_aws_s3_bucket_object.go

Lines changed: 31 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -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+
485494
func 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

Comments
 (0)