本記事には広告(アフィリエイトリンク)が含まれます。

WindowsServer 2025 総合ガイド 第14回

WindowsServer 2025 総合ガイド 第14回
サービスとファイアウォールのDSC化 ― 手動設定から自動化へ

前回(第13回)では、YAML構文の基礎とDSC構成ファイルの構造を学び、レジストリ設定を例に構成ファイルの作成・テスト・適用を実践しました。第14回では、基礎編で手動設定したサービス管理(第5回)とファイアウォール設定(第7回)をDSC構成ファイルで自動化する方法を学びます。「手動で理解した設定をDSCで再現する」という流れを通じて、構成管理の実践力を身につけましょう。

14.1 この記事で学ぶこと

  • 基礎編で学んだサービス管理をDSC構成ファイルで自動化できる
  • ファイアウォール設定をDSC構成ファイルで自動化できる
  • 複数のリソースを組み合わせた複合構成ファイルを作成できる
  • dependsOnによるリソース間の依存関係を定義できる
  • 「手動で検証 → DSC化 → テスト → 適用」のワークフローを実践できる

14.2 前提条件

  • 第13回完了(DSC構成ファイルの基本構造とYAML構文を理解していること)
  • 第5回(サービス管理)と第7回(ファイアウォール)の内容を理解していること
  • DSC v3がインストールされ、dsc --versionでバージョンが確認できること
  • PSDesiredStateConfigurationモジュールがインストールされていること
  • PowerShell 7.4を管理者として起動できる状態

14.3 手動設定の振り返り:サービス管理

まず、第5回で学んだサービス管理の内容を振り返ります。DSC構成ファイルを作成する前に、「手動ではどのようにサービスを管理していたか」を確認しておくことが重要です。手動の操作を理解していなければ、構成ファイルの内容が何を意味しているのか分からなくなるためです。

14.3.1 第5回で学んだサービス管理コマンド

第5回では、以下のPowerShellコマンドレットを使ってサービスを管理しました。

操作 コマンドレット
サービスの状態確認 Get-Service Get-Service -Name "W32Time"
サービスの起動 Start-Service Start-Service -Name "W32Time"
サービスの停止 Stop-Service Stop-Service -Name "W32Time"
スタートアップの種類変更 Set-Service Set-Service -Name "W32Time" -StartupType Automatic
サービスの再起動 Restart-Service Restart-Service -Name "W32Time"

たとえば、Windows Timeサービスを「自動起動」に設定し、起動する手順は以下のとおりでした。

[実行環境: PowerShell 7.4 (管理者)]

# サービスの現在の状態を確認
Get-Service -Name "W32Time" | Select-Object -Property Name, Status, StartType

# スタートアップの種類を「自動」に変更
Set-Service -Name "W32Time" -StartupType Automatic

# サービスを起動
Start-Service -Name "W32Time"

# 設定結果を確認
Get-Service -Name "W32Time" | Select-Object -Property Name, Status, StartType

実行結果の例:

Name    Status StartType
----    ------ ---------
W32Time Running Automatic

14.3.2 手動設定の課題とDSC化の必要性

手動でのサービス管理には、以下のような課題があります。

  • 再現性の問題:複数のサーバーに同じ設定を適用する場合、手動では手順の抜け漏れが発生しやすい
  • 構成ドリフト:時間の経過とともに、誰かが設定を変更し、サーバーごとに設定が異なる状態になる可能性がある
  • ドキュメントとの乖離:手順書と実際の設定が一致しなくなることがある
  • 冪等性の欠如:手動コマンドは「既に起動しているサービスを起動しようとする」とエラーになることがある

DSCを使えば、「サービスがどのような状態であるべきか」を宣言的に定義でき、これらの課題を解決できます。構成ファイル自体がドキュメントの役割も果たすため、設定内容とドキュメントが常に一致します。

14.4 サービスリソースの使用

DSC v3でサービスを管理するには、PSDesiredStateConfigurationモジュールのServiceリソースを使用します。第13回で学んだとおり、このリソースはWindowsPowerShellアダプター経由で利用します。

14.4.1 利用可能なサービスリソースの確認

まず、DSC v3で利用可能なサービス関連のリソースを確認しましょう。

[実行環境: PowerShell 7.4 (管理者)]

# サービス関連のリソースを検索
dsc resource list --adapter Microsoft.Windows/WindowsPowerShell | Select-String "Service"

実行結果の例:

PSDesiredStateConfiguration/Service          resource  1.1    gs--t---  Microsoft.Windows/WindowsPowerShell
PSDesiredStateConfiguration/ServiceSet       resource  1.1    gs--t---  Microsoft.Windows/WindowsPowerShell

サービス管理に使用できるリソースは以下の2つです。

リソースタイプ 説明 用途
PSDesiredStateConfiguration/Service 単一のサービスを管理する サービスごとに詳細な設定を行う場合
PSDesiredStateConfiguration/ServiceSet 複数のサービスに同じ設定を一括適用する 複数サービスを同じ状態にする場合

