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

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

このコマンドを実行すると、以下の情報が対話的に表示されます:

  1. 検証方式の自動判定 - ドメイン名から自動的に APEX(ルート)ドメインかサブドメインかを判定(*.gx-dev.app 配下の場合はサブドメインとして自動判定)
  2. Cloudflare DNS レコードの自動設定(オプション) - CLOUDFLARE_API_TOKEN が設定されている場合、DNSレコードを自動的に追加
  3. 追加する DNS レコード - CNAME レコードと TXT レコード(asuid)、既存レコードが存在する場合は自動的に検出してスキップ
  4. 設定完了後の URL - https:// 付きで表示
  5. 自動バインド実行 - DNS 設定確認後、証明書を自動的にバインド
  6. 既存設定のチェック - すでにカスタムドメインが設定済みの場合は警告を表示

📝 次のステップ

  1. コマンドを実行して表示される DNS レコード情報を確認
  2. Cloudflare DNS 設定手順に従ってレコードを追加
  3. DNS 設定完了後、コマンドの指示に従って証明書バインドを実行
  4. 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>]

関連ドキュメント