

本文属于机器翻译版本。若本译文内容与英语原文存在差异，则一律以英文原文为准。

# 使用 Rclone 将数据从 Microsoft Azure Blob 迁移至 Amazon S3
<a name="migrate-data-from-microsoft-azure-blob-to-amazon-s3-by-using-rclone"></a>

*Suhas Basavaraj、Aidan Keane 和 Corey Lane，Amazon Web Services*

## Summary
<a name="migrate-data-from-microsoft-azure-blob-to-amazon-s3-by-using-rclone-summary"></a>

此模式描述如何使用[克隆](https://rclone.org/)将数据从 Microsoft Azure Blob 对象存储迁移到 Amazon Simple Storage Service (Amazon S3) 存储桶。您可使用此模式对数据执行一次性迁移或持续同步。Rclone 是用 Go 编写的命令行程序，用于跨云提供商的各种存储技术移动数据。

## 先决条件和限制
<a name="migrate-data-from-microsoft-azure-blob-to-amazon-s3-by-using-rclone-prereqs"></a>

**先决条件**
+ 一个有效的 Amazon Web Services account
+ 存储在 Azure Blob 容器服务的数据

## 架构
<a name="migrate-data-from-microsoft-azure-blob-to-amazon-s3-by-using-rclone-architecture"></a>

**源技术堆栈**
+ Azure Blob 存储容器

**目标技术堆栈**
+ 亚马逊 S3 存储桶
+ 亚马逊弹性计算云 (亚马逊 EC2) Linux 实例

**架构**

![将数据从 Microsoft Azure 迁移至 Amazon S3](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/images/pattern-img/6ead815d-7768-4726-b27d-97a70cd21081/images/abe69eee-632f-4ca2-abf6-3223f3f3ec94.png)


## 工具
<a name="migrate-data-from-microsoft-azure-blob-to-amazon-s3-by-using-rclone-tools"></a>
+ [Amazon Simple Storage Service (Amazon S3)](https://docs.aws.amazon.com/AmazonS3/latest/userguide/Welcome.html) 是一项基于云的对象存储服务，可帮助您存储、保护和检索任意数量的数据。
+ [Rclone](https://rclone.org/) 是一款受 **rsync** 启发的开源命令行程序。它用于管理许多云存储平台文件。

## 最佳实践
<a name="migrate-data-from-microsoft-azure-blob-to-amazon-s3-by-using-rclone-best-practices"></a>

将数据从 Azure 迁移至 Amazon S3 时，请注意以下注意事项，以避免不必要的成本或传输速度变慢：
+ 在与 Azure 存储账户和 Blob 容器相同的地理区域中创建 AWS 基础设施，例如 AWS 区域 `us-east-1`（弗吉尼亚北部）以及 Azure 区域 `East US`。
+ 如果可能，请避免使用 NAT 网关，因为它会累积入口与出口带宽的数据传输费用。
+ 使用[适用于 Amazon S3 的 VPC 网关端点](https://docs.aws.amazon.com/vpc/latest/privatelink/vpc-endpoints-s3.html)提高性能。
+ 考虑使用基于 AWS Graviton2 (ARM) 处理器的 EC2 实例，与英特尔 x86 实例相比，成本更低，性能更高。Rclone 经过大量交叉编译，并提供了预编译 ARM 二进制文件。

## 操作说明
<a name="migrate-data-from-microsoft-azure-blob-to-amazon-s3-by-using-rclone-epics"></a>

### 准备 AWS 和 Azure 云资源
<a name="prepare-aws-and-azure-cloud-resources"></a>


| Task | 说明 | 所需技能 | 
| --- | --- | --- | 
| 准备目标 S3 存储桶。 | 在相应的 AWS 区域[创建新 S3 存储桶](https://docs.aws.amazon.com/AmazonS3/latest/userguide/create-bucket-overview.html)，或者选择现有存储桶作为要迁移的数据的目的地。 | AWS 管理员 | 
| 为亚马逊创建 IAM 实例角色 EC2。 | 为@@ [亚马逊创建一个新的 AWS 身份和访问管理 (IAM) 角色 EC2](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/iam-roles-for-amazon-ec2.html#working-with-iam-roles)。此角色授予您的 EC2 实例对目标 S3 存储桶的写入权限。 | AWS 管理员 | 
| 将 策略附加到 IAM 实例角色。 | 使用 IAM 控制台或 AWS 命令行界面 (AWS CLI) Line CLI 为实例角色创建内联策略， EC2 该策略允许对目标 S3 存储桶进行写入访问权限。有关示例策略，请参阅[其他信息](#migrate-data-from-microsoft-azure-blob-to-amazon-s3-by-using-rclone-additional)部分。 | AWS 管理员 | 
| 启动实 EC2 例。 | 启动配置为使用新创建的 IAM 服务角色的 Amazon Linux EC2 实例。此实例还需通过互联网访问 Azure 公共 API 端点。 考虑使用[基于 AWS Graviton 的 EC2 实例来降低成本](https://docs.aws.amazon.com/compute-optimizer/latest/ug/graviton-recommendations.html)。Rclone 提供了 ARM 编译二进制文件。 | AWS 管理员 | 
| 创建 Azure AD 服务主体。 | 使用 Azure CLI 创建对源 Azure Blob 存储容器具有只读访问权限的 Azure Active Directory (Azure AD) 服务主体。有关说明，请参阅[其他信息](#migrate-data-from-microsoft-azure-blob-to-amazon-s3-by-using-rclone-additional)部分。将这些证书存储在您的 EC2 实例上，存储到相应的位置`~/azure-principal.json`。 | 云管理员，Azure | 

### 安装和配置 Rclone
<a name="install-and-configure-rclone"></a>


| Task | 说明 | 所需技能 | 
| --- | --- | --- | 
| 下载并安装 Rclone。 | 下载和安装 Rclone 命令行程序。有关安装说明，请参阅 [Rclone 安装文档](https://rclone.org/install/)。 | 常规 AWS，云管理员 | 
| 配置 Rclone。 | 复制以下 `rclone.conf` 示例文件。将 `AZStorageAccount` 替换为您的 Azure Storage 账户名称，将 `us-east-1` 替换为 S3 存储桶所在的 AWS 区域。将此文件保存到您的 EC2 实例`~/.config/rclone/rclone.conf`上的相应位置。<pre>[AZStorageAccount]<br />type = azureblob<br />account = AZStorageAccount<br />service_principal_file = azure-principal.json<br /><br />[s3]<br />type = s3<br />provider = AWS<br />env_auth = true<br />region = us-east-1</pre> | 常规 AWS，云管理员 | 
| 验证 Rclone 配置。 | 若要确认 Rclone 已配置且权限是否正常运行，请验证 Rclone 是否可以解析您的配置文件，以及 Azure Blob 容器和 S3 存储桶中的对象是否可以访问。有关示例验证命令，请参阅以下内容。[See the AWS documentation website for more details](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/migrate-data-from-microsoft-azure-blob-to-amazon-s3-by-using-rclone.html) | 常规 AWS，云管理员 | 

### 通过 Rclone 迁移数据
<a name="migrate-data-using-rclone"></a>


| Task | 说明 | 所需技能 | 
| --- | --- | --- | 
| 从容器迁移数据。 | 运行 Rclone [复制](https://rclone.org/commands/rclone_copy/)或者[同步](https://rclone.org/commands/rclone_sync/)命令。 <br />**示例：复制**<br />此命令将数据从源 Azure Blob 容器复制至目标 S3 存储桶。<pre>rclone copy AZStorageAccount:blob-container s3:amzn-s3-demo-bucket1</pre><br />**示例：同步**<br />此命令在源 Azure Blob 容器和目标 S3 存储桶间同步数据。****<pre>rclone sync AZStorageAccount:blob-container s3:amzn-s3-demo-bucket1</pre>使用 **sync** 命令时，源容器中不存在的数据将从目标 S3 存储桶中删除。 | 常规 AWS，云管理员 | 
| 同步容器。 | 初始复制完成后，运行 Rclone **sync** 命令以进行持续迁移，这样只会复制目标 S3 存储桶中缺少的新文件。 | 常规 AWS，云管理员 | 
| 验证数据是否成功迁移。 | 若要检查数据是否已成功复制到目标 S3 存储桶，请运行Rclone [lsd](https://rclone.org/commands/rclone_lsd/) 和 [ls](https://rclone.org/commands/rclone_ls/) 命令。 | 常规 AWS，云管理员 | 

## 相关资源
<a name="migrate-data-from-microsoft-azure-blob-to-amazon-s3-by-using-rclone-resources"></a>
+ [Amazon S3 用户指南](https://docs.aws.amazon.com/AmazonS3/latest/userguide/Welcome.html)（AWS 文档）
+ [亚马逊的 IAM 角色 EC2](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/iam-roles-for-amazon-ec2.html)（AWS 文档）
+ [创建 Microsoft Azure Blob 容器](https://docs.microsoft.com/en-us/azure/storage/blobs/storage-quickstart-blobs-portal)（Microsoft Azure 文档）
+ [Rclone 命令](https://rclone.org/commands/)（Rclone 文档）

## 附加信息
<a name="migrate-data-from-microsoft-azure-blob-to-amazon-s3-by-using-rclone-additional"></a>

**实例的角色策略示 EC2 例**

该策略授予您的 EC2 实例对您账户中特定存储桶的读写权限。如果您的存储桶使用客户管理的密钥进行服务器端加密，则策略可能需要对 AWS Key Management Service (AWS KMS) 的额外访问权限。

```
{
    "Version": "2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "s3:ListBucket",
                "s3:DeleteObject",
                "s3:GetObject",
                "s3:PutObject",
                "s3:PutObjectAcl"
            ],
            "Resource": [
              "arn:aws:s3:::amzn-s3-demo-bucket/*",
              "arn:aws:s3:::amzn-s3-demo-bucket"
            ]
        },
        {
            "Effect": "Allow",
            "Action": "s3:ListAllMyBuckets",
            "Resource": "arn:aws:s3:::*"
        }    
    ]
}
```

**创建只读 Azure AD 服务主体**

Azure 服务主体是客户应用程序、服务和自动化工具用来访问特定 Azure 资源的安全标识。可以将其视为具有特定角色和严格控制访问资源的权限的用户身份（登录名和密码或证书）。要创建只读服务主体、以遵循最低权限并保护 Azure 中的数据免遭意外删除，请按照以下步骤操作：

1. 登录你的 Microsoft Azure 云账户门户，在工作站上启动云命令行 PowerShell 或使用 Azure 命令行界面 (CLI)。

1. 创建服务主体，并将其配置为对 Azure Blob 存储账户的[只读](https://docs.microsoft.com/en-us/azure/role-based-access-control/built-in-roles#storage-blob-data-reader)访问权限。将此命令 JSON 输出保存到名为 `azure-principal.json` 的本地文件中。该文件将上传到您的 EC2 实例。将大括号（`{`和`}`）中显示的占位符变量替换为您的 Azure 订阅 ID、资源组名称和存储账户名称。

   ```
   az ad sp create-for-rbac `
   --name AWS-Rclone-Reader `
   --role "Storage Blob Data Reader" `
   --scopes /subscriptions/{Subscription ID}/resourceGroups/{Resource Group Name}/providers/Microsoft.Storage/storageAccounts/{Storage Account Name}
   ```