本記事では、最も基本的なPSDesiredStateConfiguration/Serviceリソースを使用します。

ネイティブリソースとアダプター経由リソースの違い:第13回で学んだとおり、Microsoft.Windows/Registryのようなネイティブリソースはトップレベルに直接記述できますが、PSDesiredStateConfiguration/Serviceはアダプター経由リソースのため、Microsoft.Windows/WindowsPowerShellアダプターのproperties.resources内に記述する必要があります。

14.4.2 Serviceリソースのプロパティ

PSDesiredStateConfiguration/Serviceリソースで設定できる主なプロパティは以下のとおりです。

プロパティ 必須 説明
Name String ○(キー) サービス名(表示名ではなくサービス名を指定)
State String サービスの状態。Running(実行中)または Stopped(停止)
StartupType String スタートアップの種類。Automatic(自動)、Manual(手動)、Disabled(無効)
Ensure String サービスの存在確認。Present(存在する)または Absent(存在しない)
Description String サービスの説明文
DisplayName String サービスの表示名
Dependencies String[] 依存するサービスのリスト
BuiltInAccount String サービス実行アカウント。LocalServiceLocalSystemNetworkService

サービス名と表示名の違いに注意:Nameプロパティにはサービス名(W32Timeなど)を指定します。DisplayNameWindows Timeなど)ではありません。サービス名はGet-ServiceコマンドレットのName列に表示される値です。

14.5 サービス構成ファイルの作成

それでは、実際にサービスを管理するDSC構成ファイルを作成していきましょう。

14.5.1 単一サービスの構成例:Windows Timeサービス

まず、第5回で手動設定したWindows Timeサービスの設定をDSC構成ファイルで再現します。

手動での設定コマンド:

[実行環境: PowerShell 7.4 (管理者)]

# 手動での設定(第5回で学んだ方法)
Set-Service -Name "W32Time" -StartupType Automatic
Start-Service -Name "W32Time"

これをDSC構成ファイルで表現すると、以下のようになります。

[ファイル: w32time-service.dsc.yaml]

# yaml-language-server: $schema=https://aka.ms/dsc/schemas/v3/bundled/config/document.vscode.json
# Windows Timeサービスの構成
# 手動操作: Set-Service -Name "W32Time" -StartupType Automatic / Start-Service -Name "W32Time"
$schema: https://aka.ms/dsc/schemas/v3/bundled/config/document.json
metadata:
  name: W32Time-Service-Configuration
resources:
  - name: Configure Windows Time Service
    type: Microsoft.Windows/WindowsPowerShell
    properties:
      resources:
        - name: Windows Time Service
          type: PSDesiredStateConfiguration/Service
          properties:
            Name: W32Time
            State: Running
            StartupType: Automatic
            Ensure: Present

この構成ファイルを分解して理解しましょう。

内容 説明
1行目 # yaml-language-server: ... VS Code用のスキーマヒント(エディタ補完用)
4行目 $schema: ... DSC v3構成ファイルのスキーマ定義(必須)
5〜6行目 metadata: 構成の名前(任意だが推奨)
8行目 type: Microsoft.Windows/WindowsPowerShell アダプター指定(PSDSC リソース使用時に必要)
11行目 type: PSDesiredStateConfiguration/Service Serviceリソースを使用
13行目 Name: W32Time 管理対象のサービス名
14行目 State: Running サービスが実行中であるべき
15行目 StartupType: Automatic 自動起動に設定
16行目 Ensure: Present サービスが存在すべき

構成のテスト

構成ファイルを作成したら、適用前にテストを実行します。

[実行環境: PowerShell 7.4 (管理者)]

# 構成のテスト(変更は行われない)
dsc config test --file ./w32time-service.dsc.yaml

実行結果の例(サービスが既に目的の状態にある場合):

metadata:
  Microsoft.DSC:
    version: 3.1.0
    operation: test
    executionType: actual
    startDatetime: 2026-02-08T10:00:00.000000+09:00
    endDatetime: 2026-02-08T10:00:05.000000+09:00
    duration: PT5S
    securityContext: elevated
results:
  - metadata:
      Microsoft.DSC:
        duration: PT4.5S
    name: Configure Windows Time Service
    type: Microsoft.Windows/WindowsPowerShell
    result:
      desiredState:
        resources:
          - name: Windows Time Service
            type: PSDesiredStateConfiguration/Service
            properties:
              Name: W32Time
              State: Running
              StartupType: Automatic
              Ensure: Present
      actualState:
        result:
          - name: Windows Time Service
            type: PSDesiredStateConfiguration/Service
            result:
              inDesiredState: true
      inDesiredState: true
      differingProperties: []

テスト結果の見方は第13回で学んだとおりです。

  • inDesiredState: true:既に目的の状態であり、変更不要
  • inDesiredState: false:目的の状態と異なるため、変更が必要

構成の適用

テストでinDesiredState: falseが表示された場合は、構成を適用します。

[実行環境: PowerShell 7.4 (管理者)]

# 構成の適用
dsc config set --file ./w32time-service.dsc.yaml

