代码之家  ›  专栏  ›  技术社区  ›  Eduardo

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

  •  0
  • Eduardo  · 技术社区  · 6 年前

    我有两个桶,每个桶都有一个专用的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 因为我的AWS凭证,我用它设置的SDK没有访问源文件的权限。

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

    1 回复  |  直到 6 年前
        1
  •  1
  •   Michael - sqlbot    6 年前

    不支持此操作。Put+复制服务API,由 s3Client.copyObject() ,使用内部S3机制复制对象,源对象作为 /bucket/key --不是完整的URL。没有可用于从URL、S3或其他位置提取的API功能。

    使用put+copy,向s3发出请求的用户…

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

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

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

    从EC2开始……或者运行在源区域中的lambda函数是最划算的,但是如果对象大于lambda临时空间,则必须编写钩子和处理程序才能从流中读取数据并将数据块转换为多部分上载…这不是不可能的,但需要一些心理上的转变来理解你实际上试图说服你的代码去做什么。