Azureコラム 第11回「Azure Virtual Desktop 運用自動化 Vol.2」

2024.10.28

     

Azure Virtual Desktop 運用自動化 Vol.2では、Vol.1にて作成したスクリプトをベースに、Azure DevOpsとの連携による更なる自動化をお届けします。

条件・制約

  • ●!!!!! スクリプトの実行は自己責任でお願いします !!!!!
  • ●PowerShellモジュールは2024å¹´8月20日時点で最新化して動作確認を行っています。

スクリプトの変更点

Vol.1からスクリプトの変更を行っていますので、まずはその内容を記載します。

● フォルダ階層の再編
Vol.1ではスクリプトファイルとARMテンプレートの2つのフォルダのみでしたが、共通化およびパラメータファイルの切り出しのために下記のフォルダ階層に再編しています。

root
├─deploy		---	スクリプトに読み込ませるパラメータファイル
│  ├─master
│  ├─prod
│  └─test
├─parameters		---	ARMテンプレートのパラメータファイル
├─scripts		---	スクリプトファイル本体
└─templates		--- 	ARMテンプレートのテンプレートファイル

● パラメータファイルの切り出し
Vol.1ではスクリプトファイルの中にパラメータを直接記載していましたが、スクリプトファイルの共通化のためにパラメータは切り出して環境ごとにファイルを作成する形にしました。

● スクリプト実行方法の変更
パラメータファイルの切り出しに伴い、スクリプト実行コマンドでパラメータファイルのパスを指定する形になっています。

./scripts/Add_Host.ps1 ../deploy/prod/Add_Host.param.ps1

次のセクションからAzure DevOps周りの設定に入っていきます。

[Entra ID] サービスプリンシパルの作成

Azure DevOpsの前にEntra IDにパイプラインで使用するサービスプリンシパルを作成します。続けてクライアントシークレットを作成して手元に控えてください。
本稿ではこのサービスプリンシパルにAzure Virtual Desktopサブスクリプションの共同作成者を割り当てています。

[Microsoft Entra アプリを登録し、サービス プリンシパルを作成する]
https://learn.microsoft.com/ja-jp/entra/identity-platform/howto-create-service-principal-portal
※リダイレクト URIは未登録で大丈夫です

[Azure DevOps] 組織の作成&プロジェクトの作成

さて、いよいよAzure DevOpsの設定に入っていきます。まずAzure DevOpsが開設されていない場合は、組織の作成およびプロジェクト作成を行います。
加えて無料枠を使用する場合は、[Azure Pipelines の無料付与に対する変更]に記載の申請を行ってください。(本稿ではこれをやってなくて一瞬はまりました…)

[組織の作成]
https://learn.microsoft.com/en-us/azure/devops/organizations/accounts/create-organization?view=azure-devops

[Azure DevOps でのプロジェクトの作成]
https://learn.microsoft.com/en-us/azure/devops/organizations/projects/create-project?view=azure-devops&tabs=browser

[Azure Pipelines の無料付与に対する変更]
https://learn.microsoft.com/en-us/azure/devops/release-notes/2021/sprint-184-update#azure-pipelines-1

[Azure DevOps] プロジェクトのサービス接続登録

Azure DevOpsプロジェクトの設定で、サービス接続に先に取得済みのサービスプリンシパルを登録します。

[既存のサービス プリンシパルを使用する Azure Resource Manager サービス接続を作成する]
https://learn.microsoft.com/en-us/azure/devops/pipelines/library/connect-to-azure?view=azure-devops#create-an-azure-resource-manager-service-connection-that-uses-an-existing-service-principal

avd-operation

[Azure DevOps] リポジトリの作成

Azure Reposにリポジトリを作成してコードを登録します。

[リポジトリの作成]
https://learn.microsoft.com/en-us/azure/devops/repos/git/create-new-repo?view=azure-devops

[Azure DevOps] パイプラインの変数グループ登録

パラメータファイル内の認証情報秘匿化のため、Azure Pipelinesのライブラリに変数グループを登録します。
本稿では仮想マシン管理者とドメイン管理者の認証情報を登録しています。

[変数グループを管理する]
https://learn.microsoft.com/en-us/azure/devops/pipelines/library/variable-groups?view=azure-devops&tabs=azure-pipelines-ui%2Cyaml

Add_Host_Variables

[Azure DevOps] パイプラインの作成

Azure Pipelinesでパイプラインの作成を行います。
本稿では月次更新フローのうち下記の5つのフローがパイプライン化の対象となります。

