Azure CDNでZone APEXのカスタムドメインを設定する話

公開: 2022年8月12日 金曜日

Azure CDNでZone APEX(ネイキッドドメイン)の設定に苦戦したので設定までの内容を備忘録として残しておきます。




APEXドメインは example.com と頭に何も文字を付けないドメインです。

Azure CDNのカスタムドメイン設定はDNSのCNAMEレコードで設定することになっています。
参考:チュートリアル:カスタム ドメインをエンドポイントに追加する - Azure Content Delivery Network | Microsoft Docs
しかしAPEXドメインでは通常CNAMEレコードを設定することができません。(例えばお名前.comなどは非対応、AWSのRoute 53では設定できるようですが)
Azure Front DoorのドキュメントにはAPEXドメインの設定について記載がありました。
参考:既存のフロント ドアにルート ドメインまたは頂点ドメインをオンボードする - Azure portal | Microsoft Docs




対応手順は以下のようになりました。

  • Azure CDNを作成する
  • Azure DNSゾーンを作成する
  • 既存のネームサーバーからDNSレコードをエクスポートする
  • Azure DNSにレコードをインポートする

インポートはAzure Portalでは行えず、ドキュメントを参考に以下Azure CLIコマンドでインポートが必要でした。
参考:ドメイン ゾーン ファイルをインポートおよびエクスポートする - Azure CLI - Azure DNS | Microsoft Docs
az network dns zone import -g <resource group> -n <zone name> -f <zone file name>
Azure CLIのインストールドキュメントは以下
参考:Azure CLI をインストールする方法 | Microsoft Docs

  • Azure DNSにレコードセットを追加する

CNAMEレコードは直接追加できないため、私は以下の設定でAレコードとAAAAレコードを追加しました。
エイリアスのレコードセット:はい
エイリアスの種類:Azureリソース
Azureリソースは作成したCDNリソースを選択

  • 既存のネームサーバーからAzure DNSにネームサーバーの参照先を変更する

Azure CDN側でDNSレコードを認識するまである程度時間がかかりました。(1時間以上かかっていたと思います。)

  • Azure Key Vaultを作成する

Azure CDNのマネージド証明書はAPEXドメインでは利用できず、持ち込み証明書の設定が必要でした。

  • Key VaultでLet's Encryptを自動更新で利用できるようにする

Let's Encryptであれば無料証明書が適用できるのでこれを利用しました。
以下のサイトが参考になりました。
参考:Azure Key Vault を使って Let's Encrypt 周りを自動化する Function を作った話 - しばやん雑記
参考:Azure Application GatewayのSSL証明書にLet's Encryptを使う

  • keyvault-acmebotをデプロイする

参考:GitHub - shibayan/keyvault-acmebot: Automated ACME SSL/TLS certificates issuer for Azure Key Vault (App Gateway / Front Door / CDN / others)

  • acmebotのFunctionsに認証設定を追加する(セキュリティの強化)
  • 同上のアプリケーション設定でDNSプロバイダーを設定する

Acmebot:AzureDns:SubscriptionIdを追加

  • Azure DNSにacmebotのFunctionsをアクセス制御(IAM)で共同作成者にする
  • Key VaultにacmebotのFunctionsとAzure DNS用のアクセスポリシーを追加する

acmebotのFunctionsはテンプレート:Certificate Managementを設定してプリンシパルにfunc-**-**を追加します。
また、以下のドキュメントを参考にAzure PowerShellを使用してMicrosoft.AzureFrontDoor-CdnのサービスプリンシパルをAzure ADに追加し、それをKey VaultのGetのみ可能なアクセスポリシーとして追加します。
参考:チュートリアル:Azure CDN カスタム ドメインで HTTPS を構成する | Microsoft Docs
参考:Azure Az PowerShell モジュールをインストールする | Microsoft Docs

  • acmebotのFunctionsのURLにアクセスし、Key VaultにLet's Encryptの証明書を追加する
  • Azure CDNからカスタムドメインを選び、HTTPSをオン、自分の証明書を使用するからKey Vaultの証明書を選び最新バージョンをする

ここで最新バージョンを選択することでacmebotの自動更新された証明書が自動的に割り当てられるようです。
証明書のデプロイにはそれなりの時間がかかります。(1時間以上かかっていたと思います。)

以上が流れです。
運用コストは各サービスで多少かかります。苦戦した点はAzure DNSのレコードインポート、keyvault-acmsbotの権限周りの設定、Key VaultにFrontDoor,CDNのサービスプリンシパルをアクセスポリシーに追加するところでした。
また、終始Macで作業しましたがAzure CLI、Azure PowerShellのモジュールもMac版のPowerShellで問題なく操作できました。