From cdba03099e5539708eec0123be886b5f459ff521 Mon Sep 17 00:00:00 2001 From: Ryn Daniels Date: Thu, 22 Aug 2019 09:33:34 +0100 Subject: [PATCH] Final retries for s3 timeouts --- aws/resource_aws_s3_bucket.go | 56 ++++++++----------- aws/resource_aws_s3_bucket_inventory.go | 11 ++++ aws/resource_aws_s3_bucket_metric.go | 3 + aws/resource_aws_s3_bucket_notification.go | 6 +- aws/resource_aws_s3_bucket_policy.go | 15 ++--- ...ource_aws_s3_bucket_public_access_block.go | 7 ++- 6 files changed, 56 insertions(+), 42 deletions(-) diff --git a/aws/resource_aws_s3_bucket.go b/aws/resource_aws_s3_bucket.go index b554d3d1b344..38a1b143b321 100644 --- a/aws/resource_aws_s3_bucket.go +++ b/aws/resource_aws_s3_bucket.go @@ -653,8 +653,7 @@ func resourceAwsS3BucketCreate(d *schema.ResourceData, meta interface{}) error { if awsErr.Code() == "OperationAborted" { log.Printf("[WARN] Got an error while trying to create S3 bucket %s: %s", bucket, err) return resource.RetryableError( - fmt.Errorf("Error creating S3 bucket %s, retrying: %s", - bucket, err)) + fmt.Errorf("Error creating S3 bucket %s, retrying: %s", bucket, err)) } } if err != nil { @@ -663,7 +662,9 @@ func resourceAwsS3BucketCreate(d *schema.ResourceData, meta interface{}) error { return nil }) - + if isResourceTimeoutError(err) { + _, err = s3conn.CreateBucket(req) + } if err != nil { return fmt.Errorf("Error creating S3 bucket: %s", err) } @@ -1328,17 +1329,18 @@ func resourceAwsS3BucketPolicyUpdate(s3conn *s3.S3, d *schema.ResourceData) erro } err := resource.Retry(1*time.Minute, func() *resource.RetryError { - if _, err := s3conn.PutBucketPolicy(params); err != nil { - if awserr, ok := err.(awserr.Error); ok { - if awserr.Code() == "MalformedPolicy" || awserr.Code() == s3.ErrCodeNoSuchBucket { - return resource.RetryableError(awserr) - } - } + _, err := s3conn.PutBucketPolicy(params) + if isAWSErr(err, "MalformedPolicy", "") || isAWSErr(err, s3.ErrCodeNoSuchBucket, "") { + return resource.RetryableError(err) + } + if err != nil { return resource.NonRetryableError(err) } return nil }) - + if isResourceTimeoutError(err) { + _, err = s3conn.PutBucketPolicy(params) + } if err != nil { return fmt.Errorf("Error putting S3 policy: %s", err) } @@ -1769,12 +1771,7 @@ func resourceAwsS3BucketServerSideEncryptionConfigurationUpdate(s3conn *s3.S3, d Bucket: aws.String(bucket), } - err := resource.Retry(1*time.Minute, func() *resource.RetryError { - if _, err := s3conn.DeleteBucketEncryption(i); err != nil { - return resource.NonRetryableError(err) - } - return nil - }) + _, err := s3conn.DeleteBucketEncryption(i) if err != nil { return fmt.Errorf("error removing S3 bucket server side encryption: %s", err) } @@ -1848,12 +1845,7 @@ func resourceAwsS3BucketReplicationConfigurationUpdate(s3conn *s3.S3, d *schema. Bucket: aws.String(bucket), } - err := resource.Retry(1*time.Minute, func() *resource.RetryError { - if _, err := s3conn.DeleteBucketReplication(i); err != nil { - return resource.NonRetryableError(err) - } - return nil - }) + _, err := s3conn.DeleteBucketReplication(i) if err != nil { return fmt.Errorf("Error removing S3 bucket replication: %s", err) } @@ -1974,15 +1966,18 @@ func resourceAwsS3BucketReplicationConfigurationUpdate(s3conn *s3.S3, d *schema. log.Printf("[DEBUG] S3 put bucket replication configuration: %#v", i) err := resource.Retry(1*time.Minute, func() *resource.RetryError { - if _, err := s3conn.PutBucketReplication(i); err != nil { - if isAWSErr(err, s3.ErrCodeNoSuchBucket, "") || - isAWSErr(err, "InvalidRequest", "Versioning must be 'Enabled' on the bucket") { - return resource.RetryableError(err) - } + _, err := s3conn.PutBucketReplication(i) + if isAWSErr(err, s3.ErrCodeNoSuchBucket, "") || isAWSErr(err, "InvalidRequest", "Versioning must be 'Enabled' on the bucket") { + return resource.RetryableError(err) + } + if err != nil { return resource.NonRetryableError(err) } return nil }) + if isResourceTimeoutError(err) { + _, err = s3conn.PutBucketReplication(i) + } if err != nil { return fmt.Errorf("Error putting S3 replication configuration: %s", err) } @@ -2000,12 +1995,7 @@ func resourceAwsS3BucketLifecycleUpdate(s3conn *s3.S3, d *schema.ResourceData) e Bucket: aws.String(bucket), } - err := resource.Retry(1*time.Minute, func() *resource.RetryError { - if _, err := s3conn.DeleteBucketLifecycle(i); err != nil { - return resource.NonRetryableError(err) - } - return nil - }) + _, err := s3conn.DeleteBucketLifecycle(i) if err != nil { return fmt.Errorf("Error removing S3 lifecycle: %s", err) } diff --git a/aws/resource_aws_s3_bucket_inventory.go b/aws/resource_aws_s3_bucket_inventory.go index bd8468dae404..7771a7232ffc 100644 --- a/aws/resource_aws_s3_bucket_inventory.go +++ b/aws/resource_aws_s3_bucket_inventory.go @@ -240,6 +240,9 @@ func resourceAwsS3BucketInventoryPut(d *schema.ResourceData, meta interface{}) e } return nil }) + if isResourceTimeoutError(err) { + _, err = conn.PutBucketInventoryConfiguration(input) + } if err != nil { return fmt.Errorf("Error putting S3 bucket inventory configuration: %s", err) } @@ -306,6 +309,14 @@ func resourceAwsS3BucketInventoryRead(d *schema.ResourceData, meta interface{}) } return nil }) + if isResourceTimeoutError(err) { + output, err = conn.GetBucketInventoryConfiguration(input) + if isAWSErr(err, s3.ErrCodeNoSuchBucket, "") || isAWSErr(err, "NoSuchConfiguration", "The specified configuration does not exist.") { + if !d.IsNewResource() { + return nil + } + } + } if err != nil { return fmt.Errorf("error getting S3 Bucket Inventory (%s): %s", d.Id(), err) } diff --git a/aws/resource_aws_s3_bucket_metric.go b/aws/resource_aws_s3_bucket_metric.go index a02008a54193..a4b4e5cafcfe 100644 --- a/aws/resource_aws_s3_bucket_metric.go +++ b/aws/resource_aws_s3_bucket_metric.go @@ -84,6 +84,9 @@ func resourceAwsS3BucketMetricPut(d *schema.ResourceData, meta interface{}) erro } return nil }) + if isResourceTimeoutError(err) { + _, err = conn.PutBucketMetricsConfiguration(input) + } if err != nil { return fmt.Errorf("Error putting S3 metric configuration: %s", err) } diff --git a/aws/resource_aws_s3_bucket_notification.go b/aws/resource_aws_s3_bucket_notification.go index 847762c599c4..cc7551ab0d63 100644 --- a/aws/resource_aws_s3_bucket_notification.go +++ b/aws/resource_aws_s3_bucket_notification.go @@ -310,7 +310,8 @@ func resourceAwsS3BucketNotificationPut(d *schema.ResourceData, meta interface{} log.Printf("[DEBUG] S3 bucket: %s, Putting notification: %v", bucket, i) err := resource.Retry(1*time.Minute, func() *resource.RetryError { - if _, err := s3conn.PutBucketNotificationConfiguration(i); err != nil { + _, err := s3conn.PutBucketNotificationConfiguration(i) + if err != nil { if awserr, ok := err.(awserr.Error); ok { switch awserr.Message() { case "Unable to validate the following destination configurations": @@ -323,6 +324,9 @@ func resourceAwsS3BucketNotificationPut(d *schema.ResourceData, meta interface{} // Successful put configuration return nil }) + if isResourceTimeoutError(err) { + _, err = s3conn.PutBucketNotificationConfiguration(i) + } if err != nil { return fmt.Errorf("Error putting S3 notification configuration: %s", err) } diff --git a/aws/resource_aws_s3_bucket_policy.go b/aws/resource_aws_s3_bucket_policy.go index ea41b6b7bce9..1dd05a858f23 100644 --- a/aws/resource_aws_s3_bucket_policy.go +++ b/aws/resource_aws_s3_bucket_policy.go @@ -54,17 +54,18 @@ func resourceAwsS3BucketPolicyPut(d *schema.ResourceData, meta interface{}) erro } err := resource.Retry(1*time.Minute, func() *resource.RetryError { - if _, err := s3conn.PutBucketPolicy(params); err != nil { - if awserr, ok := err.(awserr.Error); ok { - if awserr.Code() == "MalformedPolicy" { - return resource.RetryableError(awserr) - } - } + _, err := s3conn.PutBucketPolicy(params) + if isAWSErr(err, "MalformedPolicy", "") { + return resource.RetryableError(err) + } + if err != nil { return resource.NonRetryableError(err) } return nil }) - + if isResourceTimeoutError(err) { + _, err = s3conn.PutBucketPolicy(params) + } if err != nil { return fmt.Errorf("Error putting S3 policy: %s", err) } diff --git a/aws/resource_aws_s3_bucket_public_access_block.go b/aws/resource_aws_s3_bucket_public_access_block.go index a103cc0b265d..5cb75e3c50d0 100644 --- a/aws/resource_aws_s3_bucket_public_access_block.go +++ b/aws/resource_aws_s3_bucket_public_access_block.go @@ -85,6 +85,9 @@ func resourceAwsS3BucketPublicAccessBlockCreate(d *schema.ResourceData, meta int return nil }) + if isResourceTimeoutError(err) { + _, err = s3conn.PutPublicAccessBlock(input) + } if err != nil { return fmt.Errorf("error creating public access block policy for S3 bucket (%s): %s", bucket, err) } @@ -117,7 +120,9 @@ func resourceAwsS3BucketPublicAccessBlockRead(d *schema.ResourceData, meta inter return nil }) - + if isResourceTimeoutError(err) { + output, err = s3conn.GetPublicAccessBlock(input) + } if isAWSErr(err, s3control.ErrCodeNoSuchPublicAccessBlockConfiguration, "") { log.Printf("[WARN] S3 Bucket Public Access Block (%s) not found, removing from state", d.Id()) d.SetId("")