ottijp blog

az deployment group what-if の偽陽性(ノイズ)を無視するツール

  • 2024-09-18

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コードで試してみます.

false-positive-example.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すると,以下のようになります.

command
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
output
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のコードは変更していないのに差分が表示されてしまいました. この偽陽性は以下のイシューに上げられています.

cf. Microsoft.Web/sites vs. Microsoft.Web/sites/config ‘web’ - localMySqlEnabled, netFrameworkVersion · Issue #376 · Azure/arm-template-whatif

ツールを使った場合の出力

作ったツールを使うと,以下のようになります.

output
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にも対応予定です.)

command
npm install -g az-deployment-denoise

無視したい変更を定義するルールをaz-deployment-denoise.jsonに定義してください.

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オプションを付けて実行し,出力をこのツールに渡してください.

command
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

ルールに使える条件等の詳細はリポジトリを参照してください.

cf. ottijp/az-deployment-denoise


ottijp
都内でアプリケーションエンジニアをしています
© 2024, ottijp