dongyingjiu0669 2018-06-08 20:38
浏览 153

在Golang中使用UploadPartCopy到MultiPartUpload时遇到AccessDenied

I am attempting to use S3 MultipartUpload to concat files in an S3 bucket. If you have several files >5MB (the last file can be smaller), you can concatenate them in S3 into a larger file. It's basically the equivalent of using cat to merge files together. When I attempt to do this in Go, I get:

An error occurred (AccessDenied) when calling the UploadPartCopy operation: Access Denied

The code looks kind of like this:

mpuOut, err := s3CreateMultipartUpload(&S3.CreateMultipartUploadInput{
    Bucket: aws.String(bucket),
    Key:    aws.String(concatenatedFile),
})
if err != nil {
    return err
}

var ps []*S3.CompletedPart
for i, part := range parts { // parts is a list of paths to things in s3
    partNumber := int64(i) + 1
    upOut, err := s3UploadPartCopy(&S3.UploadPartCopyInput{
        Bucket:     aws.String(bucket),
        CopySource: aws.String(part),
        Key:        aws.String(concatenatedFile),
        UploadId:   aws.String(*mpuOut.UploadId),
        PartNumber: aws.Int64(partNumber),
    })
    if err != nil {
        return err // <- fails here
    }
    ps = append(ps, &S3.CompletedPart{
        ETag:       s3Out.CopyPartResult.ETag,
        PartNumber: aws.Int64(int64(i)),
    })
}

_, err = s3CompleteMultipartUpload(&S3.CompleteMultipartUploadInput{
    Bucket:          aws.String(bucket),
    Key:             aws.String(concatenatedFile),
    MultipartUpload: &S3.CompletedMultipartUpload{Parts: ps},
    UploadId:        aws.String(*mpuOut.UploadId),
})
if err != nil {
    return err
}

_, err = s3CompleteMultipartUpload(&S3.CompleteMultipartUploadInput{
    Bucket:          aws.String(bucket),
    Key:             aws.String(concatenatedFile),
    MultipartUpload: &S3.CompletedMultipartUpload{Parts: ps},
    UploadId:        aws.String(*mpuOut.UploadId),
})
if err != nil {
    return err
}

When it runs, it blows up with the error above. The permissions on the bucket are wide open. Any ideas?

  • 写回答

1条回答 默认 最新

  • dqwn64004 2018-06-08 20:38
    关注

    Ok, so the problem is that when you are doing a UploadPartCopy, for the CopySource parameter, you don't just use the path in the s3 bucket. You have to put the buckname at the front of the path, even if it is in the same bucket. Derp

    mpuOut, err := s3CreateMultipartUpload(&S3.CreateMultipartUploadInput{
        Bucket: aws.String(bucket),
        Key:    aws.String(concatenatedFile),
    })
    if err != nil {
        return err
    }
    
    var ps []*S3.CompletedPart
    for i, part := range parts { // parts is a list of paths to things in s3
        partNumber := int64(i) + 1
        upOut, err := s3UploadPartCopy(&S3.UploadPartCopyInput{
            Bucket:     aws.String(bucket),
            CopySource: aws.String(fmt.Sprintf("%s/%s", bucket, part), // <- ugh
            Key:        aws.String(concatenatedFile),
            UploadId:   aws.String(*mpuOut.UploadId),
            PartNumber: aws.Int64(partNumber),
        })
        if err != nil {
            return err
        }
        ps = append(ps, &S3.CompletedPart{
            ETag:       s3Out.CopyPartResult.ETag,
            PartNumber: aws.Int64(int64(i)),
        })
    }
    
    _, err = s3CompleteMultipartUpload(&S3.CompleteMultipartUploadInput{
        Bucket:          aws.String(bucket),
        Key:             aws.String(concatenatedFile),
        MultipartUpload: &S3.CompletedMultipartUpload{Parts: ps},
        UploadId:        aws.String(*mpuOut.UploadId),
    })
    if err != nil {
        return err
    }
    
    _, err = s3CompleteMultipartUpload(&S3.CompleteMultipartUploadInput{
        Bucket:          aws.String(bucket),
        Key:             aws.String(concatenatedFile),
        MultipartUpload: &S3.CompletedMultipartUpload{Parts: ps},
        UploadId:        aws.String(*mpuOut.UploadId),
    })
    if err != nil {
        return err
    }
    

    This just wasted about an hour of my life, so I figure I would try to save someone else the trouble.

    评论

报告相同问题?

悬赏问题

  • ¥15 ETLCloud 处理json多层级问题
  • ¥15 matlab中使用gurobi时报错
  • ¥15 这个主板怎么能扩出一两个sata口
  • ¥15 不是,这到底错哪儿了😭
  • ¥15 2020长安杯与连接网探
  • ¥15 关于#matlab#的问题:在模糊控制器中选出线路信息,在simulink中根据线路信息生成速度时间目标曲线(初速度为20m/s,15秒后减为0的速度时间图像)我想问线路信息是什么
  • ¥15 banner广告展示设置多少时间不怎么会消耗用户价值
  • ¥16 mybatis的代理对象无法通过@Autowired装填
  • ¥15 可见光定位matlab仿真
  • ¥15 arduino 四自由度机械臂