App Service の閉域化環境をBicepで自動構成 + アーキテクチャ図も自動生成
はじめに
Azure App Service から Storage Account に安全にアクセスしたい、という要件はよくあります。
VNet 統合 + Private Endpoint で閉域化された構成を手元に作ろうとしました。
欲張って、インフラは Bicep、構成図まで Claude Code に任せる という構成で実装してみました。
インフラの話よりも、構成図の自動生成でめちゃくちゃハマった話 がメインです。
Azure構成上のポイント
| 要素 | 役割 |
|---|---|
| VNet 統合 | App Service のアウトバウンド通信を VNet 経由にする |
| Private Endpoint | Storage Account への接続口をプライベートIPにする |
| Private DNS Zone |
*.blob.core.windows.net をプライベートIPに解決させる |
これにより、App Service → Storage の通信がすべて VNet 内で完結し、Storage はパブリックアクセス無効にできます。
Bicep で実装した
モジュール構成はこんな感じです。
main.bicep
modules/
├── vnet.bicep # VNet + 2 サブネット
├── appService.bicep # App Service Plan + App Service + 診断設定
├── storageAccount.bicep # Storage Account (public access disabled)
└── privateEndpoint.bicep # Private Endpoint + Private DNS Zone
Claude Code に Bicep MCP を使わせると、API バージョンの確認やプロパティのスキーマ取得を自動でやってくれて非常に楽でした。
注意: 東日本リージョンに作成を試みたところクォータ超過
az deployment sub create を実行したところ、こんなエラーが出ました。
SubscriptionIsOverQuotaForSku
Current Limit (Standard VMs): 0
Amount required for this deployment (Standard VMs): 1
App Service Plan の Standard SKU(S1)に対するクォータが 0 でした。
東日本(japaneast)→ 西日本(japanwest)にリージョンを変えて解決しました。
構成図も Claude Code に描かせた
Bicep が書けたので、構成図も同じく Claude Code に任せよう と思いました。
draw.io の MCP サーバーを使えばいけるはずと。。。
draw.io MCP のセットアップ
.mcp.json に以下を追加するだけです。
{
"mcpServers": {
"drawio": {
"command": "npx",
"args": ["@drawio/mcp"]
}
}
}
Claude Code から draw.io を操作できるようになります。「構成図を作って」と指示すると、XML を生成して draw.io で開いてくれます。
お試しで作成させた図
Azureのアイコンを使って欲しいのですが、反映されていない。
Azure 公式アイコンの利用
四苦八苦していたところ、
やまぱん!@aktsmm さんの記事を発見。
draw.io には Azure2 という公式アイコンライブラリが組み込まれており、
こちらの形式を利用すると良さそうだと判明しました。
アイコンパスの調査
draw.io のアイコンは img/lib/azure2/{カテゴリ}/{ファイル名}.svg という形式で管理されています。
欲しいアイコンがどのパスに存在するかを支持するため、draw.io の GitHub リポジトリを直接確認しました。
カテゴリ別にディレクトリが分かれていて、例えば:
| Azure リソース | パス |
|---|---|
| App Service | img/lib/azure2/compute/App_Services.svg |
| Virtual Network | img/lib/azure2/networking/Virtual_Networks.svg |
| Storage Account | img/lib/azure2/storage/Storage_Accounts.svg |
| Private Endpoint | img/lib/azure2/networking/Private_Endpoint.svg |
| App Service Plan | img/lib/azure2/app_services/App_Service_Plans.svg |
CLAUDE.md にルールを蓄積
CLAUDE.md(Claude Code がセッション開始時に読み込むルールファイル)に確認済みのパスとルールを書き溜めていきました。
また、確認済みのパスがなければ https://github.com/jgraph/drawio/tree/dev/src/main/webapp/img/lib/azure2/
から探すように指定。
## 確認済みアイコンパス
| App Service | img/lib/azure2/compute/App_Services.svg |
| Virtual Network | img/lib/azure2/networking/Virtual_Networks.svg |
...
これ以降は同じ失敗をしなくなり、作図が格段に速くなりました。
AI に作業させるときはルールを明文化して渡す、という当たり前のことを再確認しました。
Azureアイコンを組み込んだ図
図を直接調整することなどはしておらず、アイコンの位置調整が甘いですが、Azureアイコンを組み込んで構成図を作ることができました。
動作確認
Bicepデプロイ後、App Service のコンソールから以下を確認します。
nslookup stbiceplearndev.blob.core.windows.net
Name: stbiceplearndev.privatelink.blob.core.windows.net
Address: 10.0.2.4 ← プライベートIP!
Private DNS Zone が正しく機能し、VNet 内からはプライベートIPで解決されています。
Public Endpoint 経由ではなく、Private Endpoint 経由でアクセスできていることが確認できました。
環境の削除を忘れずに
App Service Plan(S1)は起動しているだけで課金が発生します。試し終わったらリソースグループごと削除してください。
az group delete --name rg-biceplearn-dev --yes
まとめ
| やったこと | 結果 |
|---|---|
| VNet 統合 + Private Endpoint で閉域化 | ✅ コンソールからプライベートIPへ解決 |
| Bicep でモジュール構成 | ✅ Bicep MCP でスキーマ確認しながら実装 |
| draw.io MCP で構成図自動生成 | ✅ ハマりながらも完成 |
インフラのコードは比較的スムーズでしたが、構成図の自動生成は想定より難しかったです。アイコンライブラリの仕様が AI の学習データに含まれていない部分があり、人間が調査してルールを与えないといけませんでした。
それでも一度ルールを整備してしまえば再現性が高く、次回からは構成図の生成コストが下がります。
「インフラもドキュメントも AI に任せたい」という方の参考になれば幸いです。
質問や感想、指摘事項などがあればコメントいただけると嬉しいです!

