使用 AzCopy 在具有网络限制的 Azure 存储帐户之间复制 Blob

本文介绍如何使用 AzCopy 命令行实用工具在存储帐户之间复制 Blob。 此外,还介绍了在为存储帐户配置网络限制时如何实现复制操作。

背景

在两个存储帐户之间复制 Blob 文件是许多 Azure 用户的常见要求。 Azure 存储支持直接将 blob 从一个存储帐户复制到另一个存储帐户,这可以通过使用 AzCopy 命令行实用工具实现。 用户无需将文件下载到本地磁盘或缓冲区,然后再次上传。

使用 AzCopy 在两个存储帐户之间复制 Blob 不依赖于本地计算机的网络带宽。 此方法可以利用存储帐户和 Azure 虚拟网络的性能,实现比下载和上传文件更好的吞吐量。 如果两个存储帐户位于同一区域,则不会产生带宽费用。

用于在存储帐户之间复制 Blob 的 AzCopy 命令

  • 如果使用 Microsoft Entra ID 提供授权凭据,请使用以下命令:

    azcopy copy 'https://<source-storage-account-name>.blob.core.windows.net/<container-name>/<blob-path>' 'https://<destination-storage-account-name>.blob.core.windows.net/<container-name>/<blob-path>'
    

    在此方案中,需要确保Microsoft Entra标识具有针对源帐户和目标帐户的适当角色分配。

  • 如果使用共享访问签名 (SAS) 令牌,请使用以下命令:

    azcopy copy 'https://<source-storage-account-name>.blob.core.windows.net/<container-name>/<blob-path><SAS-token>' 'https://<destination-storage-account-name>.blob.core.windows.net/<container-name>/<blob-path><SAS-token>'
    

    在此方案中,需要将 SAS 令牌追加到 AzCopy 命令中使用的源和目标 URL。

有关详细信息,请参阅 使用 AzCopy v10 在 Azure 存储帐户之间复制 Blob

在具有访问限制的存储帐户之间复制 Blob

如果需要通过存储防火墙限制对源和目标存储帐户的访问,则可能需要使用 AzCopy 在存储帐户之间复制 Blob 进行更多配置。 这是因为两个存储帐户之间的复制请求使用专用 IP 地址,并且 IP 地址是动态的。

下面是两种受支持的方案:

方案 1:客户端使用公共终结点访问存储帐户

在此方案中,必须将客户端的公共 IP 地址或虚拟网络 (VNet) 添加到源和目标存储帐户中的防火墙允许列表。

下图显示了在此方案中在存储帐户之间复制 Blob 的过程:

显示方案 1 中存储帐户之间 Blob 的处理过程的关系图。

在这种情况下,不需要防火墙允许列表。

下图显示了在此方案中在存储帐户之间复制 Blob 的过程:

显示方案 2 中存储帐户之间 Blob 的处理过程的关系图。

下面是针对两种方案使用此机制的完整过程:

  1. 客户端将 PutBlockfromURL 请求发送到目标存储。
  2. 目标存储接收请求,并尝试从给定的源 URL 获取块。 但是,由于源防火墙不允许目标存储,因此它会收到“403 禁止访问”错误。
  3. 目标存储收到“403 禁止访问”错误后,它会代表客户端发送另一个 GetBlob 请求。 如果客户端有权访问源存储,则目标将能够从源获取块,并将成功响应代码返回给客户端。
  4. 客户端将 PutBlockList 发送到目标存储,以提交块,并在收到来自请求的成功响应代码后完成该过程。

使用专用终结点在中心辐射型体系结构中的存储帐户之间复制 Blob

从中心 VNet 中的 VM 使用 AzCopy 在连接到不同分支 VNet 中的专用终结点的存储帐户之间复制 Blob 时,会发生 403 错误。 可以在 AzCopy 日志或 Azure 存储日志中找到“403 此请求无权执行此操作 - CannotVerfiyCopySource”错误。 以下体系结构关系图显示了发生错误的场景。

此图显示了使用专用终结点在中心 & 分支体系结构中的存储帐户之间复制 blob 时出现的 403 错误。

解决方法 1:为源 VNet 中的目标存储帐户创建专用终结点

一种可能的解决方法是为源 VNet 中的目标存储帐户创建专用终结点。 此配置允许 VM 使用 AzCopy 在存储帐户之间成功复制 blob。 以下体系结构图显示了在解决方法 1 中在存储帐户之间复制 Blob 的过程。

显示解决方法 1 中存储帐户之间复制 Blob 的过程的关系图。

解决方法 2:将 VM 放置在与源存储帐户相同的 VNet 中,并将 VNet 与目标 VNet 对等互连

另一种方法是将 VM 放置在源存储帐户所在的同一 VNet 中。 然后,在此 VNet 与目标 VNet 之间建立对等互连。 以下体系结构图显示了在解决方法 2 中的存储帐户之间复制 Blob 的过程。

此图显示了在解决方法 2 中的存储帐户之间复制 Blob 的过程。

解决方法 3:使用临时暂存帐户复制数据

如果无法实现前面提到的解决方法,或者无法更改存储帐户或 VNet 的现有网络配置,可以使用临时暂存帐户复制数据:

  1. 在源存储帐户和目标存储帐户所在的同一区域中创建临时存储帐户。
  2. 使用 AzCopy 将数据从源存储帐户复制到临时存储帐户。
  3. 将数据从临时存储帐户复制到目标存储帐户。 在执行数据传输之前,请确保临时存储帐户在与目标存储帐户相同的 VNet 中具有专用终结点。

解决方法 4:使用 VM 并将数据下载到 VM,然后将数据上传到目标存储帐户

仅当其他方法不可行时,才使用此解决方法。 使用 VM 从源存储帐户下载数据,然后将其上传到目标存储帐户。 这可以通过 AzCopy 完成。 确保 VM 的大小和磁盘容量适合数据传输过程。

联系我们寻求帮助

如果你有任何疑问或需要帮助,请创建支持请求联系 Azure 社区支持。 还可以向 Azure 反馈社区提交产品反馈。