いつものように、ニッチで俺だけ得する機能、今回は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>
デモ
最近Bastionを使うことが多くなり、VMとBastionのリソースIDを、一つずつコピーするが面倒だったので作ってみた。
使用上の注意
SKUがStandardかPremium、かつ、ネイティブクライアントサポートが有効になっているBastionが、VMと同じVNET(か、そのピアリング先のVNET)にある時だけメニューを表示するようにしている。
なので、メニューが出ない時はまずVMにそういうBastionがあるのかを確認すること。
あと、セッションストレージに保存されているトークンが有効切れになってるとAPIコールに失敗する。
開発裏話
VMのリソースIDから、そのVMにつなげられるBastionを取るのが大変だった。
あるVMにアクセスできるBastionリソースを特定し、リソースIDをコピーするためには、
と割といろんなことをしないといけないけど、その度にリソースのAPIを一つ一つ叩くのもコストがよくない。
Azureポータルでは、Azure Resource Graphを使ってBastionの有無をチェックしていたので、「これを流用したらほぼ作るものないのでは?」と踏んで実装を開始。
ところが、Azureポータルが使っているものは、VNETのリソースIDを起点にしたクエリーになっていた。
VMリソースはVNETリソースの情報を直接はもっていなく、一度NICを経由しないと取れないので、別途APIを叩くなりして取ってこないとないといけない。
あとAzure Resource Graphで変数定義のletやサブクエリーが使えなかった*1。
格闘の結果、結局自前で作ったKustoクエリーがコチラ。
GitHub Copilotに最適化もお願いしたけど、BastionのリソースIDの取得結果自体が変わっちゃって、あまり信用ならんかった。
とりあえず自前クエリーのままでリリース。
お試しあれ。
*1:Kustoのサブセット、という位置づけらしい