自动实现大规模迁移到按使用付费的 SQL 许可模式

适用于:Azure SQL 数据库Azure SQL 托管实例Azure 虚拟机中的 SQL ServerSQL Server enabled by Azure Arc

本文介绍如何执行以下操作:

  • 用一个PowerShell脚本审查并转换多个SQL产品到按需付费许可。
  • 用 Azure Policy 持续强制执行一种资源类型的按用量付费许可。

本文中的自动化适用于由 Azure Arc 启用的 SQL ServerAzure 虚拟机中的 SQL ServerAzure SQL 数据库 以及 Azure SQL 托管实例。 该脚本还可以处理 Azure 数据工厂 中的 Azure-SSIS 集成运行时(Azure-SSIS IR)。

更改许可协议并不会改变你SQL资源所配置的许可证类型。 本文中的工作流可帮助您在具有软件保障权益的 SQL 许可证、SQL 订阅许可证或服务提供商许可协议 (SPLA) 许可不再适用后,将资源转换为按使用量计费。

先决条件

  • 一个有权访问包含 SQL 资源的租户和订阅的 Azure 帐户。
  • PowerShell 5 或更高版本,搭配 Az PowerShell 模块
  • 使用 PowerShell 脚本更新 SQL 资源时使用的 Azure CLI
  • 你所修改的每个订阅中的 参与者 角色。 对于最小权限的替代方案,请按 资源类型查看权限
  • 对于计划模式,需要在目标订阅范围内创建角色分配的权限,或者为自动化帐户的托管标识预先分配所需的角色。
  • 更改计费设置并确认目标资源的许可条款的权力。

为了避免本地安装工具,可以在 Azure Cloud Shell 中运行脚本。 Cloud Shell 包含 Azure PowerShell 和 Azure CLI,并负责会话认证。 指定 -TenantId 你的账户何时可以访问多个租户。

选择自动化方法

请选择其一:

  • PowerShell,用于跨资源转换为即付即用的许可。
  • Azure Policy,用于对一种资源类型持续强制执行即付即用模式。

下表详细介绍了每种自动化方法:

情景 推荐的方法
查看或应用多个 SQL 资源类型的即用即付更改 manage-payg-transition.ps1
将订阅或租户中所有受支持的资源转换为即用即付许可 manage-payg-transition.ps1
按定期计划运行即付即用的转换 计划模式下的 manage-payg-transition.ps1
持续强制实施针对一种资源类型的即用即付许可,并修正偏差 特定于资源的 Azure Policy 示例
手动更改一个资源 产品特定授权条款

请审核支持的资源和许可价值

本文中的步骤将 -TargetLicenseType 设置为 PAYG。 脚本将该值转换为每个资源提供者所需的现用付费值。 源值显示了过渡可以替换的常见许可证配置。

资源 按需付费目标值 共同源值 由脚本支持 Azure Policy 示例
由Azure Arc启用的SQL Server PAYG PaidLicenseOnly 是的 Arc 支持的 SQL Server 许可证类型合规性
Azure 虚拟机中的 SQL Server PAYG AHUB 是的 Azure 虚拟机上的 SQL Server 许可证类型合规性
Azure SQL 数据库和弹性池 LicenseIncluded BasePrice 是的 Azure SQL 数据库 许可证类型合规性
Azure SQL 托管实例和实例池 LicenseIncluded BasePriceHybridFailoverRights 是的 SQL 托管实例 许可证类型合规
Azure-SSIS IR LicenseIncluded BasePrice 是的 本文未涵盖

策略示例可以覆盖其他源值,例如 Azure VM 上的 SQL Server 的 DR。 在部署策略分配前,请先审查所选样本。

理解PowerShell脚本的工作原理

你可以用PowerShell脚本修改资源组内的所有资源、订阅内的所有资源,以及整个租户中一个或多个订阅之间的所有资源。

该脚本自包含,能够跨支持的 SQL 资源运行。 当 -TargetLicenseType 设置为默认 PAYG值时,该值转换为每种资源类型所需的按需付费值,如 查看支持资源和许可值所示。 默认情况下,生成的工作文件夹在脚本结束后依然保留。 要在运行后移除该标记,请指定 -cleanDownloads $true

