对象复制在源存储帐户和目标帐户之间异步复制块 blob。 配置对象复制时,需要创建复制策略,以指定源存储帐户和目标帐户。 复制策略包括一个或多个规则,用于指定源容器和目标容器,并指明复制源容器中的哪些块 blob。 有关对象复制的详细信息,请参阅针对块 Blob 的对象复制。
本文介绍如何使用 Azure 门户、PowerShell 或 Azure CLI 配置对象复制策略。 还可以使用 Azure 存储资源提供程序客户端库之一来配置对象复制。
必备条件
在配置对象复制前,如果还没有源存储帐户和目标存储帐户,请先创建它们。 源帐户和目标帐户可以是常规用途 v2 存储帐户,也可以是高级块 Blob 帐户。 有关详细信息,请参阅创建 Azure 存储帐户。
若要执行对象复制,需要同时为源帐户和目标帐户启用 blob 版本管理,并为源帐户启用 blob 更改源。 若要详细了解 blob 版本控制,请参阅 Blob 版本控制。 若要详细了解更改源,请参阅 Azure Blob 存储中的更改源支持。 请记住,启用这些功能可能会产生额外的成本。
若要为存储帐户配置对象复制策略,需要具有存储帐户级别或更高级别的 Azure 资源管理器参与者角色。 有关详细信息,请参阅 Azure 基于角色的访问控制 (Azure RBAC) 文档中的 Azure 内置角色。
已启用分层命名空间的帐户尚不支持对象复制。
如果同时有权访问源存储帐户和目标存储帐户,则可以在这两个帐户上均配置对象复制策略。 以下示例显示如何使用 Azure 门户、PowerShell 或 Azure CLI 配置对象复制。
在 Azure 门户中配置对象复制时,只需在源帐户上配置策略。 为源帐户配置策略后,Azure 门户会自动在目标帐户上创建策略。
若要在 Azure 门户中创建复制策略,请按照以下步骤操作:
在 Azure 门户中,转到源存储帐户。
在“数据管理”下,选择“对象复制”。
选择“创建复制规则”。
选择目标订阅和存储帐户。
在“容器对详细信息”部分中,选择源帐户中的源容器,以及目标帐户中的目标容器。 Azure 门户中每个复制策略最多可以创建 10 个容器对。 若要配置 10 个以上的容器对(最多 1000 个),请参阅使用 JSON 文件配置对象复制。
下图展示了一组复制规则。
如果需要,指定一个或多个筛选器,以便只复制与前缀模式匹配的 blob。 例如,如果指定前缀 b
,则只会复制名称以此字母开头的 blob。 可以将虚拟目录指定为前缀的一部分。 最多可以添加五个前缀匹配项。 前缀字符串不支持通配符。
下图展示了限制在复制规则中复制哪些 blob 的筛选器。
默认情况下,复制范围设置为只复制新对象。 若要复制容器中的所有对象,或从自定义日期和时间开始复制对象,请选择“更改”链接,然后为容器对配置复制范围。
下图显示了从指定的日期和时间开始复制对象的自定义复制范围。
选择“保存并应用”,以创建复制策略,并开始复制数据。
配置对象复制后,Azure 门户会显示复制策略和规则,如下图所示。
若要使用 PowerShell 创建复制策略,请先安装 2.5.0 或更高版本的 Az.Storage PowerShell 模块。 有关如何安装 Azure PowerShell 的详细信息,请参阅使用 PowerShellGet 安装 Azure PowerShell。
以下示例显示如何先在目标帐户上创建复制策略,然后再在源帐户上创建策略。 请注意将尖括号中的值替换为你自己的值:
# Sign in to your Azure account.
Connect-AzAccount -Environment AzureChinaCloud
# Set variables.
$rgName = "<resource-group>"
$srcAccountName = "<source-storage-account>"
$destAccountName = "<destination-storage-account>"
$srcContainerName1 = "source-container1"
$destContainerName1 = "dest-container1"
$srcContainerName2 = "source-container2"
$destContainerName2 = "dest-container2"
# Enable blob versioning and change feed on the source account.
Update-AzStorageBlobServiceProperty -ResourceGroupName $rgName `
-StorageAccountName $srcAccountName `
-EnableChangeFeed $true `
-IsVersioningEnabled $true
# Enable blob versioning on the destination account.
Update-AzStorageBlobServiceProperty -ResourceGroupName $rgName `
-StorageAccountName $destAccountName `
-IsVersioningEnabled $true
# List the service properties for both accounts.
Get-AzStorageBlobServiceProperty -ResourceGroupName $rgName `
-StorageAccountName $srcAccountName
Get-AzStorageBlobServiceProperty -ResourceGroupName $rgName `
-StorageAccountName $destAccountName
# Create containers in the source and destination accounts.
Get-AzStorageAccount -ResourceGroupName $rgName -StorageAccountName $srcAccountName |
New-AzStorageContainer $srcContainerName1
Get-AzStorageAccount -ResourceGroupName $rgName -StorageAccountName $destAccountName |
New-AzStorageContainer $destContainerName1
Get-AzStorageAccount -ResourceGroupName $rgName -StorageAccountName $srcAccountName |
New-AzStorageContainer $srcContainerName2
Get-AzStorageAccount -ResourceGroupName $rgName -StorageAccountName $destAccountName |
New-AzStorageContainer $destContainerName2
# Define replication rules for each container.
$rule1 = New-AzStorageObjectReplicationPolicyRule -SourceContainer $srcContainerName1 `
-DestinationContainer $destContainerName1 `
-PrefixMatch b
$rule2 = New-AzStorageObjectReplicationPolicyRule -SourceContainer $srcContainerName2 `
-DestinationContainer $destContainerName2 `
-MinCreationTime 2021-09-01T00:00:00Z
# Create the replication policy on the destination account.
$destPolicy = Set-AzStorageObjectReplicationPolicy -ResourceGroupName $rgName `
-StorageAccountName $destAccountName `
-PolicyId default `
-SourceAccount $srcAccountName `
-Rule $rule1,$rule2
# Create the same policy on the source account.
Set-AzStorageObjectReplicationPolicy -ResourceGroupName $rgName `
-StorageAccountName $srcAccountName `
-InputObject $destPolicy
若要使用 Azure CLI 创建复制策略,请先安装 Azure CLI 2.11.1 或更高版本。 有关详细信息,请参阅 Azure CLI 入门。
接下来,通过调用 az storage account blob-service-properties update 命令,在源存储帐户和目标存储帐户上启用 blob 版本控制,并在源帐户上启用更改源。 请注意将尖括号中的值替换为你自己的值:
az login
az storage account blob-service-properties update \
--resource-group <resource-group> \
--account-name <source-storage-account> \
--enable-versioning \
--enable-change-feed
az storage account blob-service-properties update \
--resource-group <resource-group> \
--account-name <dest-storage-account> \
--enable-versioning
在它们各自的存储帐户中创建源容器和目标容器。
az storage container create \
--account-name <source-storage-account> \
--name source-container-1 \
--auth-mode login
az storage container create \
--account-name <source-storage-account> \
--name source-container-2 \
--auth-mode login
az storage container create \
--account-name <dest-storage-account> \
--name dest-container-1 \
--auth-mode login
az storage container create \
--account-name <dest-storage-account> \
--name dest-container-2 \
--auth-mode login
通过调用 az storage account or-policy create,在目标帐户上创建新的复制策略和关联的规则。
az storage account or-policy create \
--account-name <dest-storage-account> \
--resource-group <resource-group> \
--source-account <source-storage-account> \
--destination-account <dest-storage-account> \
--source-container source-container-1 \
--destination-container dest-container-1 \
--min-creation-time '2021-09-01T00:00:00Z' \
--prefix-match a
创建新策略时,Azure 存储会为其设置策略 ID。 若要向策略添加其他规则,请调用 az storage account or-policy rule add 并提供策略 ID。
az storage account or-policy rule add \
--account-name <dest-storage-account> \
--resource-group <resource-group> \
--source-container source-container-2 \
--destination-container dest-container-2 \
--policy-id <policy-id> \
--prefix-match b
接下来,使用策略 ID 在源帐户上创建策略。
az storage account or-policy show \
--resource-group <resource-group> \
--account-name <dest-storage-account> \
--policy-id <policy-id> |
az storage account or-policy create --resource-group <resource-group> \
--account-name <source-storage-account> \
--policy "@-"
如果你没有访问源存储帐户的权限或者想使用 10 个以上的容器对,则可以在目标帐户上配置对象复制,并向另一个用户提供一个包含策略定义的 JSON 文件,以便在源帐户上创建相同的策略。 例如,如果源帐户与目标帐户位于不同的 Microsoft Entra 租户中,则可以使用此方法配置对象复制。
若要了解如何创作包含策略定义的 JSON 文件,请参阅策略定义文件。
本部分中的示例演示如何在目标帐户上配置对象复制策略,然后获取该策略的 JSON 文件,其他用户可以使用该文件在源帐户上配置策略。
若要使用 Azure 门户中的 JSON 文件在目标帐户上配置对象复制,请执行以下步骤:
创建一个本地 JSON 文件,用于在目标帐户上定义复制策略。 将 policyId 字段设置为“默认”,以便 Azure 存储区可以定义策略 ID 。
若要创建定义复制策略的 JSON 文件,一种简单的方法是先在 Azure 门户中创建两个存储帐户之间的测试复制策略。 然后,可以下载复制规则并根据需要修改 JSON 文件。
在 Azure 门户中导航到目标帐户的“对象复制”设置。
选择“上传复制规则”。
上传 JSON 文件。 Azure 门户会显示将创建的策略和规则,如下图所示。
选择“上传”,在目标帐户上创建复制策略。
然后,可以下载包含策略定义的 JSON 文件,可以将该文件提供给其他用户用于配置源帐户。 若要下载此 JSON 文件,请执行以下步骤:
在 Azure 门户中导航到目标帐户的“对象复制”设置。
选择要下载的策略旁边的“更多”按钮,然后选择“下载规则”,如下图所示 。
将 JSON 文件保存到本地计算机,以便与其他用户共享以在源帐户上配置策略。
下载的 JSON 文件包含“Azure 存储”为目标帐户上的策略创建的策略 ID。 必须使用相同的策略 ID 在源帐户上配置对象复制。
请记住,如果通过 Azure 门户上传 JSON 文件来为目标帐户创建复制策略,不会在源帐户中自动创建相同的策略。 在 Azure 存储开始复制对象之前,另一个用户必须在源帐户上创建策略。
若要从 PowerShell 下载包含目标帐户的复制策略定义的 JSON 文件,请调用 Get-AzStorageObjectReplicationPolicy 命令以返回策略。 然后,将策略转换为 JSON,并将其另存为本地文件,如以下示例中所示。 请注意将尖括号和文件路径中的值替换为你自己的值:
$rgName = "<resource-group>"
$destAccountName = "<destination-storage-account>"
$destPolicy = Get-AzStorageObjectReplicationPolicy -ResourceGroupName $rgName `
-StorageAccountName $destAccountName
$destPolicy | ConvertTo-Json -Depth 5 > c:\temp\json.txt
若要通过 PowerShell 使用 JSON 文件定义源帐户上的复制策略,请检索本地文件,并将 JSON 转换为对象。 然后,调用 Set-AzStorageObjectReplicationPolicy 命令以在源帐户上配置策略,如以下示例中所示。
运行示例时,请务必将 -ResourceGroupName
参数设置为源帐户的资源组,并将 -StorageAccountName
参数设置为源帐户的名称。 另外,请注意将尖括号和文件路径中的值替换为你自己的值:
$object = Get-Content -Path C:\temp\json.txt | ConvertFrom-Json
Set-AzStorageObjectReplicationPolicy -ResourceGroupName $rgName `
-StorageAccountName $srcAccountName `
-PolicyId $object.PolicyId `
-SourceAccount $object.SourceAccount `
-DestinationAccount $object.DestinationAccount `
-Rule $object.Rules
若要将目标帐户的复制策略定义从 Azure CLI 写入 JSON 文件,请调用 az storage account or-policy show 命令并输出到文件。
以下示例将策略定义写入名为 policy.json 的 JSON 文件。 请注意将尖括号和文件路径中的值替换为你自己的值:
az storage account or-policy show \
--account-name <dest-account-name> \
--policy-id <policy-id> > policy.json
若要通过 Azure CLI 使用 JSON 文件在源帐户上配置复制策略,请调用 az storage account or-policy create 命令并引用 policy.json 文件。 请注意将尖括号和文件路径中的值替换为你自己的值:
az storage account or-policy create \
-resource-group <resource-group> \
--source-account <source-account-name> \
--policy @policy.json
检查 blob 的复制状态
可以使用 Azure 门户、PowerShell 或 Azure CLI 检查源帐户中 blob 的复制状态。 在复制完成或失败之前,不会填充对象复制属性。
若要在 Azure 门户中检查源帐户中 blob 的复制状态,请执行以下步骤:
- 在 Azure 门户中,导航到源帐户。
- 找到包含源 blob 的容器。
- 选择要显示其属性的 blob。 如果已成功复制 blob,则“对象复制”部分将显示状态设置为“完成”。 还会列出复制策略 ID 和用于管理此容器的对象复制的规则的 ID。
若要使用 PowerShell 检查源帐户中 blob 的复制状态,请获取对象复制“ReplicationStatus”属性的值,如以下示例中所示。 请注意将尖括号中的值替换为你自己的值:
$ctxSrc = (Get-AzStorageAccount -ResourceGroupName $rgName `
-StorageAccountName $srcAccountName).Context
$blobSrc = Get-AzStorageBlob -Container $srcContainerName1 `
-Context $ctxSrc `
-Blob <blob-name>
$blobSrc.BlobProperties.ObjectReplicationSourceProperties[0].Rules[0].ReplicationStatus
若要使用 Azure CLI 检查源帐户中 blob 的复制状态,请获取对象复制“status”属性的值,如以下示例中所示:
az storage blob show \
--account-name <source-account-name> \
--container-name <source-container-name> \
--name <source-blob-name> \
--query 'objectReplicationSourceProperties[].rules[].status' \
--output tsv \
--auth-mode login
如果源帐户中 blob 的复制状态指示失败,则请调查以下可能的原因:
- 请确保已在目标帐户上配置对象复制策略。
- 请验证目标容器是否仍然存在。
- 如果在写入操作中已使用客户提供的密钥对源 blob 进行了加密,则对象复制将失败。 有关客户提供的密钥的详细信息,请参阅在对 Blob 存储的请求中提供加密密钥。
删除复制策略
若要删除复制策略及其关联的规则,请使用 Azure 门户、PowerShell 或 CLI。
若要在 Azure 门户中删除复制策略,请按照以下步骤操作:
- 在 Azure 门户中,转到源存储帐户。
- 在“设置”下,选择“对象复制”。
- 选择策略名称旁边的“更多”按钮。
- 选择“删除规则”。
若要删除复制策略,请从源帐户和目标帐户中都删除复制策略。 删除策略还会删除与之关联的任何规则。
# Remove the policy from the destination account.
Remove-AzStorageObjectReplicationPolicy -ResourceGroupName $rgName `
-StorageAccountName $destAccountName `
-PolicyId $destPolicy.PolicyId
# Remove the policy from the source account.
Remove-AzStorageObjectReplicationPolicy -ResourceGroupName $rgName `
-StorageAccountName $srcAccountName `
-PolicyId $destPolicy.PolicyId
若要删除复制策略,请从源帐户和目标帐户中都删除复制策略。 删除策略还会删除与之关联的任何规则。
az storage account or-policy delete \
--policy-id <policy-id> \
--account-name <source-storage-account> \
--resource-group <resource-group>
az storage account or-policy delete \
--policy-id <policy-id> \
--account-name <dest-storage-account> \
--resource-group <resource-group>
后续步骤