# 適用後の状態確認
dsc config get --file ./w32time-service.dsc.yaml

14.5.2 複数サービスの構成例

実務では、複数のサービスをまとめて管理したい場面がよくあります。たとえば、サーバーの基本的な運用に必要な複数のサービスを一括で管理する構成ファイルを作成してみましょう。

[ファイル: basic-services.dsc.yaml]

# yaml-language-server: $schema=https://aka.ms/dsc/schemas/v3/bundled/config/document.vscode.json
# 基本サービスの構成
# サーバー運用に必要な基本サービスをまとめて管理
$schema: https://aka.ms/dsc/schemas/v3/bundled/config/document.json
metadata:
  name: Basic-Services-Configuration
resources:
  - name: Configure Basic Services
    type: Microsoft.Windows/WindowsPowerShell
    properties:
      resources:
        # Windows Timeサービス:時刻同期
        # 手動操作: Set-Service -Name "W32Time" -StartupType Automatic
        - name: Windows Time Service
          type: PSDesiredStateConfiguration/Service
          properties:
            Name: W32Time
            State: Running
            StartupType: Automatic
            Ensure: Present

        # Windows Eventログサービス:イベントログ記録
        # 手動操作: Get-Service -Name "EventLog" で状態確認
        - name: Windows Event Log Service
          type: PSDesiredStateConfiguration/Service
          properties:
            Name: EventLog
            State: Running
            StartupType: Automatic
            Ensure: Present

        # DNS Clientサービス:名前解決
        # 手動操作: Get-Service -Name "Dnscache" で状態確認
        - name: DNS Client Service
          type: PSDesiredStateConfiguration/Service
          properties:
            Name: Dnscache
            State: Running
            StartupType: Automatic
            Ensure: Present

このように、1つのアダプター(Microsoft.Windows/WindowsPowerShell)のresources配列内に複数のServiceリソースを並べることで、複数のサービスを一括管理できます。

[実行環境: PowerShell 7.4 (管理者)]

# 複数サービスの構成をテスト
dsc config test --file ./basic-services.dsc.yaml

14.5.3 手動コマンドとDSC構成の対応表

ここで、手動コマンド(PowerShell)とDSC構成(YAML)の対応関係を整理しておきましょう。この対応を理解することが、手動設定をDSC化する際の基本となります。

操作 手動コマンド(PowerShell) DSC構成(YAML プロパティ)
サービスを起動する Start-Service -Name "W32Time" State: Running
サービスを停止する Stop-Service -Name "W32Time" State: Stopped
自動起動に設定 Set-Service -Name "W32Time" -StartupType Automatic StartupType: Automatic
手動起動に設定 Set-Service -Name "W32Time" -StartupType Manual StartupType: Manual
無効に設定 Set-Service -Name "W32Time" -StartupType Disabled StartupType: Disabled
サービスの存在確認 Get-Service -Name "W32Time" Ensure: Present

DSC化のメリット:手動コマンドでは「起動する」「設定を変更する」という命令的なアプローチですが、DSCでは「この状態であるべき」という宣言的なアプローチです。DSCが自動的に現在の状態と目標状態を比較し、差異がある場合のみ変更を適用します。そのため、構成ファイルを何度適用しても安全です(冪等性)。

14.6 手動設定の振り返り:ファイアウォール

次に、第7回で学んだファイアウォール設定を振り返ります。

14.6.1 第7回で学んだファイアウォール管理コマンド

第7回では、以下のPowerShellコマンドレットを使ってファイアウォールを管理しました。

操作 コマンドレット
規則の一覧表示 Get-NetFirewallRule Get-NetFirewallRule -Enabled True
規則の作成 New-NetFirewallRule New-NetFirewallRule -DisplayName "Allow HTTP" ...
規則の変更 Set-NetFirewallRule Set-NetFirewallRule -DisplayName "Allow HTTP" ...
規則の有効化 Enable-NetFirewallRule Enable-NetFirewallRule -DisplayName "Allow HTTP"
規則の無効化 Disable-NetFirewallRule Disable-NetFirewallRule -DisplayName "Allow HTTP"
規則の削除 Remove-NetFirewallRule Remove-NetFirewallRule -DisplayName "Allow HTTP"

たとえば、HTTP(TCP 80番ポート)の受信を許可する規則を作成する手順は以下のとおりでした。

[実行環境: PowerShell 7.4 (管理者)]

