ほりひログ

所属組織の製品 (Azure とか) に関連する内容が多めだけど、個人の見解であって、所属組織を代表する公式情報ではないです。

Azure Portal Plusに俺得な機能を追加

いつものように、ニッチで俺だけ得する機能、今回はVMとBastionのリソースIDをまとめてコピーする機能を追加。

コピー結果は、

--ids <BastionのリソースID> --target-resource-id <VMのリソースID>

となり、これはaz network bastion rdp(or ssh or tunnel)コマンドのオプションに使える。

$ az network bastion rdp \ # または ssh / tunnel 
    --port ... \ # 他のオプション \
    --ids <BastionのリソースID> --target-resource-id <VMのリソースID>

learn.microsoft.com

デモ

最近Bastionを使うことが多くなり、VMとBastionのリソースIDを、一つずつコピーするが面倒だったので作ってみた。

使用上の注意

SKUがStandardPremium、かつ、ネイティブクライアントサポートが有効になっているBastionが、VMと同じVNET(か、そのピアリング先のVNET)にある時だけメニューを表示するようにしている。
なので、メニューが出ない時はまずVMにそういうBastionがあるのかを確認すること。

あと、セッションストレージに保存されているトークンが有効切れになってるとAPIコールに失敗する。

開発裏話

VMのリソースIDから、そのVMにつなげられるBastionを取るのが大変だった。

あるVMにアクセスできるBastionリソースを特定し、リソースIDをコピーするためには、

  1. VMからNICを取得
  2. NICからVNETを取得
  3. VNETからピアリング先のVNETも取得
  4. 取得したVNETとそれのピアリング先VNETにぶら下がっているBastionを取得

と割といろんなことをしないといけないけど、その度にリソースのAPIを一つ一つ叩くのもコストがよくない。

Azureポータルでは、Azure Resource Graphを使ってBastionの有無をチェックしていたので、「これを流用したらほぼ作るものないのでは?」と踏んで実装を開始。

ところが、Azureポータルが使っているものは、VNETのリソースIDを起点にしたクエリーになっていた。
VMリソースはVNETリソースの情報を直接はもっていなく、一度NICを経由しないと取れないので、別途APIを叩くなりして取ってこないとないといけない。

あとAzure Resource Graphで変数定義のletやサブクエリーが使えなかった*1

格闘の結果、結局自前で作ったKustoクエリーがコチラ

GitHub Copilotに最適化もお願いしたけど、BastionのリソースIDの取得結果自体が変わっちゃって、あまり信用ならんかった。
とりあえず自前クエリーのままでリリース。

chromewebstore.google.com

お試しあれ。

*1:Kustoのサブセット、という位置づけらしい