JavaScriptを有効にしてください

VM の DSC 拡張機能を試し隊

 ·   4 分で読めます  ·   Kento

Azure VM の DSC (Desired State Configuration) 拡張機能を使ったときのメモです

Desired State Configuration とは

DSC (Desired State Configuration) とは PowerShell を使って「サーバーにこうなってほしい」を記述する機能です
2014年の記事ですが以下のものがわかりやすかったです
PowerShell DSCで導入された新しい構文キーワード - Build Insider

この DSC を Azure VM で利用することができるので、今回試してみました

Azure VM での DSC 利用

Azure VM で DSC を利用するときはいくつか選択肢があります

  • VM の拡張機能だけを利用
  • Azure Automation Account を利用
  • Azure Automanage のマシン構成を利用

今回は VM の拡張機能のパターンになります

ざっくり手順

  1. DSC 用の PowerShell スクリプト作成
  2. Storage Account に保存
  3. PowerShell を使ってデプロイ
  4. [オプション] Bicep を使ってデプロイ

以下のリソースは既に存在している前提で進めます

graph TB;

%%グループとサービス
subgraph hubsub["Hub Subscription"]
    subgraph hub_Vnet[hub-Vnet]
        VM1("VM")
        ST1{{"fa:fa-folder Storage Account"}}
    end
end

%%サブグラフのスタイル
classDef subG fill:none,color:#345,stroke:#345
class hubsub subG

classDef VnetG fill:none,color:#0a0,stroke:#0a0
class hub_Vnet VnetG

%%ノードのスタイル
classDef SCP fill:#e83,color:#fff,stroke:none
class VM1 SCP

classDef PaaSG fill:#46d,color:#fff,stroke:#fff
class ST1 PaaSGSG

1. DSC 用の PowerShell スクリプト作成

DSC のスクリプトの作成がよくわからなかったのでサンプルをそのまま使いました
ざっくり解説しておくと

  • “IISInstall” という構成が 1つだけ記述されている
    • 上記の構成は localhost に適用される
      • “WindowsFeature” で Windows の役割に関する内容を記述する
        WindowsFeature - PowerShell | Microsoft Learn
        • 名前が “Web-Server” という Windows の役割に関すること
        • “Present” と書くことでインストールしておけよ。という意味になる。
          アンインストールしておけよの場合は “Absent” になる

これを iisinstall.ps1 という名前で保存しておきます

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
configuration IISInstall
{
    node "localhost"
    {
        WindowsFeature IIS
        {
            Ensure = "Present"
            Name = "Web-Server"
        }
    }
}

2. Storage Account に保存

作成した DSC 用スクリプト (構成ファイル) を Azure VM が読み取れる場所に保存しておきます
今回は Storage Account を使用しました

Publish-AzVMDscConfiguration というコマンドを使うことで zip ファイルにして、指定した Storage Account に保存する所まで実行してくれます

1
Publish-AzVMDscConfiguration -ConfigurationPath .\iisinstall.ps1 -ResourceGroupName $resourceGroup -StorageAccountName $storageName -force

terminal01
DSC 用スクリプトのアップロード01:

portal01
DSC 用スクリプトのアップロード02:

portal02
DSC 用スクリプトのアップロード03:

3. PowerShell を使ってデプロイ

Storage Account に保存された zip ファイルを VM に読み込ませます

1
Set-AzVMDscExtension -Version '2.76' -ResourceGroupName $resourceGroup -VMName $vmName -ArchiveStorageAccountName $storageName -ArchiveBlobName 'iisinstall.ps1.zip' -AutoUpdate -ConfigurationName 'IISInstall'

デプロイまで少し時間がかかりますが、完了すると IIS のインストールが完了しています

terminal02
DSC 拡張機能の実行:

portal03
VM の拡張機能メニュー:

実際に VM へアクセスしてみると IIS がインストールできているのがわかります

web01
IIS インストールの確認:

4. [オプション] Bicep を使ってデプロイ

せっかくなので Bicep でも試してみました
構文を理解するため、拡張機能以外は Azure Verified Module を使って、DSC 拡張機能の部分は外出ししました
zip ファイルは先ほどの Storage Account からダウンロードして GitHub に置いてます
Azure_Bicep/Blog/dsc_extension/main.bicep at main · NakayamaKento/Azure_Bicep

拡張機能の部分だけ切り抜くとこんな感じ

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
// DSC 拡張機能を追加
resource DSC 'Microsoft.Compute/virtualMachines/extensions@2023-09-01' = {
  name: '${prefix}-win2022/Microsoft.Powershell.DSC'
  dependsOn: [
    iisServer
  ]
  location: resourceGroup().location
  properties:{
    publisher: 'Microsoft.PowerShell'
    type: 'DSC'
    typeHandlerVersion: '2.83'
    autoUpgradeMinorVersion: true
    settings:{
      configuration: {
        url: 'https://github.com/NakayamaKento/Azure_Bicep/raw/dsc_extenstion/Blog/dsc_extension/iisinstall.ps1.zip'
        script: 'iisinstall.ps1'  // ここで指定したファイルが実行されます
        function: 'IISInstall'  // ここで指定した関数が実行されます
      }
    }
  }
}

デプロイは成功しました
ブラウザでのアクセスも無事に問題なくできました。
画像は代わり映えしないので割愛。

bicep01
Bicep でのデプロイ:

構文がわかったのですべて Azure Verified Module を使ってデプロイしてみました
Publisher など細かいところ気にしなくていいのがめっちゃよいです
Azure_Bicep/Blog/dsc_extension/avm_main.bicep at main · NakayamaKento/Azure_Bicep

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
module iisServer 'br/public:avm/res/compute/virtual-machine:0.2.3' = {
  name: '${prefix}-winser2022-deploy'
  params: {
    adminUsername: adminUsername
    adminPassword: adminPassword
    availabilityZone: 0
    imageReference: {
      publisher: 'MicrosoftWindowsServer'
      offer: 'WindowsServer'
      sku: '2022-datacenter-azure-edition'
      version: 'latest'
    }
    name: '${prefix}-win2022'
    nicConfigurations: [
      {
        ipConfigurations: [
          {
            name: '${prefix}-ip-config'
            pipConfiguration: {
              publicIpNameSuffix: '-pip'
            }
            privateIpAddressVersion: 'IPv4'
            subnetResourceId: Vnet.outputs.subnetResourceIds[0]
          }
        ]
        nicSuffix: '-nic'
      }
    ]
    osDisk: {
      diskSizeGB: '128'
      managedDisk: {
        storageAccountType: 'Premium_LRS'
      }
    }
    osType: 'Windows'
    vmSize: 'Standard_D4s_v4'
    // ここから DSC の設定
    extensionDSCConfig:{
        enabled: true
        settings:{
          configuration: {
            url: 'https://github.com/NakayamaKento/Azure_Bicep/raw/dsc_extenstion/Blog/dsc_extension/iisinstall.ps1.zip'
            script: 'iisinstall.ps1'  // ここで指定したファイルが実行されます
            function: 'IISInstall'  // ここで指定した関数が実行されます
          }
      }
    }
  }
}

まとめ

今回は DSC 拡張機能を使ってみました
DSC 用の構成ファイルさえ作成してしまえれば非常に簡単にサーバーの設定ができました

構成ファイルは Copilot と一緒に相談して作れたらいいなーと思いました

参考

共有

Kento
著者
Kento
2020年に新卒で IT 企業に入社. インフラエンジニア(主にクラウド)として活動中