脚本按资源类型打印摘要,并列出每个失败或跳过资源的原因。 当脚本找到匹配的资源时,它还会生成一份带有 UpdateResultUpdateError 列的 ModifiedResources_<timestamp>.csv 报告。

以下参数控制脚本的范围和执行:

参数 接受值或默认值 Purpose
-Target Arc,或 AzureBoth (默认) 选择已启用 Azure Arc 的 SQL Server 资源、Azure SQL 资源和 Azure-SSIS IR,或同时选择两组。
-RunMode Single (默认值) 或 Scheduled 运行一次过渡,或配置每日 Azure 自动化 运行手册。
-TargetLicenseType PAYG 本文选择按需付费作为相关程序的目标许可模式。
-targetSubscription 订阅 ID;默认显示租户中所有可访问的订阅 将过渡限制为仅限一个订阅。
-targetResourceGroup 资源组名称;默认所有资源组 将过渡限制为一个资源组。
-TenantId 租户ID;默认为当前Az PowerShell上下文 选择 Microsoft Entra 租户。
-ReportOnly Switch;默认被禁用 列出符合条件的资源,而不对其进行更改。
-WaitForCompletion Switch;默认被禁用 等待提交的更改达到终止状态(如果支持)。
-UsePcoreLicense No (默认值) 或 Yes 控制由Azure Arc启用的SQL Server物理核心许可。
-AutomationAccResourceGroupName 需与 -RunMode Scheduled 配合使用 选择自动化账户的资源组。
-AutomationAccountName aaccAzureArcSQLLicenseType 默认 设置自动化帐户名称。
-Location 需搭配 -RunMode Scheduled 为自动化帐户和资源组选择 Azure 区域。
-cleanDownloads $false (默认值) 或 $true 脚本完成后会移除生成的工作文件夹。

默认执行行为取决于资源类型:

资源 默认行为 -WaitForCompletion
Azure SQL 数据库,Azure SQL 托管实例 提交异步请求并报告 RequestSubmitted 等待并报告 Updated
由Azure Arc启用的SQL Server 提交扩展程序的异步更新并报告 RequestSubmitted 轮询扩展程序并报告 SucceededFailedTimedOut
Azure 虚拟机中的 SQL Server 提交直接的 Azure 资源管理器 请求和报告RequestSubmitted 运行 az sql vm 更新、等待和报告 Updated
Azure-SSIS IR 等待与报告 Updated 同样的行为

预览即用即付过渡流程

manage-payg-transition.ps1脚本为Azure SQL和SQL Server提供了一个入口点,这些入口由Azure Arc资源支持。

使用PowerShell脚本,你可以指定一个订阅来扫描。 如果你没有指定订阅,脚本会扫描你的职位能访问的所有订阅。

  1. 下载脚本:

    $scriptUri = "https://raw.githubusercontent.com/microsoft/sql-server-samples/master/samples/manage/manage-payg-transition/manage-payg-transition.ps1"
    Invoke-WebRequest -Uri $scriptUri -OutFile ".\manage-payg-transition.ps1"
    
  2. 登录到包含资源的租户:

     Connect-AzAccount -TenantId "<tenant-id>"
    
  3. 为单一订阅运行只读预览。 即使你已经有 Azure 上下文,也要指定-TenantId,这样脚本不会使用错误的租户:

    .\manage-payg-transition.ps1 `
        -Target Both `
        -TenantId "<tenant-id>" `
        -targetSubscription "<subscription-id>" `
        -TargetLicenseType PAYG `
        -ReportOnly
    
  4. 如果脚本找到匹配的资源,打开最新的 ModifiedResources_<timestamp>.csv 报告。 确认所有列出的资源都应该发生变化:

    $report = Get-ChildItem -Filter "ModifiedResources_*.csv" |
        Sort-Object LastWriteTime -Descending |
        Select-Object -First 1
    
    Import-Csv $report.FullName | Format-Table
    

已经使用按用量付费许可的资源不会出现在报告中。 如果脚本找不到匹配的资源,它就不会生成CSV文件。 为了缩小范围,指定 -targetResourceGroup。 将-Target设置为Azure以处理 Azure SQL 资源和 Azure-SSIS IR。 将其设置为 Arc,以便仅处理已启用 Azure Arc 的 SQL Server 资源。

用PowerShell执行一次性按需付费的过渡

只有在确认目标范围并批准预览报告中的所有资源后,才执行按用付费过渡。

  1. 删除 -ReportOnly,并添加 -WaitForCompletion 以在资源提供程序支持的情况下等待已确认的结果:

    .\manage-payg-transition.ps1 `
        -Target Both `
        -TenantId "<tenant-id>" `
        -targetSubscription "<subscription-id>" `
        -TargetLicenseType PAYG `
        -WaitForCompletion
    
  2. 请查看生成的CSV报告。 调查每个 FailedTimedOut 结果,并确认每项已提交更改的资源状态。

