如何使用 Azure API 管理中的服务备份和还原实现灾难恢复

通过 Azure API 管理来发布和管理 API,即可充分利用容错和基础结构功能,否则需手动设计、实现和管理这些功能。 Azure 平台通过花费少量成本消除大量潜在故障。

要从影响 API 管理服务的可用性问题中恢复过来,请随时准备在另一个区域重新构建服务。 根据恢复时间目标,你可能希望在一个或多个区域中保留备用服务。 你还可以根据自己的恢复点目标,尝试将其配置和内容与活动服务保持同步。 API 管理备份和还原功能为实施灾难恢复策略提供了必要的构建基块。

备份和还原操作还可用于在操作环境(例如,开发环境和过渡环境)之间复制 API 管理服务配置。 请注意,运行时数据(如用户和订阅)也将被复制,这可能并不总是理想的。

本文介绍如何使用外部存储帐户自动执行 API 管理实例的备份和还原操作。 此处显示的步骤使用 Azure PowerShell cmdlet Backup-AzApiManagementRestore-AzApiManagement,或者使用 API 管理服务 - 备份API 管理服务 - 还原这两个 REST API。

警告

每个备份都会在 30 天后过期。 如果在 30 天有效期到期后尝试还原备份,还原会失败并显示 Cannot restore: backup expired 消息。

重要

还原操作不会更改目标服务的自定义主机名配置。 我们建议对活动服务和备用服务使用相同的自定义主机名和 TLS 证书,以便在还原操作完成后,可以通过简单的 DNS CNAME 更改将流量重定向到备用实例。

注意

建议使用 Azure Az PowerShell 模块与 Azure 交互。 请参阅安装 Azure PowerShell 以开始使用。 若要了解如何迁移到 Az PowerShell 模块,请参阅 将 Azure PowerShell 从 AzureRM 迁移到 Az

可用性

重要

此功能在 API 管理的“高级”、“标准”、“基本”和“开发人员”层中可用 。

先决条件

配置存储帐户访问权限

运行备份或还原操作时,需要配置对存储帐户的访问权限。 API 管理支持两种存储访问机制:Azure 存储访问密钥和 API 管理托管标识。

配置存储帐户访问密钥

Azure 为每个存储帐户生成两个 512 位存储帐户访问密钥。 这些密钥可用于通过共享密钥授权来授予对你存储帐户中数据的访问权限。 要查看、检索和管理密钥,请参阅管理存储帐户访问密钥

配置 API 管理托管标识

注意

API 管理 REST API 2021-04-01-preview 或更高版本支持在备份和还原期间使用 API 管理托管标识进行存储操作。

  1. 在 API 管理实例中为 API 管理启用系统分配的托管标识或用户分配的托管标识

    • 如果启用用户分配的托管标识,请记下该标识的“客户端 ID”。
    • 如果要备份和还原到不同的 API 管理实例,请在源实例和目标实例中都启用托管标识。
  2. 为该标识分配“存储 Blob 数据参与者”角色,该角色的范围限定为用于备份和还原的存储帐户。 若要分配角色,请使用 Azure 门户或其他 Azure 工具。

备份 API 管理服务

使用 Azure PowerShell 登录

在以下示例中:

  • 资源组 apimresourcegroup 中有一个名为 myapim 的 API 管理实例。
  • 资源组 storageresourcegroup 中有一个名为 backupstorageaccount 的存储帐户。 存储帐户具有一个名为 backups 的容器。
  • 将创建一个名为 ContosoBackup.apimbackup 的备份 Blob。

在 PowerShell 中设置变量:

$apiManagementName="myapim";
$apiManagementResourceGroup="apimresourcegroup";
$storageAccountName="backupstorageaccount";
$storageResourceGroup="storageresourcegroup";
$containerName="backups";
$blobName="ContosoBackup.apimbackup"

使用存储访问密钥进行访问

$storageKey = (Get-AzStorageAccountKey -ResourceGroupName $storageResourceGroup -StorageAccountName $storageAccountName)[0].Value

$storageContext = New-AzStorageContext -StorageAccountName $storageAccountName -StorageAccountKey $storageKey

