gpt4 book ai didi

azure - 将所有文件从 Amazon S3 存储桶复制到 Microsoft Azure 容器的最佳方法

转载 作者:行者123 更新时间:2023-12-03 04:42:49 26 4
gpt4 key购买 nike

我需要将所有文件(例如 100.000 多个视频文件)从 Amazon S3 存储桶复制(出于备份目的)到空的 Azure Blob 容器。我们不会从 Amazon 迁移到 Azure,但我们需要备份,以防万一...

哪种方法最快?

我了解到 Azure 能够从 Amazon S3 本身下载文件,而无需传递到本地计算机。这会很棒,因为我们将节省大量带宽和时间......

我还阅读了有关该项目的信息: https://github.com/kpfaulkner/azurecopy但我目前没有安装 Windows 操作系统的计算机(如果有必要,我会考虑用它设置虚拟机)。有没有办法用MAC来做呢?或者从 bash 命令行?或者用 PHP 编写?

非常感谢

最佳答案

我有一个 Java 8 程序用于此...

该项目将使用 Java 8 在 Netbeans 8.0.1 中构建。首先,我们将创建一个新的 Maven Java 应用程序。 Maven 将用于导入 AWS 和 Azure SDK。

enter image description here

将您的项目命名为 AWStoAzure,并将 mycompany 替换为您的典型软件包系统。

enter image description here

打开 Pom.xml 和下面给出的 pom。

我的程序的关键步骤涉及更多 Amazon SDK 功能,然后是 Azure SDK。使用 Amazon SDK,我首先使用提供的公钥和私钥连接到我的 Amazon 帐户。

enter image description here

接下来,我检索位于给定存储桶中的所有文件的列表,并检索每个文件的元数据。

enter image description here

然后,我使用 Java 8 的新流功能启动多个线程,每个线程负责连接到 Azure 并启动文件传输过程。

enter image description here

Azure 作为 SDK 的一部分提供了服务,用于提供 http(s) URL 并将数据从该 URL 加载到 Blob 中。此 SDK 功能将大部分工作负载放在 Azure 上,并且允许我的工具在将数据加载到 blob 时不必保持与任何云服务的连接。

enter image description here

Amazon S3 使用类似于文件夹的命名约定,但 Blob 存储没有此功能,因此我为 S3 中的每个文件夹创建包含。

enter image description here

亚马逊的 SDK 能够生成嵌入了帐户用户名和密码的 URL。这使我们能够将文件公开给 Azure,但不必担心文件会向公共(public)互联网开放。

enter image description here

包括我使用的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>

关于azure - 将所有文件从 Amazon S3 存储桶复制到 Microsoft Azure 容器的最佳方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29761302/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com