From 2171e2118f6a51e6151a74d61e1356e62b5282de Mon Sep 17 00:00:00 2001 From: Evan Phoenix Date: Tue, 9 May 2017 15:39:58 -0700 Subject: [PATCH 1/3] Don't error out getting s3 object tags in govcloud --- .../providers/aws/resource_aws_s3_bucket_object.go | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/builtin/providers/aws/resource_aws_s3_bucket_object.go b/builtin/providers/aws/resource_aws_s3_bucket_object.go index 968344f69e..e2853a47dd 100644 --- a/builtin/providers/aws/resource_aws_s3_bucket_object.go +++ b/builtin/providers/aws/resource_aws_s3_bucket_object.go @@ -216,6 +216,8 @@ func resourceAwsS3BucketObjectPut(d *schema.ResourceData, meta interface{}) erro func resourceAwsS3BucketObjectRead(d *schema.ResourceData, meta interface{}) error { s3conn := meta.(*AWSClient).s3conn + restricted := meta.(*AWSClient).IsGovCloud() || meta.(*AWSClient).IsChinaCloud() + bucket := d.Get("bucket").(string) key := d.Get("key").(string) @@ -275,9 +277,14 @@ func resourceAwsS3BucketObjectRead(d *schema.ResourceData, meta interface{}) err Key: aws.String(key), }) if err != nil { - return fmt.Errorf("Failed to get object tags (bucket: %s, key: %s): %s", bucket, key, err) + // Treat the inability to get object tags in a restricted regions as a + // soft error. + if !restricted { + return err + } + } else { + d.Set("tags", tagsToMapS3(tagResp.TagSet)) } - d.Set("tags", tagsToMapS3(tagResp.TagSet)) return nil } From 1ff7fe5ebe44ed6a453a7e5a188385e4ea2a2a99 Mon Sep 17 00:00:00 2001 From: Evan Phoenix Date: Tue, 9 May 2017 15:41:12 -0700 Subject: [PATCH 2/3] Use properly described error --- builtin/providers/aws/resource_aws_s3_bucket_object.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/builtin/providers/aws/resource_aws_s3_bucket_object.go b/builtin/providers/aws/resource_aws_s3_bucket_object.go index e2853a47dd..a25e161c23 100644 --- a/builtin/providers/aws/resource_aws_s3_bucket_object.go +++ b/builtin/providers/aws/resource_aws_s3_bucket_object.go @@ -280,7 +280,7 @@ func resourceAwsS3BucketObjectRead(d *schema.ResourceData, meta interface{}) err // Treat the inability to get object tags in a restricted regions as a // soft error. if !restricted { - return err + return fmt.Errorf("Failed to get object tags (bucket: %s, key: %s): %s", bucket, key, err) } } else { d.Set("tags", tagsToMapS3(tagResp.TagSet)) From 3c68a992c6a19e44159580647589b25898b0c9ca Mon Sep 17 00:00:00 2001 From: Evan Phoenix Date: Wed, 10 May 2017 11:13:03 -0700 Subject: [PATCH 3/3] Be explicit about when tags are supported on S3 --- .../aws/resource_aws_s3_bucket_object.go | 23 +++++++++++-------- 1 file changed, 13 insertions(+), 10 deletions(-) diff --git a/builtin/providers/aws/resource_aws_s3_bucket_object.go b/builtin/providers/aws/resource_aws_s3_bucket_object.go index a25e161c23..c149141872 100644 --- a/builtin/providers/aws/resource_aws_s3_bucket_object.go +++ b/builtin/providers/aws/resource_aws_s3_bucket_object.go @@ -127,6 +127,8 @@ func resourceAwsS3BucketObject() *schema.Resource { func resourceAwsS3BucketObjectPut(d *schema.ResourceData, meta interface{}) error { s3conn := meta.(*AWSClient).s3conn + restricted := meta.(*AWSClient).IsGovCloud() || meta.(*AWSClient).IsChinaCloud() + var body io.ReadSeeker if v, ok := d.GetOk("source"); ok { @@ -192,6 +194,10 @@ func resourceAwsS3BucketObjectPut(d *schema.ResourceData, meta interface{}) erro } if v, ok := d.GetOk("tags"); ok { + if restricted { + return fmt.Errorf("This region does not allow for tags on S3 objects") + } + // The tag-set must be encoded as URL Query parameters. values := url.Values{} for k, v := range v.(map[string]interface{}) { @@ -271,18 +277,15 @@ func resourceAwsS3BucketObjectRead(d *schema.ResourceData, meta interface{}) err d.Set("storage_class", resp.StorageClass) } - tagResp, err := s3conn.GetObjectTagging( - &s3.GetObjectTaggingInput{ - Bucket: aws.String(bucket), - Key: aws.String(key), - }) - if err != nil { - // Treat the inability to get object tags in a restricted regions as a - // soft error. - if !restricted { + if !restricted { + tagResp, err := s3conn.GetObjectTagging( + &s3.GetObjectTaggingInput{ + Bucket: aws.String(bucket), + Key: aws.String(key), + }) + if err != nil { return fmt.Errorf("Failed to get object tags (bucket: %s, key: %s): %s", bucket, key, err) } - } else { d.Set("tags", tagsToMapS3(tagResp.TagSet)) }