1
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

App Service の閉域化環境をBicepで自動構成 + アーキテクチャ図も自動生成

1
Posted at

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のアイコンを使って欲しいのですが、反映されていない。

image.png

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アイコンを組み込んで構成図を作ることができました。

architecture.png

動作確認

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 に任せたい」という方の参考になれば幸いです。

質問や感想、指摘事項などがあればコメントいただけると嬉しいです!

1
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?