PAYG 值将目标许可模式设置为即用即付。

如果省略 -WaitForCompletion,大多数已接受的更改的 UpdateResultRequestSubmitted。 这个结果意味着 Azure 接受了请求,而不是许可证类型已经完成更改。 Azure-SSIS IR 总是等待,因为它的更新命令不支持异步执行。

使用 PowerShell 安排定期的即付即用转换

计划模式为每个选定目标创建或更新一个 Azure 自动化 运行手册,将每个运行手册与每日计划绑定,并立即启动一次性作业。 指定自动化帐户所在的资源组和 Azure 区域。 默认的自动化账户名称是 aaccAzureArcSQLLicenseType。 计划模式使用自动化账户的托管标识。

  1. 为一个订阅中的 Azure SQL 以及由 Azure Arc 启用的 SQL Server 资源安排转换:

    .\manage-payg-transition.ps1 `
        -Target Both `
        -RunMode Scheduled `
        -TenantId "<tenant-id>" `
        -targetSubscription "<subscription-id>" `
        -TargetLicenseType PAYG `
        -AutomationAccResourceGroupName "<automation-resource-group>" `
        -AutomationAccountName "<automation-account>" `
        -Location "<azure-region>"
    
  2. 在自动化帐户中,确认运行簿已发布、已链接到每日计划,并且能够使用所选参数启动作业。

如果 Azure 目标包含 SQL 托管实例池,请向自动化帐户的托管标识分配 参与者 角色,或分配具有 Microsoft.Sql/instancePools/readMicrosoft.Sql/instancePools/write 的自定义角色。 计划设置并没有分配一个内置角色来授予这些权限。

用 Azure Policy 强制执行按用付费许可

使用资源特定的 Azure Policy 示例来持续强制执行按需付费许可并修复配置漂移问题。 每个示例包含策略定义、部署脚本和修复脚本。

Warning

策略赋值可以更改其作用域内所有匹配的资源。 从范围较窄的测试订阅开始,只选择你打算替换的当前许可证类型。

下表链接了每个资源的策略包和部署脚本:

资源 策略包 部署脚本
由Azure Arc启用的SQL Server Arc 支持的 SQL Server 许可证类型合规性 deployment.ps1
Azure 虚拟机中的 SQL Server Azure 虚拟机上的 SQL Server 许可证类型合规性 deployment.ps1
Azure SQL 托管实例 SQL 托管实例 许可证类型合规 deployment.ps1
Azure SQL 数据库 Azure SQL 数据库 许可证类型合规性 deployment.ps1

使用所选资源类型对应的值和角色:

资源 按需付费目标值 可被覆盖的源值 主要必需角色 重要限制
由Azure Arc启用的SQL Server PAYG Paid;门户定义还支持 LicenseOnly Azure Extension for SQL Server Deployment 该分配会将同一个目标应用于所有匹配的主机,且不区分版本。 将混合地产单独划定范围。
Azure 虚拟机中的 SQL Server PAYG AHUBDR 虚拟机贡献者 目标必须满足 Azure 混合权益 或被动高可用性或灾难恢复(HA/DR)许可条件。
Azure SQL 托管实例 LicenseIncluded BasePriceHybridFailoverRights SQL 托管实例参与者 HybridFailoverRightslicenseType 设置为 BasePrice,并将 hybridSecondaryUsage 设置为 Passive
Azure SQL 数据库 LicenseIncluded BasePrice SQL DB 参与者 该政策不适用于 master 和基本数据库。 Azure SQL 数据库 仅支持对预配 vCore 数据库更改许可类型,因此应将其他基于数据库事务单位(DTU)的数据库和无服务器数据库排除在分配范围之外。

