みち草

Azure中心にまとめる技術情報ブログ

Azure VM の DSC Extention によるスクリプト実行でハマった話

はじめに

今回は、Azure の ARM テンプレートで DSC を使おうとしたらだいぶハマった箇所があったので備忘です。
検索しても全然情報を見つけられず、エラー内容から原因を推測することもできませんでした。。。

目次

テンプレートと DSC について

本題に入る前に、JSON テンプレートと DSC についてものすごーーく軽く紹介

ARM テンプレート

ARM テンプレートとは、デプロイしたい Azure のリソース、その設定値などを JSON 形式で書いておく設計図みたいなもの。

それをデプロイするとテンプレート通りのリソースをデプロイしてくれる。
同じ環境を繰り返し作りたいときに便利です。

ARM テンプレートの参考 Docs はこちら。

テンプレートの概要 - Azure Resource Manager | Microsoft Docs

DSC

DSC とは PowerShell Desired State Configuration のことを指しており、一言でいえば構成管理ツールです。

ps1 ファイルに"こうあってほしい状態(設定)"を記述しておき、それを実行することで書かれている通りの状態に構成してくれます。
例えば OS の言語を変更したり、追加されたディスクにドライブレターを設定したり、などなど構成の自動化ができるものです。

DSC の参考 Docs はこちら。

Windows PowerShell Desired State Configuration の概要 - PowerShell | Microsoft Docs

ハマったことと解決法

やりたかったこと

今回は前述の ARM テンプレートと DSC を組み合わせて、 テンプレートのデプロイ時に Azure VM に DSC Extention をインストールし、 DSC 用 PowerShell スクリプトを実行して OS 設定を自動化させるつもりでした。

簡単なイメージは以下です
リソースグループ内に sysprep 済みのイメージと、DSC のスクリプトとモジュールを配置するためのストレージを用意しておいて、ARM テンプレートで VM デプロイ、 DSC 拡張機能でスクリプト & モジュールを持ってきて OS 設定、という流れです。
※スクリプト & モジュールは .zip 化して Blob に配置

f:id:kkkzk:20201112023208p:plain
DSC1

テンプレートの DSC Extention 部分はこんな感じ。
.zip ファイルを取ってきて展開して、setupWIndows.ps1 内の setupWIndows 関数をキックします。
そうすると DSC で機能のインストールやら OS の設定やらがいい感じに動いてくれる、はずでした。

f:id:kkkzk:20201112014539p:plain
DSC2

ハマったこと

ARM テンプレートでのリソースデプロイが進んでいき、VM のデプロイあたりでエラーが発生します。 エラーは以下の内容です。

f:id:kkkzk:20201112015423p:plain
DSC3

f:id:kkkzk:20201112015435p:plain
DSC4

Azure ポータル側とスクリプト側で貼りましたが、出ているエラーとしては、「"C:\Packages~\setupWindows.ps1" なんてコマンドはないから実行できないよ」という内容です。
RDP して確認すると示されたパスに setupWindows.ps1 が置かれておらず、要はスクリプト ファイルがないから実行できないということでした。

しかし、スクリプトは間違いなく zip に含めているので、なぜこのエラーが出るのか全く分からず、いろいろ試してみても結果は同じで困っていました。

解決方法

原因としては、スクリプトの中身ではなく "スクリプトとモジュールの zip 圧縮の仕方" でした。

まず、Blob に配置していたファイル群のフォルダ構造は以下のとおりです。

f:id:kkkzk:20201112024512p:plain
DSC5

これを圧縮するとき、最上位のフォルダ "setupWindows" を右クリックから zip 化していたのですが、これが原因でした。
この方法で zip 化し配置すると、前述のエラーが発生します。

解決方法は、"setupWindows 配下の 4 アイテムを選択して zip 化する" です。
つまりは、こういうことです。

f:id:kkkzk:20201112025157p:plain
DSC6

配置したいスクリプトとモジュールをフォルダでまとめて zip 化するのではなく、 スクリプトとモジュール個々を選択し、それを zip 化、完成した zip を "setupWindows.zip" にリネームしたものを Blob に配置します。

これで前述のエラーは発生しなくなります。

以上が解決方法です。

終わりに

これにハマっていた時は本当にわからず、他に同じようなところで詰まっている方の参考になるかと思い、備忘も兼ねて記事にしました。
(自分の探し方が悪いのでなければ)いくら調べてもこの zip 化の仕方は見つけられなかったですし、エラー内容からこれには辿りつけない。。。

ということで、前回からだいぶ空いてしまいましたが DSC でハマった話でした。 最近はなかなか書く時間を取れていないのですが、少しずつ投稿できればと思います。