Azure Container Apps カスタムドメイン設定手順
Azure Container Apps (ACA) でカスタムドメインと SSL 証明書を設定する手順をまとめています。Terraform と Azure CLI を組み合わせて、マネージド証明書を使用した HTTPS 接続を実現します。
前提条件
Azure CLI がインストール済み、Terraform がインストール済み、カスタムドメインの DNS 管理権限、Container App Environment が作成済み
初めての方は、まずクイックスタートから始めることをお勧めします。
クイックスタート(推奨)
🚀 infra CLI を使用した対話的セットアップ
最も簡単で推奨される方法は、infra setup-ca コマンドを使用することです。
infra setup-ca <tenant-name> <environment> [--domain <custom-domain>]
# 例: pj-japan の dev 環境に nissaydev.flower.gx-dev.app をバインド
infra setup-ca pj-japan dev --domain nissaydev.flower.gx-dev.app
このコマンドを実行すると、以下の情報が対話的に表示されます:
- 検証方式の自動判定 - ドメイン名から自動的に APEX(ルート)ドメインかサブドメインかを判定(
*.gx-dev.app配下の場合はサブドメインとして自動判定) - Cloudflare DNS レコードの自動設定(オプション) -
CLOUDFLARE_API_TOKENが設定されている場合、DNSレコードを自動的に追加 - 追加する DNS レコード - CNAME レコードと TXT レコード(asuid)、既存レコードが存在する場合は自動的に検出してスキップ
- 設定完了後の URL -
https://付きで表示 - 自動バインド実行 - DNS 設定確認後、証明書を自動的にバインド
- 既存設定のチェック - すでにカスタムドメインが設定済みの場合は警告を表示
📝 次のステップ
- コマンドを実行して表示される DNS レコード情報を確認
- Cloudflare DNS 設定手順に従ってレコードを追加
- DNS 設定完了後、コマンドの指示に従って証明書バインドを実行
https://your-domainでアクセスできることを確認
詳細な設定手順
1. DNS 設定
カスタムドメインに以下のレコードを設定します。
*.gx-dev.app 配下のドメイン: 基本的にサブドメインです。CNAME レコード + TXT レコードで設定してください。
サブドメインの場合(推奨: CNAME 方式):
- CNAME:
nissaydev.flower → ca-xxx-frontend-xxx.ashytree-xxxxx.japaneast.azurecontainerapps.io - TXT:
asuid.nissaydev.flower → <verification-id>
重要: .gx-dev.app より後ろの部分は、DNS レコード設定では記載不要です。
APEX(ルート)ドメインの場合: Aレコード + TXT レコード(asuid)
検証 ID の取得:
az containerapp show -g <resource-group> -n <app-name> \
--query "properties.customDomainVerificationId" -o tsv
2. Container App 設定の確認
Ingress が外部公開になっているか確認(true が返されることを確認)。
3. Terraform でカスタムドメインリソースを作成
azurerm_container_app_custom_domain リソースを作成し、lifecycle.ignore_changes で証明書設定の変更を防ぐ。
4. Azure CLI でマネージド証明書をバインド
より簡単な方法として、infra setup-ca コマンドの使用を推奨します。詳細はクイックスタートを参照。
Cloudflare DNS 設定手順
Cloudflare DNS レコードの設定には、自動設定(推奨)と手動設定の2つの方法があります。
自動設定(推奨)
CLOUDFLARE_API_TOKEN 環境変数が設定されている場合、infra setup-ca コマンドが自動的にDNSレコードを追加します。
前提条件: Cloudflare API トークンの取得(Cloudflare Dashboard → 「My Profile」→「API Tokens」→「Create Token」)、環境変数の設定(export CLOUDFLARE_API_TOKEN="your-api-token")
使用方法: CLOUDFLARE_API_TOKEN が設定されている状態で infra setup-ca を実行すると、自動設定の確認プロンプトが表示され、自動的にレコードを追加します(--yes オプションの場合は確認なしで自動設定)。
既存レコードのハンドリング: 同じ名前のレコードが既に存在する場合、自動的に検出してスキップします。
手動設定
CLOUDFLARE_API_TOKEN が設定されていない場合、または自動設定をスキップした場合は、ブラウザから手動設定してください。
手順: Cloudflare にログイン → DNS 設定画面を開く → DNS レコードを追加(CNAME レコード + TXT レコード(asuid)) → プロキシステータスを無効化(⚠️ 重要: 「DNS only」(灰色雲マーク)に設定) → 検証完了を待つ → 証明書バインドを実行 → (オプション)プロキシを有効化
権限がない場合: Cloudflare の編集権限がない場合は、GenerativeX Slack の #team-infra チャンネルに投稿してください。
設定確認
# カスタムドメインの状態確認
az containerapp show -g <resource-group> -n <app-name> \
--query "properties.configuration.ingress.customDomains" -o table
# HTTPS 接続テスト
curl -I https://your-domain.example.com
トラブルシューティング
よくある問題と解決策
-
「選択したドメインと一致する証明書はありません」: 証明書と Container App が同じ Environment にあることを確認、DNS 設定(CNAME + TXT asuid)を確認、Azure CLI で完全な Environment Resource ID を指定
-
SSL 証明書の発行に失敗:
external_enabled = trueを確認、CNAME が直接 Container App を指すように設定、Cloudflare プロキシを無効化(橙雲 → 灰雲)★ 最重要、DNS レコード反映まで待つ、.gx-dev.app配下の場合、DNS レコード名に.gx-dev.appを含めない -
「ホスト名が既に存在する」エラー:
infra setup-caコマンドは自動的に既存設定を検出し、証明書の再バインドを試行します。手動で削除する場合:az containerapp hostname delete --hostname <domain> -g <rg> -n <app> -
Terraform で証明書バインディングが無効化される:
lifecycle.ignore_changesで証明書設定の変更を防ぐ
重要な注意事項
-
リソースグループの制約: Container App と Container App Environment は異なるリソースグループでも可、証明書は Container App Environment のスコープで管理される、DNS 設定は外部の DNS プロバイダーで管理
-
Terraform の制限:
azurerm_container_app_custom_domainリソースはマネージド証明書の自動バインディングをサポートしていない、証明書バインディングは Azure CLI で手動実行が必要、lifecycle.ignore_changesで証明書設定の変更を防ぐ -
DNS 要件:
*.gx-dev.app配下のドメインは基本的にサブドメイン、サブドメインは CNAME レコードで直接 Container App を指す、TXT asuid レコードが検証に必須、.gx-dev.app配下の場合、DNS レコード名に.gx-dev.appは含めない(❌ 誤:nissaydev.flower.gx-dev.app、✅ 正:nissaydev.flower)、中間 CNAME/プロキシは証明書発行時に無効化が必須、Cloudflare プロキシ(橙雲マーク)は必ず「DNS only」(灰雲マーク)にする
参考コマンド集
# 検証ID取得
az containerapp show -g <rg> -n <app> --query "properties.customDomainVerificationId" -o tsv
# 証明書一覧
az containerapp env certificate list -g <rg> -n <env> -o table
# カスタムドメイン削除
az containerapp hostname delete --hostname <domain> -g <rg> -n <app>
# 証明書バインド
az containerapp hostname bind --hostname <domain> -g <rg> -n <app> \
--environment <env-resource-id> --validation-method CNAME
# DNS確認
dig nissaydev.flower.gx-dev.app CNAME
dig asuid.nissaydev.flower.gx-dev.app TXT
# 推奨: infra CLIを使用した対話的セットアップ
infra setup-ca <tenant-name> <environment> [--domain <custom-domain>]