使用 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 Cloud Storage 授权

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

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

操作系统 命令
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 使用放置来自 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 桶名称可以包含句点和连续的连字符,但 Azure 中的容器不能。 AzCopy 会将句点替换为连字符,并将连续的连字符替换为表示连续连字符数目的数字(例如:名为 my----bucket 的桶将变成 my-4-bucket)。 如果桶名称包含下划线 (_),则 AzCopy 会将下划线替换为连字符。 例如,名为 my_bucket 的桶将变为 my-bucket

处理对象命名规则的差异

相比 Azure Blob,Google Cloud Storage 为对象名称实施一组不同的命名约定。 可在此处了解相关信息。

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

处理对象元数据的差异

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

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

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

AzCopy 如何重命名对象键

AzCopy 执行以下步骤:

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

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

    此键将用于保存原始元数据的

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

后续步骤

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

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