# HTTPの受信を許可する規則を作成(第7回で学んだ方法)
New-NetFirewallRule `
    -DisplayName "Allow HTTP Inbound" `
    -Direction Inbound `
    -Protocol TCP `
    -LocalPort 80 `
    -Action Allow `
    -Profile Any `
    -Enabled True

14.6.2 ファイアウォール設定のDSC化の必要性

手動でのファイアウォール管理には、サービス管理と同様の課題に加えて、以下のような特有の課題があります。

  • 設定の複雑さ:ファイアウォール規則は多数のパラメータを持ち、手動での設定ミスが起きやすい
  • 規則の重複:同じポートに対する規則を複数回作成してしまう可能性がある(手動では冪等性がない)
  • 監査の困難さ:多数の規則の中から、意図した設定が正しく適用されているか確認が難しい

第12回で学んだように、DSCの冪等性によって「規則が既に存在する場合は何もしない」という動作が自動的に保証されます。これにより、構成ファイルを何度適用しても規則が重複することはありません。

14.7 ファイアウォールリソースの使用

DSC v3でファイアウォール規則を管理するには、NetworkingDscモジュールのFirewallリソースを使用します。このリソースもアダプター経由で利用します。

14.7.1 NetworkingDscモジュールのインストール

ファイアウォールのDSCリソースは、PSDesiredStateConfigurationモジュールには含まれていません。別途NetworkingDscモジュールをインストールする必要があります。

[実行環境: PowerShell 7.4 (管理者)]

# NetworkingDscモジュールのインストール
Install-Module -Name NetworkingDsc -Force -AllowClobber

# インストールの確認
Get-Module -Name NetworkingDsc -ListAvailable | 
    Select-Object -Property Name, Version

実行結果の例:

Name           Version
----           -------
NetworkingDsc  9.0.0

14.7.2 利用可能なファイアウォールリソースの確認

モジュールをインストールしたら、利用可能なファイアウォールリソースを確認します。

[実行環境: PowerShell 7.4 (管理者)]

# ファイアウォール関連のリソースを検索
dsc resource list --adapter Microsoft.Windows/WindowsPowerShell | Select-String "Firewall"

実行結果の例:

NetworkingDsc/Firewall                resource  ...  gs--t---  Microsoft.Windows/WindowsPowerShell
NetworkingDsc/FirewallProfile         resource  ...  gs--t---  Microsoft.Windows/WindowsPowerShell
リソースタイプ 説明 用途
NetworkingDsc/Firewall 個別のファイアウォール規則を管理する 受信/送信規則の作成・変更・削除
NetworkingDsc/FirewallProfile ファイアウォールプロファイル全体の設定を管理する ドメイン/プライベート/パブリックプロファイルの設定

なぜ追加モジュールが必要なのか:PSDesiredStateConfigurationモジュールにはServiceWindowsFeatureといった基本的なリソースが含まれていますが、ファイアウォールのような専門的な管理機能は、コミュニティが開発したNetworkingDscモジュールで提供されています。PowerShell Galleryから簡単にインストールできます。

14.7.3 Firewallリソースのプロパティ

NetworkingDsc/Firewallリソースで設定できる主なプロパティは以下のとおりです。

プロパティ 必須 説明
Name String ○(キー) ファイアウォール規則の名前(一意な識別子)
DisplayName String 規則の表示名
Direction String 通信の方向。Inbound(受信)または Outbound(送信)
Action String 許可/拒否。Allow(許可)または Block(ブロック)
Protocol String プロトコル。TCPUDPAny など
LocalPort String[] ローカルポート番号(複数指定可)
Enabled String 規則の有効/無効。True または False
Profile String[] 適用するプロファイル。DomainPrivatePublicAny
Ensure String 規則の存在。Present(存在すべき)または Absent(存在しないべき)
Description String 規則の説明

14.8 ファイアウォール構成ファイルの作成

ファイアウォール規則をDSC構成ファイルで管理する方法を実践しましょう。

14.8.1 基本的なポート開放の構成

HTTP(TCP 80番ポート)の受信を許可する規則をDSC構成ファイルで定義します。

手動での設定コマンド:

[実行環境: PowerShell 7.4 (管理者)]

# 手動でのファイアウォール規則作成(第7回で学んだ方法)
New-NetFirewallRule `
    -DisplayName "Allow HTTP Inbound" `
    -Name "Allow-HTTP-Inbound" `
    -Direction Inbound `
    -Protocol TCP `
    -LocalPort 80 `
    -Action Allow `
    -Profile Any `
    -Enabled True

これをDSC構成ファイルで表現すると、以下のようになります。

[ファイル: firewall-http.dsc.yaml]

# yaml-language-server: $schema=https://aka.ms/dsc/schemas/v3/bundled/config/document.vscode.json
# HTTP受信許可のファイアウォール規則
# 手動操作: New-NetFirewallRule -DisplayName "Allow HTTP Inbound" -Direction Inbound -Protocol TCP -LocalPort 80 -Action Allow
$schema: https://aka.ms/dsc/schemas/v3/bundled/config/document.json
metadata:
  name: Firewall-HTTP-Configuration
resources:
  - name: Configure HTTP Firewall Rule
    type: Microsoft.Windows/WindowsPowerShell
    properties:
      resources:
        - name: Allow HTTP Inbound
          type: NetworkingDsc/Firewall
          properties:
            Name: Allow-HTTP-Inbound
            DisplayName: Allow HTTP Inbound
            Direction: Inbound
            Action: Allow
            Protocol: TCP
            LocalPort:
              - "80"
            Enabled: "True"
            Ensure: Present
            Profile:
              - Any
            Description: "HTTP通信(TCP 80)の受信を許可"

LocalPortの書き方に注意:LocalPortは配列として指定します。YAMLでは- "80"のようにリスト形式で記述し、値は文字列として指定します。複数ポートを指定する場合は- "80"- "443"のように複数行で記述するか、1つの規則ではなく別々の規則として定義することもできます。

[実行環境: PowerShell 7.4 (管理者)]

# ファイアウォール構成のテスト
dsc config test --file ./firewall-http.dsc.yaml

14.8.2 複数規則の一括定義

Webサーバーでよく必要になるHTTP(80)とHTTPS(443)の両方を開放する構成ファイルを作成します。

[ファイル: firewall-web.dsc.yaml]

# yaml-language-server: $schema=https://aka.ms/dsc/schemas/v3/bundled/config/document.vscode.json
# Webサーバー用ファイアウォール規則
# HTTP(80)とHTTPS(443)の受信を許可
$schema: https://aka.ms/dsc/schemas/v3/bundled/config/document.json
metadata:
  name: Firewall-Web-Configuration
resources:
  - name: Configure Web Firewall Rules
    type: Microsoft.Windows/WindowsPowerShell
    properties:
      resources:
        # HTTP(TCP 80)の受信許可
        # 手動操作: New-NetFirewallRule -DisplayName "Allow HTTP" -Direction Inbound -Protocol TCP -LocalPort 80 -Action Allow
        - name: Allow HTTP Inbound
          type: NetworkingDsc/Firewall
          properties:
            Name: Allow-HTTP-Inbound
            DisplayName: Allow HTTP Inbound
            Direction: Inbound
            Action: Allow
            Protocol: TCP
            LocalPort:
              - "80"
            Enabled: "True"
            Ensure: Present
            Profile:
              - Any
            Description: "HTTP通信(TCP 80)の受信を許可"

        # HTTPS(TCP 443)の受信許可
        # 手動操作: New-NetFirewallRule -DisplayName "Allow HTTPS" -Direction Inbound -Protocol TCP -LocalPort 443 -Action Allow
        - name: Allow HTTPS Inbound
          type: NetworkingDsc/Firewall
          properties:
            Name: Allow-HTTPS-Inbound
            DisplayName: Allow HTTPS Inbound
            Direction: Inbound
            Action: Allow
            Protocol: TCP
            LocalPort:
              - "443"
            Enabled: "True"
            Ensure: Present
            Profile:
              - Any
            Description: "HTTPS通信(TCP 443)の受信を許可"

14.8.3 手動コマンドとDSC構成の対応表(ファイアウォール)

操作 手動コマンド(PowerShell パラメータ) DSC構成(YAML プロパティ)
規則の名前 -Name "Allow-HTTP-Inbound" Name: Allow-HTTP-Inbound
表示名 -DisplayName "Allow HTTP Inbound" DisplayName: Allow HTTP Inbound
受信規則 -Direction Inbound Direction: Inbound
許可 -Action Allow Action: Allow
TCPプロトコル -Protocol TCP Protocol: TCP
ポート番号 -LocalPort 80 LocalPort: - "80"
規則の有効化 -Enabled True Enabled: "True"
規則の存在確認 Get-NetFirewallRule -Name ... Ensure: Present
規則の削除 Remove-NetFirewallRule -Name ... Ensure: Absent

14.9 複合構成ファイルの作成

ここまで、サービスとファイアウォールを個別に管理する構成ファイルを作成してきました。実務では、これらを1つの構成ファイルにまとめて管理したい場面が多くあります。ここでは、サービスとファイアウォールを組み合わせた複合構成ファイルを作成し、リソース間の依存関係を定義する方法を学びます。

14.9.1 サービスとファイアウォールの組み合わせ

以下の構成ファイルは、Windows Timeサービスの設定と、Webサーバー向けのファイアウォール規則を1つのファイルにまとめたものです。

[ファイル: server-baseline.dsc.yaml]

# yaml-language-server: $schema=https://aka.ms/dsc/schemas/v3/bundled/config/document.vscode.json
# サーバーベースライン構成
# サービス管理とファイアウォール設定を統合管理
$schema: https://aka.ms/dsc/schemas/v3/bundled/config/document.json
metadata:
  name: Server-Baseline-Configuration
resources:
  # ========================================
  # セクション1: 基本サービスの構成
  # ========================================
  - name: Configure Basic Services
    type: Microsoft.Windows/WindowsPowerShell
    properties:
      resources:
        # Windows Timeサービス
        - name: Windows Time Service
          type: PSDesiredStateConfiguration/Service
          properties:
            Name: W32Time
            State: Running
            StartupType: Automatic
            Ensure: Present

        # Windows Event Logサービス
        - name: Windows Event Log Service
          type: PSDesiredStateConfiguration/Service
          properties:
            Name: EventLog
            State: Running
            StartupType: Automatic
            Ensure: Present

  # ========================================
  # セクション2: ファイアウォール規則の構成
  # ========================================
  - name: Configure Firewall Rules
    type: Microsoft.Windows/WindowsPowerShell
    properties:
      resources:
        # HTTP受信許可
        - name: Allow HTTP Inbound
          type: NetworkingDsc/Firewall
          properties:
            Name: Allow-HTTP-Inbound
            DisplayName: Allow HTTP Inbound
            Direction: Inbound
            Action: Allow
            Protocol: TCP
            LocalPort:
              - "80"
            Enabled: "True"
            Ensure: Present
            Profile:
              - Any

        # HTTPS受信許可
        - name: Allow HTTPS Inbound
          type: NetworkingDsc/Firewall
          properties:
            Name: Allow-HTTPS-Inbound
            DisplayName: Allow HTTPS Inbound
            Direction: Inbound
            Action: Allow
            Protocol: TCP
            LocalPort:
              - "443"
            Enabled: "True"
            Ensure: Present
            Profile:
              - Any

この構成ファイルでは、トップレベルのresources配列にアダプターリソースを2つ配置し、それぞれの中にサービスリソースとファイアウォールリソースを定義しています。

14.9.2 dependsOnによる依存関係の定義

複合構成ファイルでは、リソース間に「この設定が完了してから次の設定を適用する」という依存関係を定義できます。DSC v3では、dependsOnプロパティとresourceId()関数を使って依存関係を表現します。

たとえば、「サービスの設定が完了してからファイアウォール規則を設定する」という依存関係を定義する場合は、以下のように記述します。

[ファイル: server-baseline-with-deps.dsc.yaml]

# yaml-language-server: $schema=https://aka.ms/dsc/schemas/v3/bundled/config/document.vscode.json
# サーバーベースライン構成(依存関係付き)
# サービスの設定完了後にファイアウォール規則を適用
$schema: https://aka.ms/dsc/schemas/v3/bundled/config/document.json
metadata:
  name: Server-Baseline-With-Dependencies
resources:
  # ========================================
  # セクション1: 基本サービスの構成(先に実行)
  # ========================================
  - name: Configure Basic Services
    type: Microsoft.Windows/WindowsPowerShell
    properties:
      resources:
        - name: Windows Time Service
          type: PSDesiredStateConfiguration/Service
          properties:
            Name: W32Time
            State: Running
            StartupType: Automatic
            Ensure: Present

  # ========================================
  # セクション2: ファイアウォール規則の構成(サービス設定後に実行)
  # ========================================
  - name: Configure Firewall Rules
    type: Microsoft.Windows/WindowsPowerShell
    properties:
      resources:
        - name: Allow HTTP Inbound
          type: NetworkingDsc/Firewall
          properties:
            Name: Allow-HTTP-Inbound
            DisplayName: Allow HTTP Inbound
            Direction: Inbound
            Action: Allow
            Protocol: TCP
            LocalPort:
              - "80"
            Enabled: "True"
            Ensure: Present
            Profile:
              - Any
    # サービス構成が完了してからファイアウォール規則を適用
    dependsOn:
      - "[resourceId('Microsoft.Windows/WindowsPowerShell', 'Configure Basic Services')]"

dependsOnの構文

dependsOnプロパティの値は、resourceId()関数を使って依存先のリソースを指定します。

dependsOn:
  - "[resourceId('リソースタイプ', 'リソース名')]"
  • リソースタイプ:依存先リソースのtypeプロパティの値
  • リソース名:依存先リソースのnameプロパティの値

複数のリソースに依存する場合は、リスト形式で複数指定できます。

dependsOn:
  - "[resourceId('Microsoft.Windows/WindowsPowerShell', 'Configure Basic Services')]"
  - "[resourceId('Microsoft.Windows/Registry', 'Some Registry Setting')]"

dependsOnの注意点:dependsOnはトップレベルのリソース間でのみ設定できます。アダプター内部の個別リソース(たとえばPSDesiredStateConfiguration/Serviceの各インスタンス)に対して直接dependsOnを設定することはできません。アダプター内部のリソースの実行順序を制御したい場合は、アダプターごとにリソースを分けて、トップレベルでdependsOnを設定します。

14.9.3 依存関係の実行順序

dependsOnを使った場合の実行順序を図解すると、以下のようになります。

【dependsOnなしの場合】
  Configure Basic Services  →  Configure Firewall Rules
  (DSCが最適な順序で実行、順序は保証されない)

【dependsOnありの場合】
  Configure Basic Services  →  Configure Firewall Rules
  (必ずサービス設定 → ファイアウォール設定の順序で実行)

dependsOnが特に重要になるのは、リソース間に明確な前提条件がある場合です。たとえば「IISのインストール(WindowsFeature)が完了してから、IIS関連のサービス(W3SVC)を設定する」といったケースでは、dependsOnで正しい順序を保証する必要があります。

14.10 既存設定との整合性確認

DSCを導入する際に重要なのは、既に手動で設定されている環境にDSCを適用する場合の注意点です。

14.10.1 テスト実行の重要性

既存の環境にDSC構成を適用する前に、必ずdsc config testでテストを実行してください。テスト実行は現在の状態と目標状態を比較するだけで、実際の変更は行いません。

[実行環境: PowerShell 7.4 (管理者)]

# ステップ1: まずテストで差分を確認(変更は行われない)
dsc config test --file ./server-baseline.dsc.yaml

テスト結果から、以下の情報を読み取ります。

  • 変更が必要なリソース:inDesiredState: falseのリソースを確認する
  • 差異の内容:differingPropertiesでどのプロパティが異なるかを確認する
  • 予期しない変更がないか:意図しないリソースがfalseになっていないか確認する

14.10.2 段階的な適用

複合構成ファイルを一度に適用するのではなく、段階的に適用することをお勧めします。

  1. サービス設定のみを先に適用:サービス構成ファイル単体でテスト・適用する
  2. 適用結果を確認:Get-Serviceで手動確認する
  3. ファイアウォール設定を適用:ファイアウォール構成ファイル単体でテスト・適用する
  4. 適用結果を確認:Get-NetFirewallRuleで手動確認する
  5. 統合構成ファイルでテスト:すべてが正しいことを確認する

[実行環境: PowerShell 7.4 (管理者)]

# ステップ1: サービス構成のテスト
dsc config test --file ./basic-services.dsc.yaml

# ステップ2: 問題なければ適用
dsc config set --file ./basic-services.dsc.yaml

# ステップ3: 手動で結果を確認
Get-Service -Name "W32Time", "EventLog", "Dnscache" |
    Select-Object -Property Name, Status, StartType

# ステップ4: ファイアウォール構成のテスト
dsc config test --file ./firewall-web.dsc.yaml

# ステップ5: 問題なければ適用
dsc config set --file ./firewall-web.dsc.yaml

# ステップ6: 手動で結果を確認
Get-NetFirewallRule -DisplayName "Allow HTTP*", "Allow HTTPS*" |
    Select-Object -Property DisplayName, Direction, Action, Enabled

実行結果の例:

Name     Status StartType
----     ------ ---------
W32Time  Running Automatic
EventLog Running Automatic
Dnscache Running Automatic

DisplayName          Direction Action Enabled
-----------          --------- ------ -------
Allow HTTP Inbound   Inbound   Allow  True
Allow HTTPS Inbound  Inbound   Allow  True

14.10.3 ロールバックの考慮

DSC v3には自動的なロールバック機能はありません。そのため、構成を適用する前に以下の対策を講じておくことが重要です。

  • 現在の状態を記録する:適用前にdsc config getで現在の状態を取得し、保存しておく
  • 元に戻す構成ファイルを準備する:必要に応じて、元の状態に戻すための構成ファイルを作成しておく
  • テスト環境で検証する:可能であれば、本番環境に適用する前にテスト環境で検証する

[実行環境: PowerShell 7.4 (管理者)]

# 適用前に現在の状態をファイルに保存
dsc config get --file ./server-baseline.dsc.yaml | 
    Out-File -FilePath "./backup-state-$(Get-Date -Format 'yyyyMMdd-HHmmss').json"

14.11 構成管理のワークフロー

ここまで学んだ内容を踏まえて、実務で推奨される構成管理のワークフローを整理します。

14.11.1 4ステップのワークフロー

DSCによる構成管理は、以下の4ステップで進めます。

ステップ1        ステップ2            ステップ3           ステップ4
┌─────────┐    ┌──────────────┐    ┌────────────┐    ┌─────────┐
│ 手動で   │ →  │ DSC構成       │ →  │ テスト環境  │ →  │ 本番環境 │
│ 設定検証 │    │ ファイル作成  │    │ でDSCテスト │    │ に適用   │
└─────────┘    └──────────────┘    └────────────┘    └─────────┘
 PowerShellで     YAML構成ファイル     dsc config test    dsc config set
 動作確認         を作成                で差分確認          で適用

ステップ1:手動で設定を検証する

新しい設定を行う場合は、まずPowerShellで手動実行し、動作を確認します。

[実行環境: PowerShell 7.4 (管理者)]

# 例:新しいサービス設定を手動で検証
Set-Service -Name "W32Time" -StartupType Automatic
Start-Service -Name "W32Time"
Get-Service -Name "W32Time"  # 動作確認

ステップ2:動作確認後、DSC構成ファイルを作成する

手動で動作を確認できたら、その設定をDSC構成ファイル(YAML)に変換します。手動コマンドのパラメータとDSCプロパティの対応表(本記事の14.5.3、14.8.3を参照)を活用してください。

ステップ3:テスト環境でDSCテストを実行する

[実行環境: PowerShell 7.4 (管理者)]

# テスト実行(変更なし)
dsc config test --file ./構成ファイル名.dsc.yaml

# テスト結果を確認し、意図した差分のみであることを確認

ステップ4:本番環境に適用する

[実行環境: PowerShell 7.4 (管理者)]

# 構成の適用
dsc config set --file ./構成ファイル名.dsc.yaml

# 適用後の状態確認
dsc config get --file ./構成ファイル名.dsc.yaml

14.11.2 このワークフローを守る理由

このワークフローが重要な理由は以下のとおりです。

  • ステップ1(手動検証):設定内容の正しさを確認し、意図しない影響がないことを確認する
  • ステップ2(DSC化):検証済みの設定をコード化することで、再現性とドキュメント性を確保する
  • ステップ3(テスト):YAML構文の誤りやプロパティの設定ミスを事前に検出する
  • ステップ4(適用):テスト済みの構成を安全に適用する

基礎編で学んだ手動スキルが活きる場面:このワークフローからも分かるとおり、DSCを使うからといって手動での設定スキルが不要になるわけではありません。むしろ、手動での理解がDSC構成ファイルの正確な作成に不可欠です。基礎編(第5回、第7回)で学んだ手動設定の知識は、DSC化する際の「何を」「どう」設定すべきかの判断基準になります。

14.12 よくあるエラーと対処法

14.12.1 サービスリソースのエラー

エラー内容 原因 対処法
Service ‘xxx’ not found 指定したサービス名が存在しない Get-Serviceで正確なサービス名を確認。表示名ではなくサービス名を指定する
Access denied 管理者権限なしで実行している 管理者権限でPowerShell 7.4を起動して再実行する
Cannot start service サービスの依存関係が満たされていない 依存するサービスの状態を確認し、必要に応じて構成ファイルに追加する
Invalid value for StartupType StartupTypeの値が不正 AutomaticManualDisabledのいずれかを指定する

14.12.2 ファイアウォールリソースのエラー

エラー内容 原因 対処法
Module ‘NetworkingDsc’ not found NetworkingDscモジュールがインストールされていない Install-Module -Name NetworkingDsc -Forceでインストールする
Resource type not found リソースタイプの指定が間違っている dsc resource listで正確なリソースタイプを確認する
YAML parse error YAML構文に誤りがある(インデント不正など) インデントにスペースのみを使用しているか確認。VS Codeの YAML拡張機能でバリデーションを行う
LocalPort expects string array LocalPortの値が数値になっている - "80"のように文字列として指定する(- 80ではなく)

14.12.3 依存関係のエラー

エラー内容 原因 対処法
Dependency not found dependsOnで指定したリソースが存在しない resourceId()関数の引数(リソースタイプとリソース名)が正確か確認する
Circular dependency リソースAがBに依存し、BがAに依存する循環参照 依存関係を見直し、循環参照を解消する

14.12.4 エラー調査の基本手順

エラーが発生した場合は、以下の手順で調査します。

[実行環境: PowerShell 7.4 (管理者)]

# 1. トレースレベルをdebugにしてテスト実行
dsc config test --file ./構成ファイル名.dsc.yaml --trace-level debug

# 2. 手動でリソースの状態を確認
Get-Service -Name "W32Time" | Select-Object -Property *
Get-NetFirewallRule -DisplayName "Allow HTTP*" | Select-Object -Property *

# 3. リソースが利用可能か確認
dsc resource list --adapter Microsoft.Windows/WindowsPowerShell | Select-String "Service"
dsc resource list --adapter Microsoft.Windows/WindowsPowerShell | Select-String "Firewall"

14.13 まとめ

第14回では、以下の内容を学びました。

  • 手動設定からDSC化への流れ
    • 第5回で学んだサービス管理コマンド(Get-ServiceSet-ServiceStart-Service)をDSC構成ファイルで再現する方法
    • 第7回で学んだファイアウォール管理コマンド(New-NetFirewallRule)をDSC構成ファイルで再現する方法
    • 手動コマンドのパラメータとDSCプロパティの対応関係
  • サービスリソースの使用
    • PSDesiredStateConfiguration/Serviceリソースのプロパティ(NameStateStartupType
    • 単一サービスおよび複数サービスの構成ファイル作成
    • アダプター経由での記述方法
  • ファイアウォールリソースの使用
    • NetworkingDscモジュールのインストール
    • NetworkingDsc/Firewallリソースのプロパティ(NameDirectionActionProtocolLocalPort
    • ポート開放規則の構成ファイル作成
  • 複合構成ファイルと依存関係
    • サービスとファイアウォールを1つの構成ファイルにまとめる方法
    • dependsOnresourceId()関数によるリソース間の依存関係定義
    • トップレベルリソース間でのみdependsOnを設定できること
  • 構成管理のワークフロー
    • 「手動で検証 → DSC化 → テスト → 適用」の4ステップ
    • 既存環境への適用時のテスト実行の重要性
    • 段階的な適用とロールバックの考慮

14.14 次回予告

第15回では「DSC実践演習 ― Webサーバー環境の自動構築」と題して、IIS Webサーバーの自動構築を通じた実践的な複合構成ファイルの作成、SSL/TLS証明書の設定、バックアップの基本、そしてシリーズ全体の総括を行います。今回学んだサービスとファイアウォールのDSC化に加え、WindowsFeatureリソースによるIISのインストールを組み合わせ、実務レベルの自動構築を体験しましょう。

14.15 参考リンク