name: bicep-what-if-analysis description: Bicep/azd デプロイ前の what-if 分析。「差分確認」「変更影響」「破壊的変更」「デプロイしたら何が変わる」「Bicep と実リソースの比較」を求める場合に使用。
Bicep What-If 分析
分析フロー(必須)
以下の手順に従う。スキップ不可。
Step 1: サマリー実行
./.github/skills/bicep-what-if-analysis/scripts/whatif-analyze.sh --summary
Step 2: 結果確認(すべて報告、優先順位なし)
重要: 以下のすべての項目を同等に扱う。特定の項目を優先的に確認しない。
| 確認項目 | 0件でも報告 | 詳細確認が必要 |
|---|---|---|
resourceDeletions | Yes | リソース削除がある場合 |
destructiveChanges | Yes | リソース再作成がある場合 |
changesWithDeletions | Yes | 必ず詳細確認(プロパティ削除) |
resourceCreations | Yes | リソース作成がある場合 |
modifiedResources | No(件数のみ) | - |
unsupported | Yes(必ず詳細説明) | 説明が必要 |
changesWithDeletions の重要性:
- Bicep定義と実リソースの乖離を示す
- リソース再作成なしでも影響大の可能性
- 1件でもあれば、必ず全プロパティを詳細確認
サポート外リソースの報告ルール:
- サマリーに件数を含める場合、必ず詳細説明を追加する
- 「サポート外 (分析対象外・問題なし)」のように安心材料を併記する
- 対象リソースと理由を具体的に説明する
- 「デプロイは正常に実行される」ことを明記する
Step 3: 詳細確認(プロセスベース)
changesWithDeletions が 1 件以上の場合、必須:
./.github/skills/bicep-what-if-analysis/scripts/whatif-analyze.sh
プロセスベースアプローチ(重要):
すべてのプロパティ削除に対して、以下のプロセスを一律に適用:
1. 削除されるプロパティを特定
- トップレベル: properties.xxx
- ネスト: properties.config.xxx
- 配列要素: properties.subnets[1].xxx
2. Bicep定義を確認(grep/viewツール)
- 定義あり → 次へ
- 定義なし → 🔴 乖離
3. ARMリファレンスで readOnly を確認
- readOnly: true → ✅ ノイズ
- readOnly: false → ⚠️ 実削除
- 不明 → ❓ 要調査
禁止事項:
- 特定のリソースタイプやプロパティだけを確認して終わらない
- 「重要そう」「起きやすそう」という事前判断をしない
potentiallyDestructive: falseのリソースをスキップしない- 大量の変更があっても流し読みしない
- 「たぶんノイズだろう」と推測しない
必須事項:
changesWithDeletionsに含まれる全リソースの全プロパティを列挙する- 各プロパティに上記プロセスを適用する
- 判定根拠を明示する(Bicep定義の有無、readOnlyの値)
- 判定に自信がない場合は「要確認」と報告する(ノイズと推測しない)
Step 4: 報告
- サマリー表(変更タイプ別件数)
- 注意が必要な変更の詳細
- 各変更の評価(ノイズ / 実際の変更 / 要確認)
- サポート外リソースの説明(件数が1件以上の場合)
- 推奨アクション
報告時の必須要素:
- サポート外リソースがある場合、「問題ではない」ことを明示
- 単に「サポート外: N件」だけを記載しない
- 不安を与えずに、正確な情報を伝える
スクリプトオプション
| オプション | 用途 |
|---|---|
--summary | サマリー(最初に実行) |
| (なし) | フィルタ済み全出力 |
--raw | Azure CLI 生出力 |
--template, --parameters | カスタム指定 |
重要な概念
プロパティ削除の意味
changesWithDeletions は 実リソースに存在する設定が Bicep に未定義 であることを示す。
- Bicep定義にないプロパティ → デプロイで削除される(乖離)
- Bicep定義にあるが読み取り専用 → デプロイしても適用されない(ノイズ)
リソース再作成を伴わなくても、セキュリティや可用性に影響する可能性がある。
プロセスベースアプローチ
チェックリストではなくプロセスで評価する:
- 特定のリソースタイプ(VNet, NSG等)のリストに依存しない
- 特定のプロパティ(tags, networkSecurityGroup等)の優先順位付けをしない
- すべてのプロパティ削除に同じプロセスを一律適用
- 未知のリソースや新しいAzureサービスにも対応可能
評価プロセス:
- Bicep定義を確認(定義の有無)
- ARM リファレンスで readOnly を確認
- 結果を報告(乖離 / ノイズ / 要調査)
ノイズ判定
スクリプトは明らかな読み取り専用プロパティ(provisioningState, etag 等)のみを自動フィルタする。
それ以外のプロパティは、上記のプロセスで評価する。
判定基準の詳細は references/noise.md を参照。
前提条件
azd env初期化済み- Azure CLI ログイン済み
- azd プロジェクトルートで実行
トラブルシューティング
| 問題 | 対処 |
|---|---|
| "AZURE_LOCATION is not set" | azd env refresh |
| 大量の変更 | --raw で生出力確認 |
| 特定リソース確認 | jq '.changes[] | select(.resourceType == "xxx")' |
Dependencies
az, azd, jq, python3