每项分配还需要 读者资源策略参与者。 当登录身份有权限创建角色分配时,部署脚本会授予所需的角色。 使用 -GrantMissingPermissions 配合修复脚本来检查并添加缺失的角色。

当目标值需要许可证明时,SQL VM、SQL 托管实例 和 SQL Database 部署脚本会提示确认。 -SkipLicenseConfirmation仅在运营商已确认资格并承担合规责任的自动化管道中使用。

对于已启用 Arc 的 SQL Server,PAYG 策略还会配置周期性计费同意设置。 如果后续分配将许可类型从 PAYG 更改为其他类型,则扩展上仍保留同意状态。

策略包使用共享的部署流程:

  1. 按照其 README 中的说明下载该软件包的 policyscripts 文件夹。

  2. 登录到包含分配范围的租户:

    Connect-AzAccount -TenantId "<tenant-id>"
    
  3. 从下载的包文件夹中部署定义和赋值。 使用上表中与你的资源类型对应的按需付费目标值。 以下示例在订阅范围内分配了该策略:

    .\scripts\deployment.ps1 `
        -SubscriptionId "<subscription-id>" `
        -TargetLicenseType "<pay-as-you-go-value>"
    

    如果你省略 -SubscriptionId了 ,脚本将使用管理组的作用域。 在运行部署前,先检查一下包的默认设置。

  4. 确认策略分配具有系统分配的管理身份以及分配范围内所需的角色。

  5. 开始对现有不合规资源进行修复:

    .\scripts\start-remediation.ps1 `
        -SubscriptionId "<subscription-id>" `
           -TargetLicenseType "<pay-as-you-go-value>" `
        -GrantMissingPermissions
    
  6. 在 Azure Policy 中,查看任务的合规结果和修复任务。 然后确认已修复资源的许可证类型。

确认向按需付费模式的转换

CSV报告中每个选定资源都包含一个 UpdateResult 和一个 UpdateError 。 常见结果的解释如下:

Result Meaning 后续操作
ReportOnly 脚本在只读模式下识别了一个合格资源,没有提交更改。 在执行转换之前,请确认该资源应使用即用即付许可。
RequestSubmitted Azure 接受了异步请求。 等待资源操作完成,然后验证资源状态。
UpdatedSucceeded 脚本观察到成功的终止结果。 请确认资源上的许可证类型。
Failed 服务拒绝了更新或返回了失败的终端状态。 检查 UpdateError,更正问题,然后重新运行预览。
TimedOut Arc扩展在投票限制前未达到终端状态。 检查扩展程序状态。 更新可能会在脚本停止等待后完成。

要确认Azure Arc启用的SQL Server当前许可证类型和配置状态,请运行以下Azure Resource Graph查询:

Search-AzGraph -Query @"
resources
| where type =~ 'microsoft.hybridcompute/machines/extensions'
| where properties.type in~ ('WindowsAgent.SqlServer', 'LinuxAgent.SqlServer')
| project name = split(id, '/')[8],
          licenseType = properties.settings.LicenseType,
          state = properties.provisioningState
"@

已提交的操作完成后,使用 -ReportOnly 重新运行相同的作用域:

.\manage-payg-transition.ps1 `
    -Target Both `
    -TenantId "<tenant-id>" `
    -targetSubscription "<subscription-id>" `
    -TargetLicenseType PAYG `
    -ReportOnly

该脚本会排除已使用即用即付许可的资源。 完全融合的范围报告没有资源可更新。 在你认为过渡完成之前,先调查任何仍然存在的资源。

