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

Monolith Application Template

モノリシックアーキテクチャ(フロントエンドとバックエンドが統合されたアプリケーション)のための Terraform テンプレートです。

アーキテクチャ

Frontend Container App(Full-stack Application: Next.js, Django, Rails など、Public Access)が MySQL Flexible Server、Azure Storage(Optional)、Redis Cache(Optional)に接続します。

リソース

必須リソース: Resource Group、Frontend Container App(Monolith 構成)、MySQL Flexible Server、MySQL Database、User Assigned Identity、Role Assignment (ACR Pull)

オプションリソース: Storage Account(enable_storage = trueの場合)、File Share、Blob Container、Custom Domain(custom_domain_nameが指定された場合)、Redis Cache(enable_redis = trueの場合)

使い方

1. 初期環境構築

infra init <tenant-name> --template monolith --environments dev prd
infra generate <tenant-name> dev --non-interactive
infra plan <tenant-name> dev
infra apply <tenant-name> dev --auto-approve

2. CI/CD でのデプロイ

Dockerイメージのビルド・プッシュ → Container Appの更新(GitHub Actionsが自動実行)

3. インフラ変更

CPU/メモリ、レプリカ数などのインフラ設定を変更する場合: terraform.tfvarsを編集 → infra plan(imageとenvは差分に表示されない) → infra apply

主要な変数

Frontend Container App

変数名説明
frontend_container_app_nameContainer App 名ca-my-tenant-frontend-dev
frontend_image_nameDocker イメージ名my-tenant/app
frontend_image_tagDocker イメージタグ(初期値のみ)latest
frontend_cpuCPU0.25, 0.5, 1.0, 2.0
frontend_memoryメモリ(Gi 単位)0.5, 1.0, 2.0
frontend_min_replicas最小レプリカ数0, 1, 2
frontend_max_replicas最大レプリカ数5, 10, 20
frontend_portコンテナのポート番号3000, 8000
frontend_runtimeランタイム"node", "python"

Database

変数名説明
db_nameデータベース名myapp_db
db_admin_username管理者ユーザー名dbadmin
db_admin_password管理者パスワード複雑なパスワード
db_sku_nameSKUB_Standard_B1ms, GP_Standard_D2ds_v4
db_storage_mbストレージ容量(MB)20480, 102400

Storage(オプション)

変数名説明
enable_storageStorage を有効にするかtrue, false
storage_account_nameStorage Account 名stmytenantdevfs
file_share_nameFile Share 名app-share
file_share_quotaFile Share 容量(GB)100, 500
blob_container_nameBlob Container 名app-blob

Redis(オプション)

変数名説明
enable_redisRedis を有効にするかtrue, false
redis_sku_nameSKUBasic, Standard, Premium
redis_familyファミリーC, P
redis_capacity容量0, 1, 2, 3, 4, 5, 6
redis_enable_non_ssl_port非 SSL ポートを有効にするかfalse, true
redis_minimum_tls_version最小 TLS バージョン"1.2", "1.0"

環境変数

自動設定される環境変数

  • DATABASE_URL: データベース接続 URL(ランタイムに応じて形式が変わります)
  • DB_URL: データベース接続 URL(pymysql 形式)
  • MYSQL_HOST: MySQL ホスト
  • MYSQL_PORT: MySQL ポート(3306)
  • MYSQL_USER: MySQL ユーザー名
  • MYSQL_PASSWORD: MySQL パスワード
  • MYSQL_DATABASE: データベース名
  • ENVIRONMENT: 環境名
  • NEXTAUTH_URL: サイト URL(site_urlが設定されている場合)
  • AUTH0_BASE_URL: サイト URL(site_urlが設定されている場合)

Storage(有効な場合)

  • AZURE_STORAGE_ACCOUNT_NAME: Storage Account 名
  • AZURE_STORAGE_ACCOUNT_KEY: Storage Account キー
  • AZURE_STORAGE_CONNECTION_STRING: 接続文字列
  • AZURE_STORAGE_BLOB_ENDPOINT: Blob エンドポイント
  • AZURE_STORAGE_CONTAINER_NAME: Blob Container 名

Redis(有効な場合)

  • REDIS_HOST: Redis ホスト
  • REDIS_PORT: Redis ポート
  • REDIS_SSL: Redis SSL ポート
  • REDIS_PASSWORD: Redis パスワード

カスタム環境変数

environment_variablesまたはfrontend_environment_variablesで追加の環境変数を設定できます。

注意

CI/CD で環境変数を管理する場合、これらの Terraform 変数は初期値としてのみ使用されます。

ランタイムの選択

frontend_runtimeを設定することで、DATABASE_URLの形式が自動的に調整されます:

Node.js(デフォルト)

frontend_runtime = "node"

生成されるDATABASE_URL:

mysql://user:password@host:3306/database

Python

frontend_runtime = "python"

生成されるDATABASE_URL:

mysql+pymysql://user:password@host:3306/database

注意事項

1. データベースの削除保護

MySQL リソースにはprevent_destroy = trueが設定されているため、誤って削除されることを防ぎます。

2. Redis の削除保護

Redis リソースにもprevent_destroy = trueが設定されています。

3. パスワード管理

db_admin_passwordなどの機密情報は、環境変数や暗号化されたファイルで管理してください。

4. カスタムドメイン

カスタムドメインを使用する場合、証明書の設定は Azure CLI で別途行う必要があります。

詳細は カスタムドメインガイド を参照してください。

5. Premium Redis

Premium SKU を使用する場合、プライベートネットワーク接続が必須となります。redis_sku_name = "Premium"を設定すると、自動的に DB subnet に配置されます。

トラブルシューティング

Q: Terraform 実行時にイメージや env 関連の差分が表示される

対処法:

# Terraformの状態ファイルをリフレッシュ
infra refresh <tenant-name> <env>

ignore_changesが正しく設定されているか確認してください。

Q: CI/CD でデプロイしたイメージが Terraform 実行後に元に戻る

これはignore_changesが機能していない可能性があります。テンプレートのバージョンを確認してください(v1.0.0 以降が必要)。

Q: 環境変数が想定通りに設定されない

CI/CD で環境変数を管理している場合、Terraform の変数定義は初期値としてのみ使用されます。実際の環境変数は CI/CD で設定してください。

詳細は 環境変数ガイド を参照してください。

Q: Redis を Premium SKU で使用したい

Premium SKU を使用する場合、プライベートネットワーク接続が必須となります。redis_sku_name = "Premium"を設定すると、自動的に DB subnet に配置されます。

関連ドキュメント