From 55a1e0ab212c8933f23772a9e44665e504d6631d Mon Sep 17 00:00:00 2001 From: Brian Flad Date: Mon, 29 Mar 2021 20:50:18 -0400 Subject: [PATCH] resource/aws_s3_bucket_object: Minor standardization of read-after-create logic, add CHANGELOG for #17236 Output from acceptance testing in AWS Commercial: ``` --- PASS: TestAccAWSS3BucketObject_acl (149.28s) --- PASS: TestAccAWSS3BucketObject_content (55.47s) --- PASS: TestAccAWSS3BucketObject_contentBase64 (56.32s) --- PASS: TestAccAWSS3BucketObject_defaultBucketSSE (59.92s) --- PASS: TestAccAWSS3BucketObject_empty (43.51s) --- PASS: TestAccAWSS3BucketObject_etagEncryption (55.44s) --- PASS: TestAccAWSS3BucketObject_ignoreTags (49.17s) --- PASS: TestAccAWSS3BucketObject_kms (56.66s) --- PASS: TestAccAWSS3BucketObject_metadata (117.12s) --- PASS: TestAccAWSS3BucketObject_noNameNoKey (13.28s) --- PASS: TestAccAWSS3BucketObject_NonVersioned (55.95s) --- PASS: TestAccAWSS3BucketObject_ObjectLockLegalHoldStartWithNone (150.69s) --- PASS: TestAccAWSS3BucketObject_ObjectLockLegalHoldStartWithOn (94.45s) --- PASS: TestAccAWSS3BucketObject_ObjectLockRetentionStartWithNone (138.35s) --- PASS: TestAccAWSS3BucketObject_ObjectLockRetentionStartWithSet (173.42s) --- PASS: TestAccAWSS3BucketObject_source (40.22s) --- PASS: TestAccAWSS3BucketObject_sse (40.00s) --- PASS: TestAccAWSS3BucketObject_storageClass (185.50s) --- PASS: TestAccAWSS3BucketObject_tags (146.46s) --- PASS: TestAccAWSS3BucketObject_tagsLeadingMultipleSlashes (162.23s) --- PASS: TestAccAWSS3BucketObject_tagsLeadingSingleSlash (163.67s) --- PASS: TestAccAWSS3BucketObject_tagsMultipleSlashes (164.13s) --- PASS: TestAccAWSS3BucketObject_updates (92.91s) --- PASS: TestAccAWSS3BucketObject_updateSameFile (98.47s) --- PASS: TestAccAWSS3BucketObject_updatesWithVersioning (91.82s) --- PASS: TestAccAWSS3BucketObject_updatesWithVersioningViaAccessPoint (115.35s) --- PASS: TestAccAWSS3BucketObject_withContentCharacteristics (39.88s) ``` Output from acceptance testing in AWS GovCloud (US): ``` --- PASS: TestAccAWSS3BucketObject_acl (133.53s) --- PASS: TestAccAWSS3BucketObject_content (72.98s) --- PASS: TestAccAWSS3BucketObject_contentBase64 (55.80s) --- PASS: TestAccAWSS3BucketObject_defaultBucketSSE (79.15s) --- PASS: TestAccAWSS3BucketObject_empty (56.26s) --- PASS: TestAccAWSS3BucketObject_etagEncryption (73.86s) --- PASS: TestAccAWSS3BucketObject_ignoreTags (113.53s) --- PASS: TestAccAWSS3BucketObject_kms (73.81s) --- PASS: TestAccAWSS3BucketObject_metadata (96.90s) --- PASS: TestAccAWSS3BucketObject_noNameNoKey (13.58s) --- PASS: TestAccAWSS3BucketObject_ObjectLockLegalHoldStartWithNone (134.48s) --- PASS: TestAccAWSS3BucketObject_ObjectLockLegalHoldStartWithOn (82.00s) --- PASS: TestAccAWSS3BucketObject_ObjectLockRetentionStartWithNone (97.82s) --- PASS: TestAccAWSS3BucketObject_ObjectLockRetentionStartWithSet (124.65s) --- PASS: TestAccAWSS3BucketObject_source (56.30s) --- PASS: TestAccAWSS3BucketObject_sse (64.91s) --- PASS: TestAccAWSS3BucketObject_storageClass (170.44s) --- PASS: TestAccAWSS3BucketObject_tags (126.19s) --- PASS: TestAccAWSS3BucketObject_tagsLeadingMultipleSlashes (155.33s) --- PASS: TestAccAWSS3BucketObject_tagsLeadingSingleSlash (161.70s) --- PASS: TestAccAWSS3BucketObject_tagsMultipleSlashes (156.13s) --- PASS: TestAccAWSS3BucketObject_updates (106.26s) --- PASS: TestAccAWSS3BucketObject_updateSameFile (106.70s) --- PASS: TestAccAWSS3BucketObject_updatesWithVersioning (112.11s) --- PASS: TestAccAWSS3BucketObject_updatesWithVersioningViaAccessPoint (114.20s) --- PASS: TestAccAWSS3BucketObject_withContentCharacteristics (56.20s) --- SKIP: TestAccAWSS3BucketObject_NonVersioned (1.53s) ``` --- .changelog/17236.txt | 3 +++ aws/resource_aws_s3_bucket_object.go | 23 +++++++++++++---------- 2 files changed, 16 insertions(+), 10 deletions(-) create mode 100644 .changelog/17236.txt diff --git a/.changelog/17236.txt b/.changelog/17236.txt new file mode 100644 index 000000000000..c00165e6e3d0 --- /dev/null +++ b/.changelog/17236.txt @@ -0,0 +1,3 @@ +```release-note:bug +resource/aws_s3_bucket_object: Handle read-after-create eventual consistency +``` diff --git a/aws/resource_aws_s3_bucket_object.go b/aws/resource_aws_s3_bucket_object.go index 2b2af718f3fc..f8334e067fb9 100644 --- a/aws/resource_aws_s3_bucket_object.go +++ b/aws/resource_aws_s3_bucket_object.go @@ -20,6 +20,7 @@ import ( "github.com/hashicorp/terraform-plugin-sdk/v2/helper/validation" "github.com/mitchellh/go-homedir" "github.com/terraform-providers/terraform-provider-aws/aws/internal/keyvaluetags" + "github.com/terraform-providers/terraform-provider-aws/aws/internal/tfresource" ) const s3BucketObjectCreationTimeout = 2 * time.Minute @@ -313,9 +314,10 @@ func resourceAwsS3BucketObjectRead(d *schema.ResourceData, meta interface{}) err } var resp *s3.HeadObjectOutput - var err error - err = resource.Retry(s3BucketObjectCreationTimeout, func() *resource.RetryError { + err := resource.Retry(s3BucketObjectCreationTimeout, func() *resource.RetryError { + var err error + resp, err = s3conn.HeadObject(input) if d.IsNewResource() && isAWSErrRequestFailureStatusCode(err, 404) { @@ -329,19 +331,20 @@ func resourceAwsS3BucketObjectRead(d *schema.ResourceData, meta interface{}) err return nil }) - if isResourceTimeoutError(err) { + if tfresource.TimedOut(err) { resp, err = s3conn.HeadObject(input) } + if !d.IsNewResource() && isAWSErrRequestFailureStatusCode(err, 404) { + log.Printf("[WARN] S3 Object (%s) not found, removing from state", d.Id()) + d.SetId("") + return nil + } + if err != nil { - // If S3 returns a 404 Request Failure, mark the object as destroyed - if isAWSErrRequestFailureStatusCode(err, 404) { - d.SetId("") - log.Printf("[WARN] Error Reading Object (%s), object not found (HTTP status 404)", key) - return nil - } - return err + return fmt.Errorf("error reading S3 Object (%s): %w", d.Id(), err) } + log.Printf("[DEBUG] Reading S3 Bucket Object meta: %s", resp) d.Set("cache_control", resp.CacheControl)