使用 AzCopy 将数据从 Amazon S3 复制到 Azure 存储

AzCopy 是一个命令行实用工具,可用于向/从存储帐户复制 Blob 或文件。 本文介绍如何使用 AzCopy 将对象、目录和桶从 Amazon Web Services (AWS) S3 复制到 Azure Blob 存储。

注释

AzCopy 支持 AWS 定义的标准虚拟托管样式或路径样式 URL。 例如:https://bucket.s3.amazonaws.comhttps://s3.amazonaws.com/bucket

选择如何提供授权凭据

  • 若要对 Azure 存储授权,请使用 Microsoft Entra ID 或共享访问签名 (SAS) 令牌。

  • 若要对 AWS S3 授权,请使用 AWS 访问密钥和机密访问密钥。

对 Azure 存储授权

请参阅 AzCopy 入门一文下载 AzCopy,并选择如何提供存储服务的授权凭据。

注释

本文中的示例假定你使用 AzCopy login 命令验证身份。 然后,AzCopy 使用 Microsoft Entra 帐户授权访问 Blob 存储中的数据。

如果你希望使用 SAS 令牌来授权访问 Blob 数据,可将该令牌追加到每个 AzCopy 命令中的资源 URL。

例如: https://mystorageaccount.blob.core.chinacloudapi.cn/mycontainer?<SAS-token>

对 AWS S3 授权

收集 AWS 访问密钥和机密访问密钥,然后设置以下环境变量:

操作系统 命令
Windows 操作系统 PowerShell:$env:AWS_ACCESS_KEY_ID=<access-key>
$env:AWS_SECRET_ACCESS_KEY=<secret-access-key>
在命令提示符处使用 set AWS_ACCESS_KEY_ID=<access-key>
set AWS_SECRET_ACCESS_KEY=<secret-access-key>
Linux export AWS_ACCESS_KEY_ID=<access-key>
export AWS_SECRET_ACCESS_KEY=<secret-access-key>
macOS export AWS_ACCESS_KEY_ID=<access-key>
export AWS_SECRET_ACCESS_KEY=<secret-access-key>

这些凭据用于生成用于复制对象的预签名 URL。

复制对象、目录和桶

AzCopy 使用从 URL 放置块 API,因此数据将在 AWS S3 与存储服务器之间直接复制。 这些复制操作不会占用计算机的网络带宽。

小窍门

本部分中的示例将路径参数括在单引号 ('') 中。 在除 Windows 命令 Shell (cmd.exe) 以外的所有命令 shell 中,都请使用单引号。 如果使用 Windows 命令 Shell (cmd.exe),请用双引号 ("") 而不是单引号 ('') 括住路径参数。

这些示例也适用于具有分层命名空间的帐户。 Data Lake Storage 上的多协议访问使你可以在这些帐户上使用相同的 URL 语法 (blob.core.chinacloudapi.cn)。

复制对象

对具有分层命名空间的帐户使用相同的 URL 语法 (blob.core.chinacloudapi.cn)。

语法

azcopy copy 'https://s3.amazonaws.com/<bucket-name>/<object-name>' 'https://<storage-account-name>.blob.core.chinacloudapi.cn/<container-name>/<blob-name>'

示例

azcopy copy 'https://s3.amazonaws.com/mybucket/myobject' 'https://mystorageaccount.blob.core.chinacloudapi.cn/mycontainer/myblob'

注释

