使用 AzCopy 将数据从 Google Cloud Storage 复制到 Azure 存储

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

选择提供授权凭据的方式

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

  • 若要使用 Google Cloud Storage 授权,请使用服务帐户密钥。

通过 Azure 存储进行授权

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

注释

本文中的示例假定使用 Microsoft Entra ID 提供授权凭据。

如果宁愿使用 SAS 令牌来授权访问 Blob 数据,则可以将该令牌追加到每个 AzCopy 命令中的资源 URL。 例如: 'https://<storage-account-name>.blob.core.chinacloudapi.cn/<container-name><SAS-token>'

使用 Google 云存储授权

若要使用 Google Cloud Storage 授权,请使用服务帐户密钥。 有关如何创建服务帐户密钥的信息,请参阅 创建和管理服务帐户密钥

获取服务密钥后,将 GOOGLE_APPLICATION_CREDENTIALS 环境变量设置为服务帐户密钥文件的绝对路径:

操作系统 Command
Windows操作系统 set GOOGLE_APPLICATION_CREDENTIALS=<path-to-service-account-key>
Linux export GOOGLE_APPLICATION_CREDENTIALS=<path-to-service-account-key>
macOS export GOOGLE_APPLICATION_CREDENTIALS=<path-to-service-account-key>

复制对象、目录和存储桶

AzCopy 使用 Put Block From URL API,因此数据直接在 Google Cloud Storage 和存储服务器之间复制。 这些复制操作不会占用计算机的网络带宽。

小窍门

本部分中的示例将路径参数括在单引号 ('') 中。 在除 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://storage.cloud.google.com/<bucket-name>/<object-name>' 'https://<storage-account-name>.blob.core.chinacloudapi.cn/<container-name>/<blob-name>'

示例

azcopy copy 'https://storage.cloud.google.com/mybucket/myobject' 'https://mystorageaccount.blob.core.chinacloudapi.cn/mycontainer/myblob'

复制目录

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

语法

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

示例

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

注释

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

复制目录的内容

可以使用通配符 * 复制目录中的内容,而不复制目录本身。

语法

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

示例

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

复制云存储存储桶

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

语法

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

示例

azcopy copy 'https://storage.cloud.google.com/mybucket' 'https://mystorageaccount.blob.core.chinacloudapi.cn' --recursive=true

复制 Google Cloud 项目中的所有存储桶

首先,将 GOOGLE_CLOUD_PROJECT 设置为您的 Google Cloud 项目的项目 ID。

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

语法

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

示例

azcopy copy 'https://storage.cloud.google.com/' 'https://mystorageaccount.blob.core.chinacloudapi.cn' --recursive=true

在 Google Cloud 项目中复制存储桶的子集

首先,将 GOOGLE_CLOUD_PROJECT 设置为您的 Google Cloud 项目的项目 ID。

使用存储桶名称中的通配符 * 复制桶的子集。 对具有分层命名空间的帐户使用相同的 URL 语法 (blob.core.chinacloudapi.cn)。

语法

azcopy copy 'https://storage.cloud.google.com/<bucket*name>' 'https://<storage-account-name>.blob.core.chinacloudapi.cn' --recursive=true

示例

azcopy copy 'https://storage.cloud.google.com/my*bucket' 'https://mystorageaccount.blob.core.chinacloudapi.cn' --recursive=true

处理存储桶命名规则的差异

与 Azure Blob 容器相比,Google Cloud Storage 对存储桶名称有不同的命名约定。 你可以 在此处阅读它们。 如果选择将一组容器复制到 Azure 存储帐户,复制操作可能会因为命名差异而失败。

AzCopy 处理可能出现的三个最常见问题:包含句点的存储桶、包含连续连字符的存储桶以及包含下划线的存储桶。 Google Cloud Storage Bucket 名称可以包含句点和连续连字符,但 Azure 中的容器不能。 AzCopy 将句点替换为连字符,并用一个数字替换连续连字符以表示其数量(例如:命名为 my----bucket 的存储桶会变为 my-4-bucket)。 如果存储桶名称具有下划线(_),AzCopy 会将下划线替换为连字符。 例如,命名 my_bucketmy-bucket存储桶变为 。

处理对象命名规则的差异

与 Azure Blob 相比,Google Cloud Storage 对对象名称有不同的命名约定。 你可以 在此处阅读它们。

Azure 存储不允许对象名称(或虚拟目录路径中的任何段)以尾随点结尾(例如 my-bucket...)。 执行复制操作时,末尾的点将被移除。

处理对象元数据中的差异

Google Cloud Storage 和 Azure 允许对象键名称中的不同字符集。 可 在此处阅读有关 Google 云存储中的元数据的信息。 在 Azure 端,Blob 对象密钥遵循 C# 标识符的命名规则。

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

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

AzCopy 如何重命名对象键

AzCopy 执行以下步骤:

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

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

    此密钥将用于保存原始元数据

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

指定源和目标类型

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

后续步骤

在以下文章中找到更多示例:

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