設定ガイド
Azure Container Apps 上でマルチテナントアプリケーションをデプロイするための設定方法を説明します。
カバーする内容: テナント設定ファイル(config.toml)のスキーマとバリデーション、Azure Container Registry (ACR) の設定方法、GitHub リポジトリの統合設定
config.toml スキーマ
主な機能
- ✅ 統一スキーマ: すべてのテンプレートで一貫した config.toml 形式
- ✅ 型安全: Zod による実行時バリデーションと TypeScript 型推論
- ✅ 自動バリデーション:
generate、plan、applyコマンド実行時に自動検証 - ✅ テンプレートベース:
frontend-backend(分離構成)とmonolith(統合構成)をサポート - ✅ 環境別設定: dev/staging/prd ごとに異なるリソース設定が可能
サポートされているテンプレート
| テンプレート | 必須コンポーネント | 説明 |
|---|---|---|
frontend-backend | frontend, backend, database | フロントエンド + バックエンド + データベース |
monolith | frontend, database, redis | モノリシック構成(Next.js + DB + Redis) |
設定ファイル構造
基本情報
name = "tenant-name" # テナント識別子(小文字、ハイフン可)
display_name = "Tenant Display Name" # 表示名
template = "frontend-backend" # テンプレートタイプ(frontend-backend, monolith)
template_version = "v1.0.0" # テンプレートバージョン(vX.Y.Z形式)
enabled = true # テナントの有効/無効
環境設定
["environments.dev"]
enabled = true
location = "japaneast" # Azureリージョン
["environments.dev.frontend"]
image_name = "myapp-frontend"
image_tag = "latest"
min_replicas = 1
max_replicas = 3
cpu = 1.0 # CPU コア数(オプション)
memory = 2 # メモリ GB(オプション)
port = 3000 # コンテナポート(オプション)
custom_domain_name = "app.example.com" # カスタムドメイン(オプション)
["environments.dev.backend"]
image_name = "myapp-backend"
image_tag = "latest"
min_replicas = 1
max_replicas = 3
# フロントエンドとオフィスIPのみ許可(推奨)
allowed_ip_ranges = ["10.0.0.0/18", "123.253.154.201/32", "150.195.212.125/32", "216.205.126.58/32"]
["environments.dev.database"]
storage_mb = 32_768 # 32GB(最小: 20GB)
sku_name = "B_Standard_B1ms" # Azure Database SKU
オプションコンポーネント
Redis
["environments.dev.redis"]
enabled = true
sku_name = "Basic" # Basic, Standard, Premium
family = "C" # C (Basic/Standard), P (Premium)
capacity = 0 # 0-6 for C family, 1-5 for P family
Storage
["environments.dev.storage"]
enable_storage = true
# マルチコンポーネント用(frontend-backendテンプレート)
frontend_file_share_name = "frontend-data"
frontend_file_share_quota = 50 # GB
backend_file_share_name = "backend-data"
backend_file_share_quota = 50
frontend_blob_container_name = "frontend-blob"
backend_blob_container_name = "backend-blob"
# シングルコンポーネント用(monolithテンプレート)
file_share_name = "app-data"
file_share_quota = 100 # GB
フィールド仕様
コンテナ設定(Frontend/Backend)
| フィールド | 型 | 必須 | 検証ルール | デフォルト |
|---|---|---|---|---|
image_name | string | ✅ | 1 文字以上 | - |
image_tag | string | - | - | "latest" |
min_replicas | number | - | 0 以上の整数 | 1 |
max_replicas | number | - | 1 以上の整数 | 3 |
cpu | number | - | 正の数 | - |
memory | number | - | 正の数 | - |
port | number | - | 1-65535 | - |
runtime | string | - | "node"/"python" | frontend: "node"backend: "python" |
allowed_ip_ranges | list(string) | - | CIDR 形式 | オフィス IP + 10.0.0.0/18 |
custom_domain_name | string | - | - | - |
custom_domain_certificate_name | string | - | - | - |
acr_subscription | string | - | UUID 形式 | - |
acr_name | string | - | - | - |
repository | string | - | Org/repo 形式 | - |
root_directory | string | - | - | "" |
追加検証: min_replicas ≤ max_replicas
runtime について: コンテナのランタイム環境を指定します。DATABASE_URL 環境変数の形式に影響します。"node" は mysql://... 形式、"python" は mysql+pymysql://... 形式。デフォルト値は frontend が "node"、backend が "python" です。
IP 制限について: allowed_ip_ranges は主にバックエンドの外部公開時に使用されます。CIDR 表記で許可する IP レンジを指定します。
⚠️ 重要: IP 制限の動作(ホワイトリスト方式)
Azure Container Apps の IP 制限はホワイトリスト方式です。IP アドレスを指定した場合、指定された IP アドレスのみがアクセス可能。空の配列 [] を指定した場合、すべての IP アドレスからアクセス拒否(バックエンドが完全にアクセス不可能)。指定しない場合、デフォルト値が適用されます(10.0.0.0/18 + オフィス IP)。
データベース設定
| フィールド | 型 | 必須 | 検証ルール |
|---|---|---|---|
storage_mb | number | ✅ | 20,480〜16,777,216(20GB〜16TB) |
sku_name | string | ✅ | Azure Database SKU 形式 |
SKU 名の形式: (B|GP|MO)_Standard_{SKU_CODE}
Redis 設定
| フィールド | 型 | 必須 | 検証ルール | デフォルト |
|---|---|---|---|---|
enabled | boolean | - | - | true |
sku_name | enum | - | Basic, Standard, Premium | "Basic" |
family | enum | - | C, P | "C" |
capacity | number | - | 0-6(C), 1-5(P) | 0 |
追加検証: Premium family(P)の場合、capacity は 1〜5
Storage 設定
| フィールド | 型 | 必須 | 検証ルール | デフォルト |
|---|---|---|---|---|
enable_storage | boolean | - | - | false |
frontend_file_share_name | string | - | - | - |
frontend_file_share_quota | number | - | 1-102400 (GB) | - |
backend_file_share_name | string | - | - | - |
backend_file_share_quota | number | - | 1-102400 (GB) | - |
file_share_name | string | - | - | - |
file_share_quota | number | - | 1-102400 (GB) | - |
frontend_blob_container_name | string | - | - | - |
backend_blob_container_name | string | - | - | - |
追加検証: enable_storage が true の場合、少なくとも 1 つのファイル共有名が必要
使い分け:
frontend_file_share_*/backend_file_share_*:frontend-backendテンプレート用file_share_*:monolithテンプレート用(単一コンポーネント)
設定例
最小限の設定(frontend-backend)
name = "my-app"
display_name = "My App"
template = "frontend-backend"
template_version = "v1.0.0"
enabled = true
["environments.dev"]
enabled = true
location = "japaneast"
["environments.dev.frontend"]
image_name = "my-app-frontend"
image_tag = "latest"
min_replicas = 1
max_replicas = 3
["environments.dev.backend"]
image_name = "my-app-backend"
image_tag = "latest"
min_replicas = 1
max_replicas = 3
runtime = "python" # "node" または "python" (DATABASE_URLの形式に影響)
["environments.dev.database"]
storage_mb = 32_768
sku_name = "B_Standard_B1ms"
フル機能の設定(monolith + カスタムドメイン + ストレージ)
name = "code-agent"
display_name = "Code Agent"
template = "monolith"
template_version = "v1.0.0"
enabled = true
["environments.dev"]
enabled = true
location = "japaneast"
["environments.dev.frontend"]
image_name = "code-agent-nextjs"
image_tag = "latest"
min_replicas = 1
max_replicas = 3
cpu = 2.0
memory = 4
runtime = "node" # "node" または "python"
custom_domain_name = "coding.gx-dev.app"
["environments.dev.database"]
storage_mb = 32_768
sku_name = "B_Standard_B1ms"
["environments.dev.storage"]
enable_storage = true
file_share_name = "code-agent-data"
file_share_quota = 100
["environments.dev.redis"]
enabled = true
sku_name = "Basic"
family = "C"
capacity = 0
["environments.prd"]
enabled = true
location = "japaneast"
["environments.prd.frontend"]
image_name = "code-agent-nextjs"
image_tag = "latest"
min_replicas = 2
max_replicas = 5
["environments.prd.database"]
storage_mb = 102_400
sku_name = "B_Standard_B2s"
["environments.prd.storage"]
enable_storage = true
file_share_name = "code-agent-data"
file_share_quota = 200
["environments.prd.redis"]
enabled = true
sku_name = "Standard"
family = "C"
capacity = 1
ACR とリポジトリを含む完全な設定例
name = "pj-japan"
display_name = "Pj Japan"
template = "frontend-backend"
template_version = "v1.0.0"
enabled = true
["environments.dev"]
enabled = true
location = "japaneast"
["environments.dev.frontend"]
acr_subscription = "e3143cb2-4707-4614-bbba-3ddeb66669c2"
acr_name = "gxSharedAcr"
image_name = "pj-japan-nextjs"
image_tag = "latest"
min_replicas = 1
max_replicas = 3
cpu = 1
memory = 2
port = 3_000
repository = "GenerativeX/pj-japan-nextjs"
root_directory = ""
["environments.dev.backend"]
acr_subscription = "e3143cb2-4707-4614-bbba-3ddeb66669c2"
acr_name = "gxSharedAcr"
image_name = "pj-japan-fastapi"
image_tag = "latest"
min_replicas = 1
max_replicas = 3
cpu = 1
memory = 2
port = 8_000
runtime = "python" # "node" または "python"
# フロントエンド(Container Apps Environment)とオフィスIPからのアクセスを許可
allowed_ip_ranges = ["10.0.0.0/18", "123.253.154.201/32", "150.195.212.125/32", "216.205.126.58/32"]
repository = "GenerativeX/pj-japan-fastapi"
root_directory = ""
["environments.dev.database"]
storage_mb = 32_768
sku_name = "B_Standard_B1ms"
テンプレート別の詳細ガイド
frontend-backend テンプレート
用途: フロントエンドとバックエンドが分離されたアプリケーション
必須コンポーネント: frontend, backend, database
オプション: redis, storage, custom_domain_name, allowed_ip_ranges
特徴: Backend は External Ingress(IP 制限付きで外部公開)、IP 制限により特定の IP レンジからのみアクセス可能、地理的分散のため異なる ACR を使用可能
セキュリティ設定: infra init 実行時、バックエンドにはデフォルト IP 制限が自動適用されます(10.0.0.0/18 + オフィス IP)。Container Apps Environment の CIDR は、デプロイ先のリージョンに応じて設定(Japan East: 10.0.0.0/18、East US: 10.1.0.0/18)。
monolith テンプレート
用途: フロントエンドとバックエンドが統合されたモノリシックアプリケーション
必須コンポーネント: frontend, database, redis
オプション: storage, custom_domain_name
特徴: Redis が必須(セッション管理やキャッシュに使用)、backend コンポーネントは不要、File Share は単一の file_share_name を使用
ACR (Azure Container Registry) 設定
config.toml で、frontend と backend のそれぞれについて、使用する Azure Container Registry (ACR) を選択し、イメージ名をカスタマイズできます。
ACR 設定項目
acr_subscription: ACR が存在する Azure サブスクリプション ID(例:e3143cb2-4707-4614-bbba-3ddeb66669c2)acr_name: 使用する Azure Container Registry の名前(例:gxSharedAcr(Japan East),gxSharedAcrUs(East US))image_name: Docker イメージの名前(リポジトリ名から自動生成されますが、カスタマイズも可能)
利用可能な ACR
本番環境 - Japan East
- 名前:
gxSharedAcr - サブスクリプション:
gx-prod-subscription(e3143cb2-4707-4614-bbba-3ddeb66669c2) - ロケーション: Japan East
- ログインサーバー:
gxsharedacr.azurecr.io
本番環境 - East US
- 名前:
gxSharedAcrUs - サブスクリプション:
gx-prod-subscription(e3143cb2-4707-4614-bbba-3ddeb66669c2) - ロケーション: East US
- ログインサーバー:
gxsharedacrus.azurecr.io
infra init での ACR 設定
新しいテナントを infra init コマンドで初期化する際、対話形式で ACR とイメージ名を選択できます。
設定フロー: 基本設定 → リポジトリ設定 → ACR とイメージ設定
ACR 選択: サブスクリプションを選択 → 選択したサブスクリプション内のACRを選択 → イメージ名を入力 → イメージの存在確認(自動)
システムは以下を自動的に行います: Azure CLI を使用して利用可能な ACR を取得(キャッシュ使用)、サブスクリプションごとにグループ化して表示、デフォルトのイメージ名を提案(リポジトリ名から生成)、イメージが ACR に存在するか確認(存在しない場合も続行可能)
Azure CLI 未設定時: Azure CLI が設定されていない場合は、デフォルトの ACR 選択肢が表示されます。
イメージ名の命名規則
推奨: 小文字とハイフンのみ使用(例: my-app-frontend)、プロジェクト識別子を含める(例: pj-japan-nextjs)、役割を明確にする
避けるべき: 大文字、アンダースコア、特殊文字
自動生成: リポジトリ名から自動的に生成されます(例: GenerativeX/pj-japan-nextjs → pj-japan-nextjs)
ACR の使用例
同じ ACR を使用する場合
["environments.prd.frontend"]
acr_subscription = "e3143cb2-4707-4614-bbba-3ddeb66669c2"
acr_name = "gxSharedAcr"
image_name = "my-frontend"
["environments.prd.backend"]
acr_subscription = "e3143cb2-4707-4614-bbba-3ddeb66669c2"
acr_name = "gxSharedAcr"
image_name = "my-backend"
異なる ACR を使用する場合(地理的分散)
["environments.prd.frontend"]
acr_subscription = "e3143cb2-4707-4614-bbba-3ddeb66669c2"
acr_name = "gxSharedAcr" # Japan East
image_name = "my-frontend"
["environments.prd.backend"]
acr_subscription = "e3143cb2-4707-4614-bbba-3ddeb66669c2"
acr_name = "gxSharedAcrUs" # East US
image_name = "my-backend"
カスタムイメージ名を使用
["environments.prd.frontend"]
acr_subscription = "e3143cb2-4707-4614-bbba-3ddeb66669c2"
acr_name = "gxSharedAcr"
image_name = "custom-frontend-v2" # カスタム名
image_tag = "latest"
ACR ベストプラクティス
- 地理的に近い ACR を選択: Japan East のリソース →
gxSharedAcr(Japan East)、East US のリソース →gxSharedAcrUs(East US) - 環境ごとに異なるイメージ名を使用: 開発環境と本番環境で異なるイメージ名を使用
- タグを活用: バージョンタグを使用(例:
image_tag = "v1.2.3") - 一貫性のある命名: プロジェクト内で統一された命名規則を使用
GitHub リポジトリ設定
config.toml において、frontend と backend のそれぞれについて、GitHub リポジトリ情報を設定できます。
リポジトリ設定項目
repository: GitHub リポジトリをOrganization/repository-nameの形式で指定(例:GenerativeX/pj-japan-nextjs)。image_nameは自動的にリポジトリ名の後半部分のみが使用されます。root_directory: リポジトリ内のルートディレクトリを指定(例:""(リポジトリルート),"frontend"(サブディレクトリ))
infra init でのリポジトリ設定
新しいテナントを infra init コマンドで初期化する際、対話形式でリポジトリ情報を入力できます。
質問項目: Frontend repository(デフォルト: GenerativeX/<tenant-name>-nextjs)、Frontend root directory(デフォルト: 空文字列)、Backend repository(デフォルト: GenerativeX/<tenant-name>-fastapi)、Backend root directory(デフォルト: 空文字列)
自動検証機能
infra init コマンドは、GitHub CLI (gh) を使用してリポジトリの存在を自動的に検証します。
検証内容: リポジトリの存在確認、指定されたディレクトリの存在確認、フレームワークの自動検出(Next.js, React, FastAPI, Django)
必要な前提条件: GitHub CLI のインストールと認証(gh auth login)
GitHub CLI 未インストール時: 警告メッセージが表示されますが、検証をスキップしてセットアップを続行できます。
リポジトリの使用例
モノレポの場合
["environments.prd.frontend"]
repository = "GenerativeX/monorepo"
root_directory = "apps/web"
["environments.prd.backend"]
repository = "GenerativeX/monorepo"
root_directory = "apps/api"
別々のリポジトリの場合
["environments.prd.frontend"]
repository = "GenerativeX/frontend-app"
root_directory = ""
["environments.prd.backend"]
repository = "GenerativeX/backend-api"
root_directory = ""
サブディレクトリ内のプロジェクト
["environments.prd.frontend"]
repository = "GenerativeX/projects"
root_directory = "clients/customer-a"
["environments.prd.backend"]
repository = "GenerativeX/projects"
root_directory = "services/api-v2"
リポジトリ名のバリデーション
リポジトリ名は Organization/repository-name の形式で検証されます。Organization とリポジトリ名は英数字、ハイフン、アンダースコア、ドットを使用可能。
注意事項: repository と root_directory はオプショナルフィールドです。設定しない場合でもシステムは正常に動作します。
バリデーション
自動バリデーション
generate、plan、apply コマンドは自動的に config.toml のバリデーションを実行します。
手動バリデーション
infra validate <tenant_name> # 特定のテナント設定を検証
infra validate all # すべてのテナント設定を一括検証
infra validate all --verbose # 詳細な結果を表示
よくあるバリデーションエラー
- min_replicas > max_replicas:
min_replicasはmax_replicas以下である必要があります - 必須コンポーネントの欠落: frontend-backend の場合、backend が必須
- 不正な SKU 名:
B1ms→B_Standard_B1ms(正しい形式) - 不正なバージョン形式:
1.0.0→v1.0.0(vプレフィックスが必要) - 未知のフィールド: 未定義のフィールドは使用できません
- 不正なリポジトリ形式:
invalid-format→GenerativeX/my-app(Organization/repository-name形式)
バリデーションのベストプラクティス
- 自動バリデーションを活用 -
generate、plan、applyは自動的にバリデーションを実行 - 設定変更後は手動でバリデーション確認 -
infra validate my-tenant - CI/CD に組み込む -
infra validate allを CI/CD に組み込む - 環境ごとの設定を明確に分離 - 開発環境は最小構成、本番環境はスケーラブルに
- 適切なリソースサイズを選択 - 開発は Basic tier、本番は General Purpose tier 以上
トラブルシューティング
- ACR が表示されない: Azure CLI にログインしているか確認(
az account show)、適切なサブスクリプションが選択されているか確認、ACR へのアクセス権限を確認 - イメージのプッシュに失敗: ACR にログイン(
az acr login --name gxSharedAcr)、イメージ名のタグを確認、プッシュ - サブスクリプション ID がわからない:
az account list --output tableですべてのサブスクリプションを表示、az account show --query id --output tsvで現在のサブスクリプションを表示 - GitHub リポジトリの検証に失敗: GitHub CLI にログインしているか確認(
gh auth status)、再ログイン(gh auth login)、リポジトリへのアクセス権限を確認 - 設定生成に失敗: config.toml をバリデーション(
infra validate <tenant>)、暗号化された環境変数ファイルの存在を確認、Azure CLI でログインしているか確認
関連ドキュメント
- テナント登録 - 最初のテナントをセットアップ
- CLI リファレンス - すべての CLI コマンド