Step フロー Pipelines
1 マスターVMのデプロイ 前回更新時に取得したスナップショットからマスターVMをデプロイ Deploy_Master
2 マスターVMの更新① 1. 更新プログラムの適用
2. (あれば)FSLogixの更新
3. ディスククリーンアップ
※ 本稿の自動化対象外
3 スナップショット取得 マスターVMのスナップショット取得 Create_Snapshot
4 マスターVMの更新② sysprep実行 ※ 本稿の自動化対象外
5 イメージのキャプチャ マスターVMをギャラリーイメージにキャプチャ Capture_Mater
6 テストAVDのデプロイ ギャラリーイメージからテストAVDをデプロイ Add_Host_test
7 テスト実施 テストAVDにて接続テストを実施 ※ 本稿の自動化対象外
8 本番AVDのデプロイ ギャラリーイメージから本番AVDをデプロイ Add_Host_Prod
9 リソースクリーンアップ 古いAVDなど不要なリソースをクリーンアップ ※ パイプライン化対象外

パイプラインのコードは変数グループ使用有無の差異で2パターンに分かれますので、ここではそれぞれのyamlテンプレートを記載いたします。

● 変数グループを使用しないパイプライン

# Comment

trigger:
- none

pool:
  vmImage: ubuntu-latest

steps:
- task: CmdLine@2
  inputs:
    script: 'tree'
- task: AzurePowerShell@5
  inputs:
    azureSubscription: 'サービス接続の名前'
    ScriptType: 'FilePath'
    ScriptPath: 'スクリプトファイルのパス'
    ScriptArguments: 'パラメータファイルのパス'
    azurePowerShellVersion: 'LatestVersion'

● 変数グループを使用するパイプライン

# Comment

trigger:
- none

pool:
  vmImage: ubuntu-latest

variables:
- group: 変数グループの名前

steps:
- task: CmdLine@2
  inputs:
    script: 'tree'
- task: AzurePowerShell@5
  env:
    ADMINISTRATOR_ACCOUNT_USERNAME : $(ドメイン管理者ユーザー変数の名前)
    ADMINISTRATOR_ACCOUNT_PASSWORD : $(ドメイン管理者パスワード変数の名前)
    VM_ADMINISTRATOR_ACCOUNT_USERNAME : $(仮想マシン管理者ユーザー変数の名前)
    VM_ADMINISTRATOR_ACCOUNT_PASSWORD : $(仮想マシン管理者パスワード変数の名前)
  inputs:
    azureSubscription: 'サービス接続の名前'
    ScriptType: 'FilePath'
    ScriptPath: 'スクリプトファイルのパス'
    ScriptArguments: 'パラメータファイルのパス'
    azurePowerShellVersion: 'LatestVersion'

[Azure DevOps] パイプラインのアクセス許可設定

パイプラインの作成後、サービス接続と変数グループにパイプラインのアクセス許可設定を行います。

[Azure Pipelines でサービス接続のセキュリティを設定する]
https://learn.microsoft.com/en-us/azure/devops/pipelines/policies/permissions?view=azure-devops#set-service-connection-security-in-azure-pipelines

Pipeline permissions

[変数グループのセキュリティ ロールを設定する]
https://learn.microsoft.com/en-us/azure/devops/pipelines/policies/permissions?view=azure-devops#set-variable-group-security-roles

AzurePowerShell

[Azure DevOps] パイプラインの実行

これでパイプラインの準備が整いましたので、試しにDeploy_Masterを実行してみます。

Add_Host_Variables

無事実行され仮想マシンが作成されました。

別添

ご紹介したスクリプトは下記のGitHubにて公開しておりますのでARMテンプレートと合わせてご参照ください。
https://github.com/mstechcenter/avd-operation

おわりに

Azure Virtual Desktop 運用自動化 Vol.2は、いかがでしたでしょうか?
Vol.1からのバージョンアップにもう少し手間がかかるかと思いましたが意外とすんなりいきました。引っかかったのはAzure DevOpsの無料枠の申請くらいでしょうか。
効果としては、まずサービスプリンシパルや認証情報を秘匿化してセキュリティ強度を高められることが挙げられると思います。あとはVSCodeでパラメータ更新→ブラウザでパイプライン実行という手順への変化が、手間の面でちょっと省力化されるのとかなりの安心感を得られると感じました。特に後者の安心感は効果として結構大きかったです。
個人の感触としては大成功と言える結果でした。
Vol.3ではより格好良く、プルリクエスト(マージリクエスト)駆動からのパイプライン実行を実装していきます。

  • ※文中の商品名、会社名、団体名は、一般に各社の商標または登録商標です。

Azureコラム 第11回「Azure Virtual Desktop 運用自動化 Vol.2」