適用於:Azure SQL Database
Azure SQL 受控執行個體
Azure 虛擬機器上的 SQL Server
SQL Server enabled by Azure Arc
這篇文章說明如何:
- 用一個 PowerShell 腳本審查並轉換多個 SQL 產品到按使用量付費授權。
- 使用 Azure 原則 持續強制執行針對一種資源類型的隨用隨付授權模式。
本文中的自動化適用於由 Azure Arc 啟用的 SQL Server、Azure 虛擬機器上的 SQL Server、Azure SQL Database 以及 Azure SQL 受控執行個體。 此腳本也可以處理 Azure Data Factory 中的 Azure-SSIS Integration Runtime(Azure-SSIS IR)。
更改授權協議並不會改變你為 SQL 資源設定的授權類型。 本文中的工作流程可協助您在具有軟體保證的 SQL 授權、SQL 訂閱授權或服務提供者授權合約 (SPLA) 授權不再適用後,將資源轉換為隨用隨付計費。
先決條件
- 具有租戶和包含 SQL 資源之訂閱存取權限的 Azure 帳戶。
- 使用 PowerShell 5 或更新版本,搭配 Az PowerShell 模組。
- 當你使用 PowerShell 腳本更新 SQL 資源時,會使用 Azure CLI。
- 你所修改的每個訂用帳戶中的 參與者 角色。 關於最低權限的替代方案,請依 資源類型檢視權限。
- 在排程模式下,需要具備在目標訂用帳戶範圍建立角色指派的權限,或先將所需角色預先指派給 Automation 帳戶的受控識別。
- 有權更改帳單設定並證明目標資源的授權條款。
為了避免在本地安裝工具,請在 Azure Cloud Shell 執行腳本。 Cloud Shell 包含 Azure PowerShell 和 Azure CLI,並負責認證會話。 請指定 -TenantId 你的帳號何時可以存取多於一個租戶。
選擇自動化方法
選擇其中之一:
- PowerShell 用於跨資源轉換到隨用即付授權。
- 針對單一資源類型持續強制執行隨用隨付的 Azure 原則
下表提供每種自動化方法的詳細資訊:
| 狀況 | 建議的方法 |
|---|---|
| 檢閱或套用跨多種 SQL 資源類型的按使用量付費變更 | manage-payg-transition.ps1 |
| 將訂閱或租用戶中所有受支援的資源轉換為隨用隨付授權 | manage-payg-transition.ps1 |
| 依週期性排程執行隨用隨付轉換 |
manage-payg-transition.ps1 在排程模式中 |
| 持續對單一資源類型強制執行隨用隨付授權,並修正偏差 | 特定資源的 Azure 原則 範例 |
| 手動更改一個資源 | 產品專屬授權條款 |
檢視支援資源與授權價值
本文中的程序設定 -TargetLicenseType 為 PAYG。 腳本會將此值轉換為每個資源提供者所需的隨用付費值。 來源值顯示過渡可取代的常見授權設定。
| Resource | 隨用隨付目標值 | 常見來源值 | 由指令碼支援 | Azure 原則 範例 |
|---|---|---|---|---|
| 透過 Azure Arc 啟用的 SQL Server | PAYG |
Paid、LicenseOnly |
Yes | Arc 啟用的 SQL Server 授權類型合規 |
| Azure 虛擬機器上的 SQL Server | PAYG |
AHUB |
Yes | Azure VM 上 SQL Server 的授權類型合規性 |
| Azure SQL Database 與彈性集區 | LicenseIncluded |
BasePrice |
Yes | Azure SQL Database 授權類型合規性 |
| Azure SQL 受控執行個體和執行個體集區 | LicenseIncluded |
BasePrice、HybridFailoverRights |
Yes | SQL 受管理執行個體 授權類型合規 |
| Azure-SSIS IR | LicenseIncluded |
BasePrice |
Yes | 本文未涵蓋 |
這些原則範例可以覆寫其他來源值,例如 Azure 虛擬機器上的 SQL Server 的 DR。 在部署政策指派前,請先檢視所選範例。
了解 PowerShell 腳本的運作方式
你可以使用 PowerShell 腳本修改資源群組內的所有資源、訂閱內的所有資源,以及整個租戶中跨一個或多個訂閱的所有資源。
此指令碼可獨立運作,並適用於所支援的 SQL 資源。 當 -TargetLicenseType 設定為預設 PAYG值時,該值會轉換成每種資源類型所需的隨用付費值,如 檢視支援資源與授權值所示。
預設情況下,產生的工作資料夾會在腳本完成後保留。 若要在執行一次後將其移除,請指定 -cleanDownloads $true。
腳本會依資源類型列印摘要,並列出每個失敗或跳過資源的原因。 當腳本找到匹配的資源時,也會建立 ModifiedResources_<timestamp>.csv 包含 UpdateResult 和 UpdateError 欄位的報告。
以下參數控制腳本的範圍與執行:
| 參數 | 接受值或預設值 | Purpose |
|---|---|---|
-Target |
Arc、 Azure,或 Both (預設) |
選取已啟用 Azure Arc 的 SQL Server 資源、Azure SQL 資源和 Azure-SSIS IR,或同時選取這兩組。 |
-RunMode |
Single (預設)或 Scheduled |
執行一次轉換作業,或設定 Azure 自動化 Runbook 每日執行。 |
-TargetLicenseType |
PAYG |
為本文中的程序選擇隨用隨付(Pay-as-you-go)作為目標授權模式。 |
-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 |
腳本結束後會移除產生的工作資料夾。 |
預設執行行為依資源類型而定:
| Resource | 預設行為 | 使用 -WaitForCompletion |
|---|---|---|
| Azure SQL Database、Azure SQL 受控執行個體 | 提交非同步請求並回報 RequestSubmitted |
等待並回報 Updated |
| 透過 Azure Arc 啟用的 SQL Server | 提交非同步擴充更新並回報 RequestSubmitted |
輪詢擴充功能並回報 Succeeded、Failed 或 TimedOut |
| Azure 虛擬機器上的 SQL Server | 提交直接向 Azure Resource Manager 提出的要求,並回報 RequestSubmitted |
執行 az sql VM 更新、等待並回報 Updated |
| Azure-SSIS IR | 等待並回報 Updated |
同樣的行為 |
預覽隨用付費轉型過程
此 manage-payg-transition.ps1 指令碼為已啟用 Azure Arc 的 Azure SQL 和 SQL Server 資源提供單一進入點。
使用 PowerShell 腳本,你可以指定一個訂閱來掃描。 如果你沒有指定訂閱,腳本會掃描你角色能存取的所有訂閱。
下載劇本:
$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"登入包含資源的租戶:
Connect-AzAccount -TenantId "<tenant-id>"為單一訂閱執行唯讀預覽。 即使你已經有 Azure 上下文,也要指定
-TenantId,避免腳本使用錯誤的租戶:.\manage-payg-transition.ps1 ` -Target Both ` -TenantId "<tenant-id>" ` -targetSubscription "<subscription-id>" ` -TargetLicenseType PAYG ` -ReportOnly如果腳本找到匹配的資源,打開最新的
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 執行一次隨用隨付移轉
僅在確認目標範圍並核准預覽報告中的所有資源後,才進行轉換為隨用隨付。
移除
-ReportOnly,並新增-WaitForCompletion,以在資源提供者支援的情況下等待已確認的結果:.\manage-payg-transition.ps1 ` -Target Both ` -TenantId "<tenant-id>" ` -targetSubscription "<subscription-id>" ` -TargetLicenseType PAYG ` -WaitForCompletion請檢視產生的 CSV 報告。 調查每一個
Failed或TimedOut結果,並確認每項已提交變更的資源狀態。
PAYG 值會將目標授權模式設為「隨用隨付」。
若省略 -WaitForCompletion,大多數接受的變更皆為 UpdateResultRequestSubmitted。 這個結果代表 Azure 接受了這個請求,而不是授權類型已經完成變更。 Azure-SSIS IR 總是等待,因為它的更新指令不支援非同步執行。
使用 PowerShell 排定定期隨用付費轉換
排程模式會為每個選取的目標建立或更新一個 Azure 自動化 Runbook,將每個 Runbook 連結至每日排程,並立即啟動一次性作業。 提供自動化帳戶資源群組和 Azure 區域。 預設的自動化帳號名稱是 aaccAzureArcSQLLicenseType。 排程模式會使用自動化帳戶的受控識別。
在單一訂用帳戶中,為已啟用 Azure Arc 的 Azure SQL 和 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>"在自動化帳戶中,確認 Runbook 已發佈、已連結到每日排程,且能夠使用所選參數啟動作業。
如果 Azure 目標包含 SQL 受控執行個體集區,請將自動化帳戶的受控識別指派為 參與者,或指派為具有 Microsoft.Sql/instancePools/read 和 Microsoft.Sql/instancePools/write 的自訂角色。 排程設定並沒有指派一個內建角色來授予這些權限。
用 Azure 原則 強制執行隨用即付費授權
使用資源專屬的 Azure 原則 範例,持續強制執行隨用即用授權並修復配置漂移問題。 每個範例包含政策定義、部署腳本及修復腳本。
Warning
政策指派可以更改其範圍內所有匹配的資源。 先從範圍較窄的測試訂閱開始,只選擇你打算替換的現有授權類型。
下表連結了每個資源的政策套件與部署腳本:
| Resource | 政策套件 | 部署腳本 |
|---|---|---|
| 透過 Azure Arc 啟用的 SQL Server | Arc 啟用的 SQL Server 授權類型合規 | deployment.ps1 |
| Azure 虛擬機器上的 SQL Server | Azure VM 上 SQL Server 的授權類型合規性 | deployment.ps1 |
| Azure SQL 受控執行個體 | SQL 受管理執行個體 授權類型合規 | deployment.ps1 |
| Azure SQL Database | Azure SQL Database 授權類型合規性 | deployment.ps1 |
使用所選資源類型的值和角色:
| Resource | 隨用隨付目標值 | 可覆寫的原始碼值 | 主要必要角色 | 重要限制 |
|---|---|---|---|---|
| 透過 Azure Arc 啟用的 SQL Server | PAYG |
Paid;入口定義也支援 LicenseOnly |
Azure Extension for SQL Server Deployment | 這個指派會將同一個目標套用至所有符合條件的主機,且不會區分版本。 混合型住宅社區應分別界定範圍。 |
| Azure 虛擬機器上的 SQL Server | PAYG |
AHUB、DR |
虛擬機器貢獻者 | 目標必須符合 Azure Hybrid Benefit 或被動高可用性或災難復原(HA/DR)授權條件。 |
| Azure SQL 受控執行個體 | LicenseIncluded |
BasePrice、HybridFailoverRights |
SQL 受管理執行個體 貢獻者 |
HybridFailoverRights 集合 licenseType 為 BasePrice ,且 hybridSecondaryUsage 為 Passive。 |
| Azure SQL Database | LicenseIncluded |
BasePrice |
SQL DB 參與者 | 此原則不適用於 master 和基本資料庫。 Azure SQL Database 僅支援已佈建 vCore 資料庫變更授權類型,因此請將其他以資料庫交易單位(DTU)為基礎的資料庫和無伺服器資料庫排除在指派之外,或予以豁免。 |
每個指派也需要 Reader 和 Resource Policy Contributor。 部署腳本會在登入身份有權限建立角色指派時,才會授予所需的角色。 將 -GrantMissingPermissions 與修復指令碼搭配使用,以檢查並新增遺漏的角色。
當目標值需要授權證明時,SQL VM、SQL 受管理執行個體 和 SQL Database 部署腳本會提示確認。
-SkipLicenseConfirmation僅在自動化管道中使用,且操作員已確認符合資格並承擔合規責任。
對於已啟用 Arc 的 SQL Server,PAYG 原則也會設定週期性計費同意。 若後續轉讓將授權類型從 中移除 PAYG,該同意仍維持於延長。
這些政策套件使用共享的部署流程:
請依照 README 指示下載套件與
policyscripts資料夾。登入包含轉讓範圍的租戶:
Connect-AzAccount -TenantId "<tenant-id>"從下載的套件資料夾中部署定義與指派。 請使用上述表格中您資源類型對應的「隨用隨付」目標值。 以下範例會在訂用帳戶範圍指派該原則:
.\scripts\deployment.ps1 ` -SubscriptionId "<subscription-id>" ` -TargetLicenseType "<pay-as-you-go-value>"如果你省略
-SubscriptionId了 ,腳本會使用管理群組範圍。 在執行部署前,先檢查套件的預設值。確認政策指派有系統指派的管理身份,以及指派範圍內所需的角色。
開始對現有不合規資源進行修復:
.\scripts\start-remediation.ps1 ` -SubscriptionId "<subscription-id>" ` -TargetLicenseType "<pay-as-you-go-value>" ` -GrantMissingPermissions在 Azure 原則 中,檢視該任務的合規結果與修復任務。 然後確認修復資源的授權類型。
驗證隨用隨付轉換
CSV 報告針對每個所選資源都包含一個 UpdateResult 和一個 UpdateError。 常見結果的解釋如下:
| Result | Meaning | 下一步行動 |
|---|---|---|
ReportOnly |
腳本在唯讀模式下識別了符合資格的資源,且沒有提交變更。 | 在進行轉換前,請確認該資源是否應該使用隨用付費授權。 |
RequestSubmitted |
Azure 接受了非同步請求。 | 等待資源操作結束後,再驗證資源狀態。 |
Updated 或 Succeeded |
腳本偵測到成功的最終結果。 | 請確認資源上的授權類型。 |
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 必須處於執行中狀態。 腳本會跳過已停止或解除配置的虛擬機,也不會啟動它們。
- 此腳本會排除在 Azure 虛擬機器上使用
DR授權類型的 SQL Server,因此不會覆寫被動 HA/DR 複本的授權設定。 - 腳本並未揭露其嵌入 Arc 處理器的定期計費同意選項。 對於需要定期計費同意的由 CSP 管理的 Arc 資源,請使用 已啟用 Arc 的 SQL Server 授權類型合規性原則,此原則會在套用時設定同意
PAYG。 - 預設的非同步執行會優先考量擴展性,而非即時確認。 當你需要在腳本結束前觀察終端機輸出結果時,請使用
-WaitForCompletion - 預設情況下,SQL Server on Azure VM 更新會使用非同步的 Azure Resource Manager 請求。 如果該請求失敗,腳本會退回到
az sql vm update,等待操作結束。
排解自動化失敗問題
利用產生的報告和 Azure 操作狀態來辨識未更新的資源。
- 如果報告是空的,請確認租戶、訂閱和資源群組。 當涵蓋範圍內的所有資源都已採用隨用即付授權時,預期報告會是空白的。
- 如果跳過了 Arc 啟用的資源,請恢復 Azure Connected Machine 代理的連線,確認 Azure SQL Server 擴充功能的配置狀態為
Succeeded,然後重新執行預覽。 - 如果
UpdateResult是RequestSubmitted,請不要把請求視為完成。 檢查資源狀態或在 Azure 操作結束後重新執行預覽。 - 如果 Azure SQL 或 SQL Server 在 Azure VM 操作失敗,請確認 Azure CLI 已安裝、登入同一租戶,並授權目標訂閱。
- 若排程模式失敗,請確認自動化帳號管理身份是否包含來源範例中列出的角色。
- 若原則補救傳回
PolicyAuthorizationFailed,請確認指派的身分識別在指派範圍具有產品特定角色、讀者 及 資源原則參與者。 重新執行部署指令碼,或在已登入的身分可以建立角色指派後,使用-GrantMissingPermissions重新執行修復指令碼。
完整資料來源請參見 manage-payg-transition.ps1。 有關目前的限制與測試結果,請參閱測試計畫。manage-payg-transition.ps1
依資源類型的權限
PowerShell 腳本的權限
貢獻者角色是本文腳本所需權限的超集,是最簡單的選項。 對於最小權限存取,請為範圍內的資源類型指派所需角色:
| 資源類型 | 角色或必要權限 |
|---|---|
| Azure 虛擬機器上的 SQL Server | 虛擬機器貢獻者 |
| Azure SQL 受控執行個體 | SQL 受管理執行個體 貢獻者 |
| Azure SQL Database | SQL DB 參與者 |
| Azure SQL Database 彈性集區 | SQL Server 參與者 |
| Azure SQL 受控執行個體集區 |
貢獻者,或具有 Microsoft.Sql/instancePools/read 和 Microsoft.Sql/instancePools/write 的自訂角色 |
| 透過 Azure Arc 啟用的 SQL Server | Azure 連線機器資源管理員 |
| Azure-SSIS IR | Data Factory 參與者 |
| 閱讀與列舉訂閱與資源 | 讀者,除非另一個已指派的角色授與所需的讀取權限 |
Azure 原則的權限
執行 deployment.ps1 的身份需要權限在所選管理群組建立政策定義,並在指派範圍內建立政策指派、修復任務、受管理身份與角色指派。 如果無法建立角色指派,請先將所需角色指派到政策指派的管理身份,然後再開始修復,並執行 deployment.ps1-SkipManagedIdentityRoleAssignment。
根據預設,deployment.ps1 會為原則指派建立系統指派的受控識別,並在該指派範圍內授與三個角色。 產品專屬角色取決於所選政策樣本:
| 政策範例 | 產品專屬角色 |
|---|---|
| 透過 Azure Arc 啟用的 SQL Server | Azure Extension for SQL Server Deployment |
| Azure 虛擬機器上的 SQL Server | 虛擬機器貢獻者 |
| Azure SQL 受控執行個體 | SQL 受管理執行個體 貢獻者 |
| Azure SQL Database | SQL DB 參與者 |
每個原則指派身分也都需要 讀者 和 資源原則參與者。 部署腳本只有在你指定 -SkipManagedIdentityRoleAssignment時才會跳過自動分配角色。
在開始修復前, start-remediation.ps1 檢查三個必要角色的政策指派身份。 如果缺少角色,劇本就會停止。 手動指派角色,或使用可在指派範圍建立角色指派的身分,以 -GrantMissingPermissions 重新執行修復指令碼。