これはMicrosoft Azure Advent Calendar 2024の8日目の記事です。
Bicepを書いて作るリソースの名前を設定する時、馴染みのないリソースがあると「このリソースの省略形、何だっけ???」となり↓を検索して調べる、というのを繰り返している。
割と面倒くさい。
調べるのも大変だし、このリソースの省略形は、リソース名の命名規約に入ることも多いので、規約に従ったリソース名を付けているか、世の現場ではどうチェックしているのかが気になる。
Azure Policyを使えば、リソースをデプロイする時に name に指定の文字列が含まれているかどうかのチェックはできる。
けど正規表現みたいにパターンでチェック、みたいのはできなかったはず*1。
Bicepでリソース名のチェックについて調べてみたけど、解決策どころか困っている声も見当たらなかった。
うーん、自分以外は誰も困ってないのかもしれない。。。*2
けど、自分は今困っているので何とかしてみようと思った。
何とかしてみる。
textlintを使ってリソース名チェックをしてみた。
textlintは、テキストファイル/HTML/Markdownをメインに、ファイル中の構文等をチェックできるLinterツールで、さらにカスタムの構文解析プラグインとカスタムのチェックルールを追加することができる。
ただtextlintの標準機能だけでは name
の値をチェックすることはできないので、今回はBicepの構文を解析するtextlintプラグインと、リソース名をチェックするtextlintルール、この2つを作ってtextlintにBicep内のリソース名チェックをさせてみることにした。
npmにも登録済み*3。
正直なところ、textlintでBicepみたいな構文がカッチリ決まったDSLをチェックすることは想定外かもしれないけど、他にやり方が思いつかなかったので。
使ってみる。
まずは環境構築から。
最初にtextlintを入れる。
今回はtextlintを使うのでこれは必須。この種の開発/補助ツールは、大抵対象のプロジェクト専用のものとして入れるのが習わしなので、
--save-dev
を付けてインストールする。$ npm install --save-dev textlint
次に textlint 用のカスタムルール
@horihiro/textlint-rule-azure-naming-convention
とカスタムプラグイン@horihiro/textlint-plugin-bicep
を入れる。入れる場所は textlintのインストールに合わせるので
--save-dev
を付けてインストール。$ npm install --save-dev @horihiro/textlint-rule-azure-naming-convention @horihiro/textlint-plugin-bicep
最後に設定ファイルを作る。
これはtextlintコマンド(--save-dev
で入れたのでnpx
で実行)に--init
オプションを付けると作れる。$ npx textlint --init
設定ファイル
.textlintrc.json
ができているはず。
プラグインとルールがインストールされていれば、それぞれ↓のように "plugins
"と "rules
に設定されているはず。{ "plugins": { "@horihiro/bicep": true }, "filters": {}, "rules": { "@horihiro/azure-naming-convention": true } }
環境構築は以上で完了。
環境構築が終わったら、実際にBicepファイルで試してみる。
試してみるにはBicepが必要なので、GitHub Copilotに作ってもらった。
AKSクラスターリソースであることに特に意味はなし。
resource aksCluster 'Microsoft.ContainerService/managedClusters@2022-09-01' = {name:'myAKSCluster'location:'japaneast'sku:{name:'Basic'tier:'Free'}properties:{ (以下略)
チェックするリソース名の箇所はname: 'myAKSCluster'
と書かれている。
このBicepを対象にしてtextlintコマンド npx textlint sample.bicep
を実行してみると、
/PATH/TO/sample.bicep 2:10 error [Naming violation] The name for 'microsoft.containerservice/managedclusters' should match by the pattern '^aks-' @horihiro/textlint-rule-azure-naming-convention
✖ 1 problem (1 error, 0 warnings)
インストールしたカスタムルールには、既定でリソース名が{リソースの省略形}-
で始まるパターンをチェックするルールが設定されていて、AKSクラスターの省略形は aks
なので、aks-...
というリソース名かどうかをチェックする。
myAKSCluster
はそうではないのでエラーが出てる。
リソース名を aks-...
に変えればこのエラーは出なくなる。
チェックパターンを変える。
このカスタムルールの既定のパターンは、リソースの省略形が接頭辞として使われることを決め打ちで作ったので、命名規則上別のパターンが必要な場合は設定ファイル .textlintrc.jsonをいじる。
例えば、名前のどこでもいいから「AKS」という文字が含まれていれば問題なしとするなら(ありえないけど)、
{"plugins": {"@horihiro/bicep": true}, "filters": {}, "rules": {"@horihiro/azure-naming-convention": {"patterns": {"microsoft.containerservice/managedclusters": "^.*AKS.*$" }}}}
等と書く。
さっきのBicepの例だと、リソース名myAKSCluster
はこのパターンにマッチしているので、textlintコマンドを同じように実行してもエラーは出なくなる。
VSCodeから使ってみる。
VSCode用拡張 vscode-textlint を使えば、VSCodeでBicepファイルを開いた状態でリアルタイムにリソース名チェックの結果確認できる*4。
これはお好みで。
vscode-textlint も使ってVSCode上でリソース名チェック&修正している様子はコチラ。
# 全画面にしないとわけがわからないけど。
アドベントカレンダー用のネタに困ったので、昔途中で投げ出した、リソース名規約(ほぼ接頭辞のみ)チェック用textlintルールに再挑戦中。VSCodeで動かすとCopilotが直してくれる。 pic.twitter.com/yJvAWDLSQX
— ほりひろ (@hori__hiro) 2024年11月30日
動画内の VSCodeのエディター部分ではBicepファイルを開いていて、その中でApp Service リソース(microsoft.web/sites
)が書かれている。
VSCode下部の PROBLEMS
タブには「リソース名がパターン ^app-
に沿ってないぞ」というエラー表示。
エラーメッセージが示すエラー箇所(3行目の10文字目)は赤の波下線で強調されていて、実際に name
が web-
から始まっているので、エラーメッセージ通りなのがわかる。
という感じで、vscode-textlintと組み合わせれば、VSCodeでBicepを書いている最中に命名規則から外れてることに気づくことができる。
後半は Quick Fix
から Fix using Copilot
とやると、GitHub Copilot がエラーメッセージを理解してリソース名を app-...
に修正してエラーが消えてる様子。
この部分は「Copilotって便利だね」っていう別の話。
正直後半の方が映える。
〆
「またつまらぬものを作ってしまった」
以上。