本文中的示例对 AWS S3 桶使用路径样式的 URL(例如:http://s3.amazonaws.com/<bucket-name>)。

也可以使用虚拟托管样式的 URL(例如:http://bucket.s3.amazonaws.com)。

若要详细了解 Bucket 的虚拟托管,请参阅 Bucket 的虚拟托管

复制目录

对具有分层命名空间的帐户使用相同的 URL 语法 (blob.core.chinacloudapi.cn)。

语法

azcopy copy 'https://s3.amazonaws.com/<bucket-name>/<directory-name>' 'https://<storage-account-name>.blob.core.chinacloudapi.cn/<container-name>/<directory-name>' --recursive=true

示例

azcopy copy 'https://s3.amazonaws.com/mybucket/mydirectory' 'https://mystorageaccount.blob.core.chinacloudapi.cn/mycontainer/mydirectory' --recursive=true

注释

本示例追加标志 --recursive 以复制所有子目录中的文件。

复制目录的内容

可以使用通配符 (*) 复制目录的内容,而无需复制包含内容的目录本身。

语法

azcopy copy 'https://s3.amazonaws.com/<bucket-name>/<directory-name>/*' 'https://<storage-account-name>.blob.core.chinacloudapi.cn/<container-name>/<directory-name>' --recursive=true

示例

azcopy copy 'https://s3.amazonaws.com/mybucket/mydirectory/*' 'https://mystorageaccount.blob.core.chinacloudapi.cn/mycontainer/mydirectory' --recursive=true

复制桶

对具有分层命名空间的帐户使用相同的 URL 语法 (blob.core.chinacloudapi.cn)。

语法

azcopy copy 'https://s3.amazonaws.com/<bucket-name>' 'https://<storage-account-name>.blob.core.chinacloudapi.cn/<container-name>' --recursive=true

示例

azcopy copy 'https://s3.amazonaws.com/mybucket' 'https://mystorageaccount.blob.core.chinacloudapi.cn/mycontainer' --recursive=true

复制所有区域中的所有桶

对具有分层命名空间的帐户使用相同的 URL 语法 (blob.core.chinacloudapi.cn)。

语法

azcopy copy 'https://s3.amazonaws.com/' 'https://<storage-account-name>.blob.core.chinacloudapi.cn' --recursive=true

示例

azcopy copy 'https://s3.amazonaws.com' 'https://mystorageaccount.blob.core.chinacloudapi.cn' --recursive=true

复制特定 S3 区域中的所有桶

对具有分层命名空间的帐户使用相同的 URL 语法 (blob.core.chinacloudapi.cn)。

语法

azcopy copy 'https://s3-<region-name>.amazonaws.com/' 'https://<storage-account-name>.blob.core.chinacloudapi.cn' --recursive=true

示例

azcopy copy 'https://s3-rds.eu-north-1.amazonaws.com' 'https://mystorageaccount.blob.core.chinacloudapi.cn' --recursive=true

处理对象命名规则的差异

与 Azure Blob 容器相比,AWS S3 对存储桶名称使用不同的命名约定集。 可在此处了解相关信息。 如果选择将一组桶复制到 Azure 存储帐户,复制操作可能因命名差异而失败。

AzCopy 处理可能出现的两个最常见问题:包含句点的存储桶和包含连续连字符的存储桶。 AWS S3 桶名称可以包含句点和连续的连字符,但 Azure 中的容器则不可以。 AzCopy 会将句点替换为连字符,并且将连续连字符替换为一个数字,该数字表示连续连字符的数量(例如,命名为 my----bucket 的存储桶变为 my-4-bucket)。

此外,在 AzCopy 复制文件时,它会检查并尝试解决命名冲突。 例如,如果存在名为 bucket-namebucket.name 的桶,则 AzCopy 会将名为 bucket.name 的桶解析为 bucket-name,再将后者解析为 bucket-name-2

处理对象元数据的差异

AWS S3 和 Azure 允许在对象键名称中使用不同的字符集。 可在此处了解 AWS S3 使用的字符。 在 Azure 端,Blob 对象键遵守 C# 标识符的命名规则。

作为 AzCopy copy 命令的一部分,可以为可选 s2s-handle-invalid-metadata 标志提供一个值,该值指定如何处理文件元数据包含不兼容的键名称的文件。 下表描述了每个标志值。

标志值 DESCRIPTION
ExcludeIfInvalid (默认选项)不在传输的对象中包含元数据。 AzCopy 将记录警告。
FailIfInvalid 不复制对象。 AzCopy 将记录错误,并将该错误包含到传输摘要显示的失败计数中。
如果无效则重命名 AzCopy 将解析无效的元数据键,并使用已解析的元数据键值对将对象复制到 Azure。 若要确切了解 AzCopy 重命名对象键所要执行的步骤,请参阅 AzCopy 如何重命名对象键 部分。 如果 AzCopy 无法重命名密钥,则不会复制该对象。

AzCopy 如何重命名对象键

AzCopy 执行以下步骤:

  1. 将无效字符替换为“_”。

  2. 将字符串 rename_ 添加到新的有效键的开头。

    此键用于保存原始元数据

  3. 将字符串 rename_key_ 添加到新的有效键的开头。 此密钥用于保存原始元数据无效 密钥。 可以使用此密钥尝试恢复 Azure 端的元数据,因为元数据密钥保留为 Blob 存储服务上的值。

指定源和目标类型

AzCopy 使用 --from-to 参数在自动检测可能失败时显式定义源和目标资源类型,例如在管道方案或模拟器中。 此参数可帮助 AzCopy 了解传输的上下文并相应地进行优化。 将此参数设置为 S3Blob 显式指示命令正在从 Amazon S3 复制到 Azure Blob 存储。

后续步骤

如需了解更多示例,请参阅以下文章:

请参阅以下文章了解如何配置设置、优化性能和排查问题: