大規模に従量課金制のSQLライセンスへの移行を自動化しましょう

適用対象:Azure SQL DatabaseAzure SQL Managed InstanceAzure Virtual Machines 上の SQL ServerAzure Arc 対応 SQL Server

この記事では、以下の手順について説明します。

  • 複数のSQL製品をレビューし、単一のPowerShellスクリプトでペイド・ユ・ユー・ゴーライセンスに移行します。
  • Azure Policyで、1種類のリソースに対して継続的にペイド・オーダーライセンスを強制します。

本記事の自動化は、Azure Arc によって有効化された SQL ServerAzure Virtual Machines 上の SQL ServerAzure SQL Database、および Azure SQL Managed Instance に適用されます。 スクリプトはAzure Data Factory(Azure-SSIS IR)で Azure-SSIS Integration Runtime も処理できます。

ライセンス契約を変更しても、SQLリソースの設定されたライセンスタイプは変わりません。 この記事のワークフローは、ソフトウェア保証、SQLサブスクリプションライセンス、サービスプロバイダーライセンス契約(SPLA)が適用されなくなったSQLライセンス後、リソースを従量課金方式に移行するのに役立ちます。

Prerequisites

  • テナントとSQLリソースを含むサブスクリプションにアクセスできるAzureアカウントです。
  • PowerShell 5以降の Az PowerShellモジュールを使います。
  • PowerShellスクリプトを使ってSQLリソースを更新するときのAzure CLIです。
  • あなたが変更する各サブスクリプションにおける 貢献者 の役割。 最小権限の代替手段については、 リソースタイプ別に権限を確認してください。
  • スケジュールモードの場合、ターゲットのサブスクリプション範囲で役割割り当てを作成する権限、またはオートメーションアカウントの管理されるアイデンティティに事前割り当てされた必要な役割を付与します。
  • 請求設定を変更し、対象リソースのライセンス条件を証明する権限。

ツールをローカルにインストールしないようにするには、スクリプトをAzure Cloud Shellで実行してください。 Cloud ShellはAzure PowerShellとAzure CLIを含み、セッションを認証します。 アカウントが複数のテナントにアクセスできる -TenantId を指定してください。

自動化方法を選択する

次の中から選びます。

  • PowerShellは、リソースを横断してペイ・オー・ユー・ゴーライセンスへの移行に使えます。
  • 1 種類のリソースに対する継続的な従量課金適用のための Azure Policy

以下の表は各自動化手法の詳細を示しています:

Scenario 推奨される方法
複数のSQLリソースタイプでペイド・アズ・ユー・ゴーの変更を見直すか適用してください manage-payg-transition.ps1
サブスクリプションやテナントでサポートされるすべてのリソースを、従量課金ライセンスに移行してください manage-payg-transition.ps1
定期スケジュールで従量課金への移行を実行する manage-payg-transition.ps1 スケジュール モードの場合
1 つのリソースの種類に対して従量課金制ライセンスを継続的に適用し、ドリフトを修正する リソース固有の Azure Policy の例
手動で1つのリソースを変更します 製品固有のライセンスに関する記事

サポートされているリソースとライセンス価値の確認

この記事の手続きは-TargetLicenseTypePAYGに設定されています。 スクリプトはこの値を、各リソース提供者が必要とする従量課金の価値に変換します。 ソース値は移行で置き換え可能な一般的なライセンス構成を示しています。

資源 従量課金の目標値 共通のソース値 脚本に支えられて Azure Policy サンプル
Azure Arc によって有効化された SQL Server PAYG PaidLicenseOnly はい Arc対応SQL Serverライセンスタイプ準拠
Azure仮想マシン上のSQL Server PAYG AHUB はい SQL Server on Azure VMs ライセンスタイプコンプライアンス
Azure SQL Database とエラスティック プール LicenseIncluded BasePrice はい Azure SQL Database のライセンスの種類のコンプライアンス
Azure SQL Managed Instance とインスタンス プール LicenseIncluded BasePriceHybridFailoverRights はい SQL Managed Instance ライセンスタイプのコンプライアンス
Azure-SSIS IR LicenseIncluded BasePrice はい この記事では扱われていません

ポリシーサンプルは、Azure VMのSQL ServerのDRなど、追加のソース値を上書きすることができます。 ポリシー割り当てを展開する前に、選ばれたサンプルを必ず確認してください。

PowerShellスクリプトの仕組みを理解する

PowerShellスクリプトを使って、リソースグループ内のすべてのリソース、サブスクリプション内のすべてのリソース、さらにはテナント内の1つ以上のサブスクリプション間のすべてのリソースを変更できます。

スクリプトは自己完結型で、サポートされているSQLリソース全体で動作します。 -TargetLicenseTypeがデフォルトPAYGに設定されると、その値は各リソースタイプが必要とする従量課金の値に変換されます。これはレビュー対応リソースおよびライセンス値に示されています。 デフォルトでは、スクリプトが終わった後も生成されたワーキングフォルダはそのまま残ります。 実行後に削除するには -cleanDownloads $trueを指定します。

スクリプトはリソースタイプ別に要約を印刷し、失敗またはスキップされた各リソースの原因を一覧化します。 スクリプトが一致するリソースを見つけると、UpdateError列とModifiedResources_<timestamp>.csv列を含むUpdateResultレポートも作成します。

以下のパラメータがスクリプトのスコープと実行を制御します:

パラメーター 受け入れ値またはデフォルト Purpose
-Target ArcAzure、または Both (デフォルト) Azure Arc によって有効化された SQL Server リソース、Azure SQL リソース、Azure-SSIS IR、または両方のグループを選択します。
-RunMode Single (既定値) または Scheduled 移行を一度実行するか、デイリーAzure Automationのランブックを設定します。
-TargetLicenseType PAYG この記事の手続きの対象ライセンスモデルとして、従量課金を選択しています。
-targetSubscription サブスクリプションID;テナント内でデフォルトでアクセス可能なすべてのサブスクリプション 移行は1つのサブスクリプションに制限されます。
-targetResourceGroup リソースグループ名;デフォルトですべてのリソースグループ 移行を一つのリソースグループに限定します。
-TenantId テナントID;デフォルトで現在のAzPowerShellコンテキスト Microsoft Entraテナントを選択します。
-ReportOnly スイッチ;デフォルトで無効化 条件を満たすリソースを変更せずに報告します。
-WaitForCompletion スイッチ;デフォルトで無効化 サポートがあれば、提出された変更が最終段階に達するまで待ちます。
-UsePcoreLicense No (既定値) または Yes Azure Arcで有効化されたSQL Serverの物理コアライセンスを制御します。
-AutomationAccResourceGroupName -RunMode Scheduled が必要です 自動化アカウントのリソースグループを選択します。
-AutomationAccountName aaccAzureArcSQLLicenseType デフォルトでは 自動化アカウント名を設定します。
-Location -RunMode Scheduled と併用必須 自動化アカウントとリソースグループの Azure リージョンを選択します。
-cleanDownloads $false (既定値) または $true スクリプトが終わった後に生成された作業フォルダを削除します。

デフォルトの実行動作はリソースの種類によって異なります:

資源 既定の動作 -WaitForCompletionと共に
Azure SQL Database、Azure SQL Managed Instance 非同期リクエストを送信し、報告します RequestSubmitted 待機と報告 Updated
Azure Arc によって有効化された SQL Server 非同期拡張機能の更新を送信し、報告します RequestSubmitted 拡張機能をポーリングし、SucceededFailed、または 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の1つのエントリーポイントを提供します。

PowerShellスクリプトを使えば、スキャンするサブスクリプションを1つ指定できます。 サブスクリプションを指定しなければ、スクリプトはあなたの役割がアクセスできるすべてのサブスクリプションをスキャンします。

  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. 1 つのサブスクリプションに対して、読み取り専用のプレビューを実行します。 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を指定します。 -TargetAzureに設定して、Azure SQL リソースと Azure-SSIS IR を処理します。 Arcに設定して、Azure Arcリソースで有効になるSQL Serverのみ処理するようにしてください。

PowerShell で 1 回限りの従量課金への移行を実行する

ターゲット範囲を確認し、プレビューレポート内のすべてのリソースを承認した後にのみ、従量制の移行を実行してください。

  1. -ReportOnly を削除し、リソース プロバイダーがそれらをサポートしている場合に確認済みの結果を待機するため、-WaitForCompletion を追加してください:

    .\manage-payg-transition.ps1 `
        -Target Both `
        -TenantId "<tenant-id>" `
        -targetSubscription "<subscription-id>" `
        -TargetLicenseType PAYG `
        -WaitForCompletion
    
  2. 生成されたCSVレポートを確認してください。 すべての FailedTimedOut 結果を調査し、提出されたすべての変更のリソース状態を確認しましょう。

PAYG値が目標ライセンスモデルとしてペイド・アズ・ユー・ユー・ゴーを設定します。

-WaitForCompletionを省くと、ほとんどの承認された変更にはRequestSubmittedUpdateResultがあります。 この結果は、ライセンスタイプの変更が完了したのではなく、Azureがリクエストを受け入れたことを意味します。 Azure-SSIS IRは常に待ちます。なぜなら、その更新コマンドが非同期実行をサポートしていないからです。

PowerShell で定期的な従量課金への移行をスケジュールする

スケジューリングモードは、選択したターゲットごとに1つのAzure Automationランブックを作成または更新し、各ランブックを日次スケジュールにリンクさせ、ワンタイムジョブを即座に開始します。 自動化アカウントリソースグループとAzureリージョンを提供します。 デフォルトのオートメーションアカウント名は aaccAzureArcSQLLicenseTypeです。 スケジュールモードは自動化アカウントのマネージドIDを使用します。

  1. Azure Arcリソースで有効化されたAzure SQLおよびSQL Serverの移行を1つのサブスクリプションでスケジュールできます:

    .\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 Managed Instance プールが含まれている場合は、Automation アカウントのマネージド ID に Contributor、または Microsoft.Sql/instancePools/readMicrosoft.Sql/instancePools/write を含むカスタム ロールを割り当ててください。 スケジュール設定では、これらの権限を与える内蔵ロールが割り当てられていません。

Azure Policy で従量課金ライセンスを強制する

リソース固有のAzure Policyサンプルを使って、従量課金ライセンスを継続的に強制し、設定ドリフトを修正しましょう。 各サンプルにはポリシー定義、デプロイスクリプト、そしてレメディエーションスクリプトが含まれています。

Warning

ポリシー割り当ては、そのスコープ内のすべての対応するリソースを変更することができます。 まずは限定的なテストサブスクリプションから始め、置き換えたい現在のライセンスタイプだけを選択してください。

以下の表は、各リソースのポリシーパッケージとデプロイスクリプトをリンクしています:

資源 ポリシーパッケージ デプロイ スクリプト
Azure Arc によって有効化された SQL Server Arc対応SQL Serverライセンスタイプ準拠 deployment.ps1
Azure仮想マシン上のSQL Server SQL Server on Azure VMs ライセンスタイプコンプライアンス deployment.ps1
Azure SQL Managed Instance SQL Managed Instance ライセンスタイプのコンプライアンス deployment.ps1
Azure SQL Database Azure SQL Database のライセンスの種類のコンプライアンス deployment.ps1

選択したリソースタイプの値と役割を活用してください:

資源 従量課金の目標値 上書きできるソースの値 主な必要役割 重要な制限事項
Azure Arc によって有効化された SQL Server PAYG Paid; ポータル定義では LicenseOnly もサポートされます Azure Extension for SQL Server Deployment 割り当てはすべての一致するホストに1つのターゲットを適用し、エディションを認識していません。 複合不動産は別個に対象範囲を設定してください。
Azure仮想マシン上のSQL Server PAYG AHUBDR 仮想マシン共同作成者 対象はAzure ハイブリッド特典またはパッシブな高可用性または災害復旧(HA/DR)ライセンス条件を満たす必要があります。
Azure SQL Managed Instance LicenseIncluded BasePriceHybridFailoverRights SQL Managed Instance 共同作成者 HybridFailoverRights licenseTypeBasePriceに、hybridSecondaryUsagePassiveに設定します。
Azure SQL Database LicenseIncluded BasePrice SQL DB 共同作成者 このポリシーは master およびBasicデータベースを除外しています。 Azure SQL Databaseは、プロビジョニングされたvCoreデータベースのみでライセンスタイプ変更をサポートしているため、他のデータベーストランザクションユニット(DTU)ベースおよびサーバーレスデータベースは割り当てから除外または除外してください。

各課題には リーダーリソースポリシーの貢献者も必要です。 デプロイスクリプトは、サインインしたアイデンティティがロール割り当てを作成する権限を持つ場合、必要な役割を付与します。 リメディエーションスクリプトと -GrantMissingPermissions を使って、抜けているロールを確認し追加してください。

SQL VM、SQL Managed Instance、SQL Database デプロイスクリプトは、ターゲット値にライセンス認証が必要な場合に確認を促します。 -SkipLicenseConfirmation運用者がすでに適格性を確認し、コンプライアンスの責任を負っている自動化パイプラインでのみ使用してください。

Arc対応SQL Serverでは、PAYGポリシーが定期的な請求同意も設定します。 後の譲渡でライセンスの種類が PAYGから変更された場合、同意は延長のまま残ります。

ポリシーパッケージは共有展開フローを使用します:

  1. パッケージの policy および scripts フォルダは、READMEの指示に従ってダウンロードできます。

  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レポートには、選択した各リソースごとに UpdateResultUpdateError が含まれています。 一般的な結果を次のように解釈します:

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 VM上のSQL Serverは必ず実行中です。 スクリプトは停止または解除されたVMをスキップし、起動もしません。
  • スクリプトはDRライセンスタイプを使うAzure VM上で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エージェントの接続を復元し、SQL ServerのAzure拡張のプロビジョニング状態がSucceededであることを確認し、プレビューを再実行します。
  • UpdateResult RequestSubmittedであれば、そのリクエストを完了と考えないでください。 Azure操作終了後にリソースの状態を確認するかプレビューを再実行してください。
  • Azure SQLやSQL Server on Azure VMの操作が失敗した場合、Azure CLIがインストールされていること、同じテナントにサインインしていること、そしてターゲットサブスクリプションの承認がされていることを確認してください。
  • スケジュールモードが失敗した場合は、Automationアカウントのマネージドアイデンティティがソースサンプルに記載されたロールを持っているか確認してください。
  • ポリシー修復で PolicyAuthorizationFailed が返される場合は、割り当てのアイデンティティに、製品固有のロール ReaderResource Policy Contributor が割り当てスコープで付与されていることを確認してください。 サインインしたアイデンティティがロール割り当てを作成できるようになった後、デプロイスクリプトを再実行するか、 -GrantMissingPermissions でリメディエーションスクリプトを再実行してください。

完全な出典については manage-payg-transition.ps1を参照してください。 現在の制限や試験結果については、 manage-payg-transition.ps1 試験計画を参照してください。

リソースタイプごとの権限

PowerShellスクリプトの権限

貢献者の役割は、この記事のスクリプトに必要な権限の上層集合であり、最もシンプルな選択肢です。 最小権限アクセスについては、スコープ内のリソースタイプに必要な役割を割り当てます:

リソースの種類 役割または必要な権限
Azure仮想マシン上のSQL Server 仮想マシン共同作成者
Azure SQL Managed Instance SQL マネージド インスタンス共同作成者
Azure SQL Database SQL DB 共同作成者
Azure SQL Database エラスティック プール SQL Server 共同作成者
Azure SQL Managed Instance プール Contributor、または Microsoft.Sql/instancePools/readMicrosoft.Sql/instancePools/write を含むカスタム ロール
Azure Arc によって有効化された SQL Server Azure Connected Machine のリソース管理者
Azure-SSIS IR Data Factory 共同作成者
サブスクリプションとリソースの読み取りおよび一覧表示 Reader(他に割り当てられたロールによって必要な読み取りアクセス許可が付与されている場合を除く)

Azure Policy のアクセス許可

deployment.ps1を実行するアイデンティティは、選択した管理グループでポリシー定義を作成し、割り当てスコープでポリシー割り当て、修復タスク、管理されたアイデンティティ、ロール割り当てを作成する権限が必要です。 ロール割り当てを作成できない場合は、修復を始める前にポリシー割り当てのマネージドアイデンティティに必要なロールを割り当て、-SkipManagedIdentityRoleAssignmentdeployment.ps1を実行してください。

デフォルトでは、 deployment.ps1 ポリシー割り当てのためにシステム割り当てのマネージドアイデンティティを作成し、割り当て範囲で3つの役割を付与します。 製品固有の役割は、選ばれた政策サンプルによって異なります:

ポリシーサンプル 製品固有の役割
Azure Arc によって有効化された SQL Server Azure Extension for SQL Server Deployment
Azure仮想マシン上のSQL Server 仮想マシン共同作成者
Azure SQL Managed Instance SQL Managed Instance 共同作成者
Azure SQL Database SQL DB 共同作成者

各ポリシー割り当てのアイデンティティには リーダー および リソースポリシー貢献者も必要です。 デプロイスクリプトは、 -SkipManagedIdentityRoleAssignmentを指定するときだけ自動ロール割り当てをスキップします。

修復を開始する前に、 start-remediation.ps1 3つの必要な役割すべてのポリシー割り当ての識別を確認します。 役が抜けていると、脚本は止まります。 役割を手動で割り当てるか、割り当て範囲で役割割り当てを作成できるアイデンティティの -GrantMissingPermissions を使ってリメディエーションスクリプトを再実行してください。