しばやん雑記

Azure Serverless とメイドさんが大好きなフリーランスのプログラマーのブログ

Azure Pipelines の VMSS Preview を使って Ubuntu / Windows のスケーラブルな Agent を作成する

Build 2020 で Azure Pipelines の Self-hosted Agents に VMSS 版がプレビューとして追加されました。VMSS 版ということは柔軟なスケーリングが可能ということなので、選択肢としてはかなり有望です。

大規模なプロジェクトで CI / CD を行っていると、Agent がすぐに足りなくなってしまいがちですが、VMSS の特徴を生かして必要な時に必要なインスタンスを確保できます。

とはいえ基本的には Microsoft-hosted な Agents を使うことをお勧めしますが、Microsoft-hosted な Agents はインスタンスサイズが Standard_DS2_v2 なので明らかに足りない場合もあると思います。MLOps とかで GPU が必要なケースにも対応できません。

VMSS 版は管理が楽になっているのでインスタンスサイズ以外にも、VNET と Private Link でガチガチに塞がれた App Service などへのデプロイにも使えそうです。通常は Self-hosted Agent が必要になりますが、Agent のメンテナンスに手間を掛けたくないのが自然な発想です。

まずはドキュメントに従って Ubuntu の VMSS Agents を作成してみます。後で作る Windows の VMSS Agents と比較するために Azure CLI のコマンドを載せておきます。

az vmss create --name vmssagentspool --resource-group vmssagents --image UbuntuLTS \
               --vm-sku Standard_D2_v3 --storage-sku StandardSSD_LRS --authentication-type SSH \
               --instance-count 2 --disable-overprovision --upgrade-policy-mode manual --load-balancer ""

スケーリングやアップグレードは Azure Pipelines 側で管理するので、その辺りの設定はオフにします。オーバープロビジョニングやロードバランサーも不要です。インスタンス数の指定も要らないらしいですが、とりあえずドキュメント通りにします。

VMSS のデプロイは比較的早いですが、実際に内部の VM が立ち上がるまで少しかかりました。

f:id:shiba-yan:20200523021630p:plain

VMSS の作成が終われば、Azure DevOps の設定から VMSS Agent Pool を追加します。Service Connection の設定が微妙に分かりにくいですが、組織単位では Service Connection を持てないのでどれかプロジェクトを選ぶという形です。

とりあえず使う予定のプロジェクトを選んでおけば良いです。その後 VMSS を選べるようになります。

f:id:shiba-yan:20200523021410p:plain

Pool のオプションはデフォルトでも良いですが、インスタンスの最大と最小は課金に影響するので気を付けたい部分です。最小を 0 に設定すると必要な時にオンデマンドで VM が作成されるようになります。

Job 毎に常に新しいインスタンスを使うオプションもありますが、挙動が不安定な感じでした。起動コストをペイできるような Long-running かつ、セキュリティが要求される処理じゃないと使うのは難しいでしょう。

f:id:shiba-yan:20200523021417p:plain

VMSS Agent Pool を作成すると、自動的に VMSS が更新されて Azure Pipelines Agent がインストールされた VM が作成されます。最小インスタンス数を 0 にしても初回は 2 台作成されるようでした。

f:id:shiba-yan:20200523021431p:plain

インスタンスの作成が完了すると、Agent Pool から確認できるようになります。

f:id:shiba-yan:20200523021442p:plain

後は Pipeline で作成した Agent Pool を選択して実行すれば、作成した VMSS Agent 上で実行されます。VM での Self-hosted Agent のように自分で Agent をインストールする必要がないのでお手軽です。

f:id:shiba-yan:20200523021449p:plain

今回は最小インスタンス数を 0 にしているので、1 時間ぐらいアイドル状態が続くと自動でインスタンスが削除されました。スケールダウンにはアイドル状態が続く必要があるので、継続的に Job が実行される場合は 1 インスタンス以上が動き続けることになります。

f:id:shiba-yan:20200523021458p:plain

0 になってから Job を実行すると、Azure Pipelines によって自動的にインスタンスが作成されます。

f:id:shiba-yan:20200523022210p:plain

5 分毎のサンプリングらしいので、思ったようにスケールアウトしないこともあるようです。夜間には完全に 0 になることが多そうなので、全体的なコストは削減できるでしょう。

まだ Preview なので実装は変わりそうですが、オートスケールは時間のかかる処理向けという感じです。とはいえ全体的にはインスタンスの管理が不要になったので、かなり運用が楽になりました。

ドキュメントには Ubuntu 向けのコマンドは書いてありましたが、Windows 向けのコマンドは分かりにくい場所にあるので紹介しておきます。ついでに作成して試しておきます。

az vmss create --name vmssagentspool --resource-group vmssagents --image Win2019Datacenter \
               --vm-sku Standard_D2s_v3 --storage-sku Premiun_LRS \
               --admin-username agent --admin-password P@ssw0rd123446
               --instance-count 2 --disable-overprovision --upgrade-policy-mode manual --load-balancer ""

Ubuntu との違いはユーザー名とパスワードが追加になったぐらいです。Windows Server 2019 は Ubuntu と比べてストレージが遅いと困るので Premium Storage を使うようにしました。

同様に VMSS Agent Pool を作成すると、Windows 版の Agent が自動的に作成されます。

f:id:shiba-yan:20200523033734p:plain

Pipeline で作成した VMSS Agent Pool を指定すると、サクッと Job が実行されました。インスタンスが立ち上がっている場合は当然ながらすぐに実行されます。

f:id:shiba-yan:20200523033651p:plain

個人的には VM を直接使うの嫌いなのですが、VMSS であればいろいろと隠蔽されていて PaaS に近い形で使えるので割と好きです。

本来なら Spot VM を使って試そうと思ったのですが、従量課金や EA などのサブスクリプションが必要だったので作成すらできませんした。動くとは思いますが GA の時には正式サポートされてほしいです。