# Bicep What If Analysis

> Bicep/azd デプロイ前の what-if 分析。「差分確認」「変更影響」「破壊的変更」「デプロイしたら何が変わる」「Bicep と実リソースの比較」を求める場合に使用。

- Skill: `majiayu000/bicep-what-if-analysis` (Agent Skill, multi-file: 2 files)
- Install (CLI): `npx skillmds add majiayu000/bicep-what-if-analysis`
- Raw SKILL.md: https://api.skillmd.com/api/skills/majiayu000/bicep-what-if-analysis/raw
- Safety review: pending
- Works with: Claude Code, Claude.ai, OpenAI Codex
- Category: Coding & Dev Tools
- Author: majiayu000 (https://skillmd.com/u/majiayu000)
- Updated: 2026-09-09
- Page: https://skillmd.com/skills/majiayu000/bicep-what-if-analysis

---


# Bicep What-If 分析

## 分析フロー（必須）

以下の手順に従う。スキップ不可。

### Step 1: サマリー実行

```bash
./.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 件以上の場合、**必須**：

```bash
./.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. サマリー表（変更タイプ別件数）
2. 注意が必要な変更の詳細
3. 各変更の評価（ノイズ / 実際の変更 / 要確認）
4. サポート外リソースの説明（件数が1件以上の場合）
5. 推奨アクション

**報告時の必須要素**:
- サポート外リソースがある場合、「問題ではない」ことを明示
- 単に「サポート外: N件」だけを記載しない
- 不安を与えずに、正確な情報を伝える

## スクリプトオプション

| オプション | 用途 |
|-----------|------|
| `--summary` | サマリー（最初に実行） |
| (なし) | フィルタ済み全出力 |
| `--raw` | Azure CLI 生出力 |
| `--template`, `--parameters` | カスタム指定 |

## 重要な概念

### プロパティ削除の意味

`changesWithDeletions` は **実リソースに存在する設定が Bicep に未定義** であることを示す。

- Bicep定義にないプロパティ → デプロイで削除される（**乖離**）
- Bicep定義にあるが読み取り専用 → デプロイしても適用されない（**ノイズ**）

リソース再作成を伴わなくても、セキュリティや可用性に影響する可能性がある。

### プロセスベースアプローチ

**チェックリストではなくプロセス**で評価する：

- 特定のリソースタイプ（VNet, NSG等）のリストに依存しない
- 特定のプロパティ（tags, networkSecurityGroup等）の優先順位付けをしない
- すべてのプロパティ削除に同じプロセスを一律適用
- 未知のリソースや新しいAzureサービスにも対応可能

評価プロセス:
1. Bicep定義を確認（定義の有無）
2. ARM リファレンスで readOnly を確認
3. 結果を報告（乖離 / ノイズ / 要調査）

### ノイズ判定

スクリプトは**明らかな読み取り専用プロパティ**（`provisioningState`, `etag` 等）のみを自動フィルタする。
それ以外のプロパティは、上記のプロセスで評価する。

判定基準の詳細は [references/noise.md](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

