メインコンテンツまでスキップ

設定ガイド

Azure Container Apps 上でマルチテナントアプリケーションをデプロイするための設定方法を説明します。

カバーする内容: テナント設定ファイル(config.toml)のスキーマとバリデーション、Azure Container Registry (ACR) の設定方法、GitHub リポジトリの統合設定

config.toml スキーマ

主な機能

  • 統一スキーマ: すべてのテンプレートで一貫した config.toml 形式
  • 型安全: Zod による実行時バリデーションと TypeScript 型推論
  • 自動バリデーション: generateplanapply コマンド実行時に自動検証
  • テンプレートベース: frontend-backend(分離構成)と monolith(統合構成)をサポート
  • 環境別設定: dev/staging/prd ごとに異なるリソース設定が可能

サポートされているテンプレート

テンプレート必須コンポーネント説明
frontend-backendfrontend, backend, databaseフロントエンド + バックエンド + データベース
monolithfrontend, 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_namestring1 文字以上-
image_tagstring--"latest"
min_replicasnumber-0 以上の整数1
max_replicasnumber-1 以上の整数3
cpunumber-正の数-
memorynumber-正の数-
portnumber-1-65535-
runtimestring-"node"/"python"frontend: "node"
backend: "python"
allowed_ip_rangeslist(string)-CIDR 形式オフィス IP + 10.0.0.0/18
custom_domain_namestring---
custom_domain_certificate_namestring---
acr_subscriptionstring-UUID 形式-
acr_namestring---
repositorystring-Org/repo 形式-
root_directorystring--""

追加検証: min_replicasmax_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_mbnumber20,480〜16,777,216(20GB〜16TB)
sku_namestringAzure Database SKU 形式

SKU 名の形式: (B|GP|MO)_Standard_{SKU_CODE}

Redis 設定

フィールド必須検証ルールデフォルト
enabledboolean--true
sku_nameenum-Basic, Standard, Premium"Basic"
familyenum-C, P"C"
capacitynumber-0-6(C), 1-5(P)0

追加検証: Premium family(P)の場合、capacity は 1〜5

Storage 設定

フィールド必須検証ルールデフォルト
enable_storageboolean--false
frontend_file_share_namestring---
frontend_file_share_quotanumber-1-102400 (GB)-
backend_file_share_namestring---
backend_file_share_quotanumber-1-102400 (GB)-
file_share_namestring---
file_share_quotanumber-1-102400 (GB)-
frontend_blob_container_namestring---
backend_blob_container_namestring---

追加検証: enable_storagetrue の場合、少なくとも 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-nextjspj-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 ベストプラクティス

  1. 地理的に近い ACR を選択: Japan East のリソース → gxSharedAcr (Japan East)、East US のリソース → gxSharedAcrUs (East US)
  2. 環境ごとに異なるイメージ名を使用: 開発環境と本番環境で異なるイメージ名を使用
  3. タグを活用: バージョンタグを使用(例: image_tag = "v1.2.3"
  4. 一貫性のある命名: プロジェクト内で統一された命名規則を使用

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 とリポジトリ名は英数字、ハイフン、アンダースコア、ドットを使用可能。

注意事項: repositoryroot_directory はオプショナルフィールドです。設定しない場合でもシステムは正常に動作します。

バリデーション

自動バリデーション

generateplanapply コマンドは自動的に config.toml のバリデーションを実行します。

手動バリデーション

infra validate <tenant_name>  # 特定のテナント設定を検証
infra validate all # すべてのテナント設定を一括検証
infra validate all --verbose # 詳細な結果を表示

よくあるバリデーションエラー

  • min_replicas > max_replicas: min_replicasmax_replicas 以下である必要があります
  • 必須コンポーネントの欠落: frontend-backend の場合、backend が必須
  • 不正な SKU 名: B1msB_Standard_B1ms(正しい形式)
  • 不正なバージョン形式: 1.0.0v1.0.0v プレフィックスが必要)
  • 未知のフィールド: 未定義のフィールドは使用できません
  • 不正なリポジトリ形式: invalid-formatGenerativeX/my-appOrganization/repository-name 形式)

バリデーションのベストプラクティス

  1. 自動バリデーションを活用 - generateplanapply は自動的にバリデーションを実行
  2. 設定変更後は手動でバリデーション確認 - infra validate my-tenant
  3. CI/CD に組み込む - infra validate all を CI/CD に組み込む
  4. 環境ごとの設定を明確に分離 - 開発環境は最小構成、本番環境はスケーラブルに
  5. 適切なリソースサイズを選択 - 開発は 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 でログインしているか確認

関連ドキュメント