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をデプロイする
- 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で問題なく操作できました。