Skip to content

service/s3: presigned PutObject with Tagging set does not add tagging to object in S3 bucket. #1016

@jasdel

Description

@jasdel

Confirm by changing [ ] to [x] below to ensure that it's a bug:

Describe the bug
Objects uploaded to S3 ith presign Put Object URL withTagging parameter set, do not have the tagging metadata. The SDK hoists the x-amz-tagging header to the query string, which is ignored by S3. S3 requires the x-amz-tagging to be a signed header.

Version of AWS SDK for Go?
v0.31.0`

Version of Go (go version)?
v1.15.x

To Reproduce (observed behavior)

package main

import (
	"context"
	"fmt"
	"log"
	"os"
	"strings"

	"github.com/aws/aws-sdk-go-v2/aws"
	v4 "github.com/aws/aws-sdk-go-v2/aws/signer/v4"
	"github.com/aws/aws-sdk-go-v2/config"
	"github.com/aws/aws-sdk-go-v2/service/s3"
)

func main() {
	bucket := os.Args[1]
	key := os.Args[2]
	fileToPut := os.Args[3]

	presigned, err := getPresignedPut(context.TODO(), bucket, key)
	if err != nil {
		log.Fatalf("failed to get presigned URL, %v", err)
	}

	var headerStr strings.Builder
	for k, vs := range presigned.SignedHeader {
		for _, v := range vs {
			fmt.Fprintf(&headerStr, "-H \"%s: %s\" \\\n", k, v)
		}
	}
	fmt.Printf("curl -X %s \\\n%s-d @%s \\\n%q\n",
		presigned.Method, headerStr.String(), fileToPut, presigned.URL)
}

func getPresignedPut(ctx context.Context, bucket, key string) (*v4.PresignedHTTPRequest, error) {
	cfg, err := config.LoadDefaultConfig(ctx)
	if err != nil {
		return nil, fmt.Errorf("failed to load config, %w", err)
	}

	client := s3.NewPresignClient(s3.NewFromConfig(cfg))

	presigned, err := client.PresignPutObject(ctx, &s3.PutObjectInput{
		Bucket:  &bucket,
		Key:     &key,
		Tagging: aws.String("mytagname=mytagvalue"),
	})
	if err != nil {
		return nil, fmt.Errorf("failed to get PutObject presigned URL, %w", err)
	}

	return presigned, nil
}

Expected behavior
To be able to put the object to S3 with the tagged header.

Additional context
Add any other context about the problem here.

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugThis issue is a bug.

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions