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

启用vpc端点时如何将S3对象从一个区域复制到另一个区域

  •  0
  • Wpigott  · 技术社区  · 7 年前

    最近,我无法使用 s3.copyObject(sourceBucket, sourceKey, destBucket, destKey); 因为两个原因。

    1) 源和目标存储桶位于两个不同的区域(在我的示例中为us-east-1和us-east2)。

    2) 服务器所在的区域位于启用了S3端点的专有网络中。S3端点是S3的内部连接, 但仅在同一地区

    考虑到我们正在移动大型文件,我们甚至暂时都无法下载然后上传。我们还希望保持S3端点在适当的位置,因为应用程序一旦进入该地区,就会认真使用S3资产。

    1 回复  |  直到 7 年前
        1
  •  0
  •   Wpigott    7 年前

    解决方案是将文件从一个流复制到另一个流。我编写了这个简单的函数来处理它。

    ZipException只是一个自定义异常。你想扔什么就扔什么。

    希望这对某人有所帮助。

    public static void copyObject(AmazonS3 sourceClient, AmazonS3 destClient, String sourceBucket, String sourceKey, String destBucket, String destKey) throws IOException {
    
        S3ObjectInputStream inStream = null;
        try {
            GetObjectRequest request = new GetObjectRequest(sourceBucket, sourceKey);
            S3Object object = sourceClient.getObject(request);
    
            inStream = object.getObjectContent();
            destClient.putObject(destBucket,
                    destKey, inStream, object.getObjectMetadata());
    
    
        } catch (SdkClientException e) {
            throw new ZipException("Unable to copy file.", e);
        } finally {
            if (inStream != null) {
                inStream.close();
            }
        }
    }