Backup-AzApiManagement -ResourceGroupName $apiManagementResourceGroup -Name $apiManagementName `
    -StorageContext $storageContext -TargetContainerName $containerName -TargetBlobName $blobName

使用托管标识进行访问

要在 API 管理实例中配置托管标识来访问存储帐户,请参阅本文前面的配置托管标识

使用系统分配的托管标识进行访问

$storageContext = New-AzStorageContext -StorageAccountName $storageAccountName

Backup-AzApiManagement -ResourceGroupName $apiManagementResourceGroup -Name $apiManagementName `
    -StorageContext $storageContext -TargetContainerName $containerName `
    -TargetBlobName $blobName -AccessType "SystemAssignedManagedIdentity"

使用用户分配的托管标识进行访问

在此示例中,资源组 identityresourcegroup 中有一个名为 myidentity 的用户分配的托管标识。

$identityName = "myidentity";
$identityResourceGroup = "identityresourcegroup";

$identityId = (Get-AzUserAssignedIdentity -Name $identityName -ResourceGroupName $identityResourceGroup).ClientId

$storageContext = New-AzStorageContext -StorageAccountName $storageAccountName

Backup-AzApiManagement -ResourceGroupName $apiManagementResourceGroup -Name $apiManagementName `
    -StorageContext $storageContext -TargetContainerName $containerName `
    -TargetBlobName $blobName -AccessType "UserAssignedManagedIdentity" ` -identityClientId $identityid

备份是一项长时间运行的操作,可能需要几分钟才能完成。 在此期间,API 网关会继续处理请求,但服务状态为“正在更新”。

还原 API 管理服务

注意

在进行还原操作时,避免更改服务配置(例如 API、策略、开发人员门户外观)。 更改可能会被覆盖。

在以下示例中,

  • 名为 myapim 的 API 管理实例从存储帐户 backupstorageaccount 中名为 ContosoBackup.apimbackup 的备份 Blob 中恢复。
  • 备份 Blob 位于名为 backups 的容器中。

在 PowerShell 中设置变量:

$apiManagementName="myapim";
$apiManagementResourceGroup="apimresourcegroup";
$storageAccountName="backupstorageaccount";
$storageResourceGroup="storageresourcegroup";
$containerName="backups";
$blobName="ContosoBackup.apimbackup"

使用存储访问密钥进行访问

$storageKey = (Get-AzStorageAccountKey -ResourceGroupName $storageResourceGroup -StorageAccountName $storageAccountName)[0].Value

$storageContext = New-AzStorageContext -StorageAccountName $storageAccountName -StorageAccountKey $storageKey

Restore-AzApiManagement -ResourceGroupName $apiManagementResourceGroup -Name $apiManagementName `
    -StorageContext $storageContext -SourceContainerName $containerName -SourceBlobName $blobName

使用托管标识进行访问

要在 API 管理实例中配置托管标识来访问存储帐户,请参阅本文前面的配置托管标识

使用系统分配的托管标识进行访问

$storageContext = New-AzStorageContext -StorageAccountName $storageAccountName

Restore-AzApiManagement -ResourceGroupName $apiManagementResourceGroup -Name $apiManagementName `
    -StorageContext $storageContext -SourceContainerName $containerName `
    -SourceBlobName $blobName -AccessType "SystemAssignedManagedIdentity"

使用用户分配的托管标识进行访问

在此示例中,资源组 identityresourcegroup 中有一个名为 myidentity 的用户分配的托管标识。

$identityName = "myidentity";
$identityResourceGroup = "identityresourcegroup";

$identityId = (Get-AzUserAssignedIdentity -Name $identityName -ResourceGroupName $identityResourceGroup).ClientId

$storageContext = New-AzStorageContext -StorageAccountName $storageAccountName

Restore-AzApiManagement -ResourceGroupName $apiManagementResourceGroup -Name $apiManagementName `
    -StorageContext $storageContext -SourceContainerName $containerName `
    -SourceBlobName $blobName -AccessType "UserAssignedManagedIdentity" ` -identityClientId $identityid

还原是一项长时间运行的操作,可能需要长达 45 分钟或更长时间才能完成。

约束

  • 从创建时开始,备份还原仅保证 30 天
  • 在备份过程中,避免在服务中进行管理更改,例如定价层升级或降级、域名更改等。
  • 在正在进行备份操作时对服务配置(例如,API、策略和开发人员门户外观)所做的更改可能不会包含在备份中,将会丢失 。
  • 备份不会捕获 Azure 门户的“分析”窗口中显示的报告中使用的预聚合日志数据。
  • 不得在存储帐户中的 Blob 服务上启用 跨源资源共享 (CORS)
  • 要还原到的服务的定价层必须与正在还原的备份服务的定价层匹配。

存储网络约束

如果存储帐户的防火墙已启用,建议使用 API 管理实例的系统分配的托管标识来访问该帐户。 确保存储帐户授予对受信任 Azure 服务的访问权限。

不备份的内容

执行服务备份的频率会影响恢复点目标。 为了最大程度减少它,建议实施定期备份,以及在对 API 管理服务进行更改后执行按需备份。

后续步骤

请查看以下相关资源来了解备份/还原过程: