az deployment group what-if の偽陽性(ノイズ)を無視するツール
ARMやBicepを使ってAzureのリソースをデプロイする際に利用するaz deployment group what-if
コマンドの偽陽性(ノイズ)を無視するツールを作りました.
cf. ottijp/az-deployment-denoise
TL;DR
- ARMやBicepによるAzureリソースのデプロイ時に使う
what-if
には偽陽性が存在する. - 無視して良い変更を定義して差分を表示させないツール
az-deployment-denoise
を作った.
モチベーション
既存のAzureリソースを含めてBicepでデプロイすることで,コードを正としてインフラを管理(IaC)したいと考えています.
その際,az deployment group what-if
を利用すると,実際に差分が無いにも関わらず差分があると表示されることがあります(偽陽性,ノイズ).
変更していないはずのリソースに差分があると表示されると,そのままデプロイすることに不安があります.
その差分が偽陽性である(実際にはaz deployment group create
しても冪等である)ことが事前にわかっている場合は無視したいので,
ルールベースで差分を無視するためのツールを作りました.
ちなみに,偽陽性がある場合は公式のリポジトリのイシューに投稿するのが正しい対応です. イシューが解決されるまでの暫定措置としてツールを使うことを想定してます.
az deployment group what-if の偽陽性(ノイズ)の例
az deployment group what-if
(スコープによってgroupがtenant/sub/mgだったりします)の出力は,冒頭に書いてあるように偽陽性(ノイズ)を含むことがあります.
Note: The result may contain false positive predictions (noise). You can help us improve the accuracy of the result by opening an issue here: https://aka.ms/WhatIfIssues
偽陽性の例を,以下のようなAzure App ServiceプランとAzure Functionsを定義しているBicepコードで試してみます.
param location string = resourceGroup().location
param functionAppName string
param appServicePlanName string
resource appServicePlan 'Microsoft.Web/serverfarms@2022-09-01' = {
name: appServicePlanName
location: location
sku: {
name: 'B1'
}
kind: 'FunctionApp'
}
resource functionApp 'Microsoft.Web/sites@2022-09-01' = {
name: functionAppName
location: location
kind: 'functionapp'
properties: {
serverFarmId: appServicePlan.id
siteConfig: {
appSettings: [
{
name: 'FUNCTIONS_EXTENSION_VERSION'
value: '~4'
}
{
name: 'FUNCTIONS_WORKER_RUNTIME'
value: 'node'
}
]
}
}
}
これを一度デプロイした直後にwhat-ifすると,以下のようになります.
az deployment group create --template-file false-positive-example.bicep --name test-deployment --resource-group test-rg --parameters functionAppName=test-func-denoise appServicePlanName=test-plan
az deployment group what-if --template-file false-positive-example.bicep --name test-deployment --resource-group test-rg --parameters functionAppName=test-func-denoise appServicePlanName=test-plan
Note: The result may contain false positive predictions (noise).
You can help us improve the accuracy of the result by opening an issue here: https://aka.ms/WhatIfIssues
Resource and property changes are indicated with these symbols:
+ Create
~ Modify
= Nochange
The deployment will update the following scope:
Scope: /subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/test-rg
~ Microsoft.Web/sites/test-func-denoise [2022-09-01]
+ properties.siteConfig.localMySqlEnabled: false
+ properties.siteConfig.netFrameworkVersion: "v4.6"
= Microsoft.Web/serverfarms/test-plan [2022-09-01]
Resource changes: 1 to modify, 1 no change.
Bicepのコードは変更していないのに差分が表示されてしまいました. この偽陽性は以下のイシューに上げられています.
ツールを使った場合の出力
作ったツールを使うと,以下のようになります.
Note: The result may contain false positive predictions (noise).
You can help us improve the accuracy of the result by opening an issue here: https://aka.ms/WhatIfIssues
This result has been filtered using az-deployment-denoise: https://github.com/ottijp/az-deployment-denoise
Resource and property changes are indicated with these symbols:
= Nochange
The deployment will update the following scope:
Scope: /subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/test-rg
= Microsoft.Web/serverfarms/test-plan [2022-09-01]
= Microsoft.Web/sites/test-func-denoise [2022-09-01]
Resource changes: 2 no change.
Azure Functionsの以下の差分が無視されるようになりました.
properties.siteConfig.localMySqlEnabled: false
properties.siteConfig.netFrameworkVersion: "v4.6"
ツールの使い方
npmコマンドでインストールしてください.(そのうちdockerにも対応予定です.)
npm install -g az-deployment-denoise
無視したい変更を定義するルールをaz-deployment-denoise.json
に定義してください.
{
"rules": [
{
"providerNamespace": "Microsoft.Web",
"resourceType": "sites",
"propertyPath": "properties.siteConfig.localMySqlEnabled"
},
{
"providerNamespace": "Microsoft.Web",
"resourceType": "sites",
"propertyPath": "properties.siteConfig.netFrameworkVersion"
}
]
}
そして,az deployment group what-if
に--no-pretty-print
オプションを付けて実行し,出力をこのツールに渡してください.
az deployment group what-if --template-file false-positive-example.bicep --name test-deployment --resource-group test-rg --parameters functionAppName=test-func-denoise appServicePlanName=test-plan | az-deployment-denoise
ルールに使える条件等の詳細はリポジトリを参照してください.