审查限制和计费保障

  • Azure 虚拟机上的 SQL Server 必须正在运行。 脚本跳过已停止或解除分配的虚拟机,也不会启动它们。
  • 该脚本在使用 DR Azure 许可证类型的虚拟机中排除 SQL Server,因此不会覆盖被动 HA/DR 副本的许可证设置。
  • 该脚本不提供其内嵌 Arc 处理程序中的周期性扣费同意选项。 对于需要定期计费同意的CSP管理的Arc资源,请使用Arc支持的SQL Server许可类型合规策略,该策略在适用PAYG时配置同意。
  • 默认的异步运行优先考虑可扩展性,而非即时确认。 当你需要脚本在退出前查看终端结果时,请使用 -WaitForCompletion
  • 默认情况下,SQL Server在Azure虚拟机更新时使用异步Azure 资源管理器请求。 如果请求失败,脚本会退回到 az sql vm update,等待操作完成。

排查自动化故障

利用生成的报告和 Azure 操作状态来识别未更新的资源。

  • 如果报告是空的,确认租户、订阅和资源组。 当所有纳入范围的资源都已使用即用即付许可时,报告应为空。
  • 如果某个已启用 Arc 的资源被跳过,请恢复 Azure Connected Machine 代理的连接,确认 SQL Server 的 Azure 扩展的预配状态为 Succeeded,然后重新运行预览。
  • 如果 UpdateResultRequestSubmitted,不要把请求视为完成。 检查资源状态,或者在 Azure 操作结束后重新运行预览。
  • 如果 Azure SQL 或 Azure VM 上的 SQL Server 的某项操作失败,请确认已安装 Azure CLI,并且已登录到同一租户,且拥有目标订阅的访问权限。
  • 如果调度模式失败,请确认自动化账户的管理身份是否包含源样本中列出的角色。
  • 如果策略修正返回 PolicyAuthorizationFailed,请确认分配标识在分配范围内拥有产品特定角色、读取者资源策略参与者角色。 重新运行部署脚本,或者在登录标识能够创建角色分配后使用 -GrantMissingPermissions 重新运行修正脚本。

完整来源请参见 manage-payg-transition.ps1。 有关当前限制和测试结果,请参见测试计划。manage-payg-transition.ps1

按资源类型划分的权限

PowerShell脚本的权限

贡献者角色是本文脚本所需权限的超集,是最简单的选项。 为了实现最小权限访问,请分配指定范围内资源类型所需的角色:

资源类型 角色或所需权限
Azure 虚拟机中的 SQL Server 虚拟机贡献者
Azure SQL 托管实例 SQL 托管实例 贡献者
Azure SQL 数据库 SQL DB 参与者
Azure SQL 数据库弹性池 SQL Server 参与者
Azure SQL 托管实例池 贡献者,或带有 Microsoft.Sql/instancePools/readMicrosoft.Sql/instancePools/write 的自定义角色
由Azure Arc启用的SQL Server Azure连接的计算机资源管理员
Azure-SSIS IR 数据工厂参与者
阅读与列举订阅及资源 读取器,除非其他分配的角色赋予所需的读取权限

Azure Policy 的权限

运行 deployment.ps1 的身份需要权限在所选管理组创建策略定义,并在分配范围内创建策略分配、修复任务、管理身份和角色分配。 如果无法创建角色分配,请在开始修正之前为策略分配的托管标识分配所需角色,然后使用 -SkipManagedIdentityRoleAssignment 运行 deployment.ps1

默认情况下,deployment.ps1 会为策略分配创建一个系统分配的托管标识,并在分配范围内授予三个角色。 产品特定的角色取决于所选政策样本:

政策示例 产品特定角色
由Azure Arc启用的SQL Server Azure Extension for SQL Server Deployment
Azure 虚拟机中的 SQL Server 虚拟机贡献者
Azure SQL 托管实例 SQL 托管实例参与者
Azure SQL 数据库 SQL DB 参与者

每个策略分配标识还需要被授予 ReaderResource Policy Contributor。 部署脚本只有在指定 -SkipManagedIdentityRoleAssignment时才跳过自动分配角色。

在开始修复前, start-remediation.ps1 检查所有三个必要角色的策略分配身份。 如果缺少一个角色,剧本就会停止。 手动分配角色,或者用一个身份来重新运行修复脚本 -GrantMissingPermissions ,该身份可以在分配范围内创建角色分配。