将所有文件从 Amazon S3 存储桶复制到 Microsoft Azure 容器的最佳方法
Posted
技术标签:
【中文标题】将所有文件从 Amazon S3 存储桶复制到 Microsoft Azure 容器的最佳方法【英文标题】:best way to copy all files from Amazon S3 bucket to a Microsoft Azure Container 【发布时间】:2015-06-27 23:17:28 【问题描述】:我需要将 Amazon S3 存储桶中的所有文件(例如 100.000 多个视频文件)复制(出于备份目的)到一个空的 Azure Blob 容器。 我们不会从 Amazon 迁移到 Azure,但我们需要备份,以防万一……
最快的方法是什么?
我了解到 Azure 能够从 Amazon S3 下载文件本身,而无需通过本地计算机。这会很棒,因为我们将节省大量带宽和时间...
我还阅读了有关此项目的信息: https://github.com/kpfaulkner/azurecopy 但是我目前没有装有 Windows 操作系统的计算机(如果必须的话,我会考虑用它设置一个虚拟机)。 有没有办法用MAC做到这一点? 还是从 bash 命令行?还是在 php 中?
非常感谢
【问题讨论】:
【参考方案1】:我为此准备了一个 Java 8 程序...
这个项目将使用 Java 8 在 Netbeans 8.0.1 中构建。首先我们将创建一个新的 Maven Java 应用程序。 Maven 将用于导入 AWS 和 Azure SDK。
将您的项目命名为 AWStoAzure,并将 mycompany 替换为您的常用软件包系统。
打开 Pom.xml 和下面给出的 pom。
我的程序的关键步骤涉及比 Azure SDK 更多的 Amazon SDK 功能。使用 Amazon SDK,我首先使用提供的公钥和私钥连接到我的 Amazon 帐户。
接下来,我检索位于给定存储桶中的所有文件的列表,并检索每个文件的元数据。
然后,我使用 Java 8 的新流功能启动多个线程,每个线程负责连接到 Azure 并启动文件传输过程。
Azure 作为 SDK 的一部分提供了用于提供 http(s) url 并将该 URL 中的数据加载到您的 blob 中的服务。此 SDK 功能将大部分工作负载放在 Azure 上,并允许我的工具在将数据加载到 blob 时不必保持连接到任何云服务。
Amazon S3 使用类似命名约定的文件夹,但 blob 存储没有此功能,因此我为 S3 中的每个文件夹创建了 contains。
亚马逊的 SDK 提供了生成 URL 的能力,该 URL 中嵌入了帐户的用户名和密码。这使我们能够将文件公开给 Azure,而不必担心文件会向公共 Internet 开放。
包括我使用的 POM 文件。
Java 源码
/*
* To change this license header, choose License Headers in Project Properties.
* To change this template file, choose Tools | Templates
* and open the template in the editor.
*/
package com.microsoft.azure.aws;
import com.amazonaws.HttpMethod;
import com.amazonaws.auth.BasicAWSCredentials;
import com.amazonaws.services.s3.AmazonS3Client;
import com.amazonaws.services.s3.model.GeneratePresignedUrlRequest;
import com.amazonaws.services.s3.model.S3ObjectSummary;
import com.microsoft.azure.storage.CloudStorageAccount;
import com.microsoft.azure.storage.OperationContext;
import com.microsoft.azure.storage.StorageException;
import com.microsoft.azure.storage.blob.CloudBlobContainer;
import java.net.URI;
import java.net.URISyntaxException;
import java.security.InvalidKeyException;
import java.util.Date;
import java.util.logging.Level;
import java.util.logging.Logger;
/**
*
* @author Dan
*/
public class AzuretoAWSDriver
private static String connectionString = "";
public static void run(String accessKey, String secretKey, String bucketName)
AmazonS3Client amazonS3Client = new AmazonS3Client(new BasicAWSCredentials(accessKey, secretKey));
amazonS3Client.listObjects(bucketName)
.getObjectSummaries()
.stream()
.forEach(s3ObjectSummary
-> S3toBlob(amazonS3Client, s3ObjectSummary));
public static void S3toBlob(AmazonS3Client amazonS3Client, S3ObjectSummary s3ObjectSummary)
try
String[] split = s3ObjectSummary.getKey().split("/");
GetContainer(s3ObjectSummary)
.getBlockBlobReference(split[split.length - 1])
.startCopyFromBlob(GetURL(amazonS3Client, s3ObjectSummary), null, null, null, new OperationContext());
catch (URISyntaxException | StorageException | InvalidKeyException ex)
Logger.getLogger(AzuretoAWSDriver.class.getName()).log(Level.SEVERE, null, ex);
private static CloudBlobContainer GetContainer(S3ObjectSummary s3ObjectSummary) throws URISyntaxException, InvalidKeyException, StorageException
String[] split = s3ObjectSummary.getKey().split("/");
String folders = "";
for (int i = 0; i < split.length - 2; i++)
folders += split[i];
CloudBlobContainer containerReference = CloudStorageAccount
.parse(connectionString)
.createCloudBlobClient()
.getContainerReference(s3ObjectSummary.getBucketName() + folders);
containerReference.createIfNotExists();
return containerReference;
private static URI GetURL(AmazonS3Client amazonS3Client, S3ObjectSummary s3ObjectSummary) throws URISyntaxException
return amazonS3Client.generatePresignedUrl(
new GeneratePresignedUrlRequest(s3ObjectSummary.getBucketName(), s3ObjectSummary.getKey())
.withMethod(HttpMethod.GET)
.withExpiration(GetExperation())).toURI();
private static Date GetExperation()
return new Date((new Date().getTime()) + 60 * 60 * 1000);
Pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.microsoft</groupId>
<artifactId>AWStoAzure2</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>jar</packaging>
<name>AWS SDK for Java Sample</name>
<url>http://aws.amazon.com/sdkforjava</url>
<dependencies>
<dependency>
<groupId>com.amazonaws</groupId>
<artifactId>aws-java-sdk</artifactId>
<version>[1.7.2,2.0.0)</version>
</dependency>
<dependency>
<groupId>com.microsoft.windowsazure.storage</groupId>
<artifactId>microsoft-windowsazure-storage-sdk</artifactId>
<version>1.1.0</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>exec-maven-plugin</artifactId>
<version>1.2.1</version>
<executions>
<execution>
<goals>
<goal>java</goal>
</goals>
</execution>
</executions>
<configuration>
<mainClass>AwsSdkSample</mainClass>
</configuration>
</plugin>
</plugins>
</build>
<properties>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
</properties>
</project>
【讨论】:
【参考方案2】:有一些工具可以做你想做的事。谷歌Cloud Data Migration
。
您可能需要考虑的另一件事是增量复制。例如,当您第二次启动复制任务时,您不想再次复制所有对象,而只需要添加/更新/删除对象。
【讨论】:
请谨慎链接到第三方网站,有人可能会认为这是垃圾邮件并标记,删除它。 Don't be a spammer. 感谢凯文的建议!我确实为这家公司工作,但认为我的回答会有所帮助。不想发送垃圾邮件或违反任何规则。 是的,我认为你没有:)。以上是关于将所有文件从 Amazon S3 存储桶复制到 Microsoft Azure 容器的最佳方法的主要内容,如果未能解决你的问题,请参考以下文章
Amazon S3,如何将 JSON 文件复制到另一个在更新原始文件时更新的存储桶?