Azure Pipelines で VMSS agents も便利だよ、という話

VMSS agents (Azure virtual machine scale set agents) を使うことで Microsoft-hosted agents では難しい Private Link や NSG の制限などから解放することが可能です。 Self-hosted agents でも同じようなことは可能なのですが、 VMSS agents のほうがコストが抑えられたり、 Agent のメンテナンスから解放されるようになるといったメリットがあります。
この記事では VMSS agents の作り方と、実際に実行してみた結果どうなるか、という部分を記載しています。

## ざっくり三つの種類のエージェント比較

現在のエージェントの種類はざっくり分けて三つの種類のエージェントがあり、ざっくり表分けするとこんな感じです。

| 種類 | 様々な状況に対応 | 価格の安さ | 運用の楽さ | 手軽さ |
| --- | --- | --- | --- |--- |
| Microsoft-hosted agents | △ | ◎ | ◎ | ◎ |
| Self-hosted agents | 〇 | △ | △ | 〇 |
| VMSS agents | ◎ | 〇 | 〇 | 〇 |

## VMSS agents の作成

公式ドキュメントの手順通り進めていけば特に問題なく作成できるかと思います。 VMSS を検討する例なども載っているので、ぜひ見てほしいです。

[Azure 仮想マシン スケール セット エージェント - Azure Pipelines | Microsoft Docs](https://docs.microsoft.com/ja-jp/azure/devops/pipelines/agents/scale-set-agents?view=azure-devops)

途中 DevOps 側の操作で Agent pool を追加するときは "Number of agents to keep on standby" を 0 に設定することで、 Pipelines を動かしてないときに全ての仮想マシンを停止させることが可能です。

[![Image from Gyazo](https://i.gyazo.com/94714e6d349fc1d0c0da71567b50c519.png)](https://gyazo.com/94714e6d349fc1d0c0da71567b50c519)

## Pipeline の実行

実際にテンプレートで作られる YAML を使って pool だけ変更したものを動かしてみます。

```yaml
trigger:
- main

pool: vmss-linux

steps:
- script: echo Hello, world!
  displayName: 'Run a one-line script'

- script: |
    echo Add other tasks to build, test, and deploy your project.
    echo See https://aka.ms/yaml
  displayName: 'Run a multi-line script'
```

[![Image from Gyazo](https://i.gyazo.com/c60f014280120cc81cac3de8db1a670b.png)](https://gyazo.com/c60f014280120cc81cac3de8db1a670b)

Pipeline の実行画面から正常に実行されることを確認しました。
ただ初回実行時は仮想マシンの起動に失敗したので、一度キューをキャンセルしてから実行することで正常に実行されました。

また、 Project Settings > Agent pools メニューの Diagnostics タブから起動に失敗したなどの情報が得ることが可能です。
今回は "Delay in minutes before deleting excess idle agents" の設定を 10 にしていたので、 Pipeline を実行して 1 つ仮想マシンが立ち上がり、 10 分後に仮想マシンが 0 個になっていることも確認できます。

[![Image from Gyazo](https://i.gyazo.com/f310df4bd02e826a9d0e9340f9255af9.png)](https://gyazo.com/f310df4bd02e826a9d0e9340f9255af9)

[![Image from Gyazo](https://i.gyazo.com/b408bfedae49209a19c2b6e6a7a3508c.png)](https://gyazo.com/b408bfedae49209a19c2b6e6a7a3508c)

Azure で VMSS の状態を確認すると、同じ状態になっていることも確認できます。

[![Image from Gyazo](https://i.gyazo.com/c46f237d8b2c57350fcae53cf4982610.png)](https://gyazo.com/c46f237d8b2c57350fcae53cf4982610)

[![Image from Gyazo](https://i.gyazo.com/8841c238d2bca3040152557b293b668b.png)](https://gyazo.com/8841c238d2bca3040152557b293b668b)

## その他

### 仮想マシンの起動時間

仮想マシンが 0 の状態から Pipeline を実行して、仮想マシンが立ち上がるまでの時間を Job の Wait time で確認したところ、今回の UbuntuLTS イメージでは 16 秒でした。

[![Image from Gyazo](https://i.gyazo.com/972d82d026bf4d2b26ec7b687d01a1df.png)](https://gyazo.com/972d82d026bf4d2b26ec7b687d01a1df)

### ビルド用に用意された便利な Microsoft-hosted agents のイメージファイルを使いたい

VMSS に Microsoft-hosted agents のイメージファイルを直接使用することは出来ませんが、公式ドキュメントに書いてある通りイメージファイルを作成するためのスクリプトはオープンソースなので、 VMSS で Microsoft-hosted agent と似たような仮想マシンを使いたい場合は参考にしてカスタムイメージを作る必要があります。

[Azure 仮想マシン スケール セット エージェント - Azure Pipelines | Microsoft Docs](https://docs.microsoft.com/ja-jp/azure/devops/pipelines/agents/scale-set-agents?view=azure-devops#where-can-i-find-the-images-used-for-microsoft-hosted-agents)