Amazon S3在具有不同身份验证的两个存储桶之间复制

时间:2019-02-11 13:11:54

标签: java amazon-s3

我有两个存储桶,每个存储桶都有一个专用ACL。

我有一个到源的经过身份验证的链接:

String source = "https://bucket-name.s3.region.amazonaws.com/key?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Date=...&X-Amz-SignedHeaders=host&X-Amz-Expires=86400&X-Amz-Credential=...Signature=..."

,并一直尝试使用Java SDK CopyObjectRequest通过以下方式将其复制到另一个存储桶中:

AWSCredentials credentials = new BasicAWSCredentials(accessKey, secretKey)
AWSCredentialsProvider provider = new AWSStaticCredentialsProvider(credentials)

AmazonS3 s3Client = AmazonS3ClientBuilder
  .standard()
  .withCredentials(provider)

AmazonS3URI sourceURI = new AmazonS3URI(URI(source))
CopyObjectRequest request = new CopyObjectRequest(sourceURI.getBucket, sourceURI.getKey, destinationBucket, destinationKey);
s3Client.copyObject(request);

但是我得到AmazonS3Exception: Access Denied (Service: Amazon S3; Status Code: 403; Error Code: AccessDenied的原因是,我使用SDK设置的AWS凭证无法访问源文件。

有没有一种方法可以提供经过身份验证的源URL,而不仅仅是bucketkey

1 个答案:

答案 0 :(得分:1)

不支持。 s3Client.copyObject()使用的PUT + Copy服务API使用内部S3机制复制对象,并且源对象以/bucket/key的形式传递-而不是完整的URL。没有API功能可用于从URL,S3或其他方式获取。

使用PUT + Copy,用户向S3发送请求...

  

必须具有对源对象的READ访问权限和对目标存储桶的WRITE访问权限

     

https://docs.aws.amazon.com/AmazonS3/latest/API/RESTObjectCOPY.html

唯一的选择是下载,然后上传。

从EC2执行此操作或在源区域中运行Lambda函数将是最经济的方法,但是如果对象大于Lambda临时空间,则必须编写钩子和处理程序才能读取从流中处理并将片段拼凑成分段上传...并非没有可能,但是需要一些灵巧的动作才能理解您实际上是在说服您的代码做什么。