🛠️

Azure VM Image Builder の Isolated Image Builds について

2024/03/13に公開

Azure VM Image Builder (AIB) が、いつのまにか Azure Container Instance (ACI) のコンテナの中で Packer を動かすサービスに変わっていた。

あわてて AIB のリリースノートを確認すると、2023年11月ごろには ACI を利用するようになっていたらしい。今日たまたま AIB を動かしてみて初めて気がついた。

https://learn.microsoft.com/ja-jp/azure/virtual-machines/image-builder-api-update-release-notes#november-2023

これは Isolated Image Builds と呼ばれるものの一部らしい。 従来の方法で作成した ImageTemplates リソースは変更なく動作するが、Azure サブスクリプションで ACI のリソースプロバイダを有効化し、必要なクォータを確保しておく必要がある。

https://learn.microsoft.com/ja-jp/azure/virtual-machines/security-isolated-image-builds-image-builder

ImageTemplates のビルドを開始した後に自動的に作られる AIB リソースグループの中を Azure Portal で覗くと ACI のリソースができている。こちらから AIB ジョブのログを確認するだけでなく Packer を実行中のコンテナのシェルを開くことができる。

コンテナでは Azure Linux (旧称 CBL-Mariner) が動いている。最小構成であるため最初は ps コマンドすら使えないが、yum で必要なパッケージをインストールすれば AIB のコンテナや仮想ネットワークの探検・診断ができる。 Packer がビルドしている Azure VM インスタンスにちょっかいを出すこともできそうである。

root [ / ]# yum install -y procps htop strace lsof iputils iproute nmap

root [ / ]# ps auxf
USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root      1179  0.0  0.0   4644  3852 pts/3    Ss   22:00   0:00 /bin/bash
root      1383  0.0  0.0   3484  1200 pts/3    R+   22:05   0:00  \_ ps auxf
root        61  0.0  0.0   1584     4 ?        Ss   21:19   0:00 tail -f /dev/null
root        55  0.3  0.5 759720 45944 ?        Ssl  21:19   0:10 /aib/packerInput/packer build -on-error=cleanup /aib/packerInput/packer_config.json
root       152  0.0  0.5 760236 46324 ?        Sl   21:20   0:01  \_ /aib/packerInput/packer build -on-error=cleanup /aib/packerInput/packer_config.json
root       172  0.0  0.6 751092 49112 ?        Sl   21:20   0:02      \_ /aib/packerInput/packer-plugin-azure start builder arm
root       183  0.0  0.5 759468 42984 ?        Sl   21:20   0:00      \_ /aib/packerInput/packer plugin packer-provisioner-file
root       192  0.0  0.5 759724 41052 ?        Sl   21:20   0:00      \_ /aib/packerInput/packer plugin packer-provisioner-powershell
root       201  0.0  0.5 759724 43532 ?        Sl   21:20   0:00      \_ /aib/packerInput/packer plugin packer-provisioner-powershell
root       211  0.0  0.2 1242992 19680 ?       Sl   21:20   0:00      \_ /aib/packerInput/packer-plugin-windows-update start provisioner -packer-default-plugin-name-
root       221  0.0  0.5 759724 43156 ?        Sl   21:20   0:00      \_ /aib/packerInput/packer plugin packer-provisioner-powershell
root         1  0.0  0.0   1024     4 ?        Ss   21:19   0:00 /pause

root [ / ]# lsof -i -n
COMMAND   PID USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
packer-pl 172 root    9u  IPv4  13349      0t0  TCP 10.0.0.4:58026->10.0.1.4:5986 (ESTABLISHED)

root [ / ]# nmap -Pn 10.0.1.4
Starting Nmap 7.93 ( https://nmap.org ) at 2024-03-12 22:17 UTC
Nmap scan report for pkrvm3a7x50zlx3.internal.cloudapp.net (10.0.1.4)
Host is up (0.0017s latency).
Not shown: 999 filtered tcp ports (no-response)
PORT     STATE SERVICE
3389/tcp open  ms-wbt-server

Nmap done: 1 IP address (1 host up) scanned in 8.22 seconds

ACI のシェルは Azure Portalの別のページに行くと接続が失われてコンテナ内に bash のプロセスが残留してしまうので、継続してなにか作業する気であれば最初に tmux などを動かしておくことをおすすめする。

コンテナの中の Packer の入力・出力は /aib/packerInput/aib/packerOutput ディレクトリに配置されている。 AIB によって生成された Packer への入力を直接確認するだけでなく、 tail -f /aib/packerOutput/packer.log で Packer のログ出力をリアルタイムに監視できるので、AIB のトラブルシューティングが格段に楽になった。

Isolated Image Builds ではない従来の AIB では、Packer プロセスはユーザーからは見えない Azure VM リソースで動作しており、その出力ログがストレージアカウントの append blob に追記されるだけだったので、動作状況の監視やトラブルシューティングがすこぶる面倒だった。そのために自分は昔 customazed という CLI ツールまで作っていたのだが、もうこれは必要なくなったようだ。

https://github.com/yaegashi/customazed

2024/03/13(水) 12:00 追記

なお、この記事を公開したあとに Azure から AIB の Isolated Image Builds への移行に関するお知らせのメールが送信されていた。

https://twitter.com/iejirok/status/1767741425675108599

改めて別の AIB のビルドを開始してみたところ、また ACI を使わない従来のビルドに戻っていた。未明に自分が ACI ビルドを引き当てたのはたまたま運がよかっただけらしい。

Discussion