前に作った Let's Encrypt の自動化を行う Azure Functions ですが、あれからもちょいちょい弄り続けた結果、先日やっと正式版を出せました。
いろんなバグやよくわからない Azure REST API の仕様などを乗り越えてきました。
今回の正式版リリースでは以下のような機能を実装しています。
- 全ての App Service に対応
- Web Apps / Functions / Web App for Containers など(Windows と Linux に対応)
- Linux と Containers は Azure DNS が必要
- ワイルドカード証明書の発行
- これも Azure DNS が必要
- wwwroot の readonly モードに対応
- Run From Package を使った場合に readonly になる
- RBAC で権限を付与すれば 1 つの Function App で全てに対応
前回のリリースからいろんな部分が大きく変わったのと、HTTP-01 だけじゃなく DNS-01 にも対応したので使い方も簡単に紹介しておくことにします。
必要なロールの変更
以前のバージョンでは Website Contributor
だけ追加すれば動作していましたが、今のバージョンでは App Service が含まれているリソースグループには Website Contributor
が、App Service Plan が含まれているリソースグループには Web Plan Contributor
が必要になりました。
App Service と App Service Plan が同一リソースグループに含まれている場合は、両方のロールをリソースグループに付与します。別々のリソースグループに含まれている場合は少し注意。
Deploy to Azure Button の追加
以前は手動でデプロイしてくださいという形にしていましたが、今は ARM Template と Run From Package を利用して簡単に Function App のデプロイと初期設定が行えるようになっています。
リソースグループ、アプリ名、メールアドレスを入力すれば完了です。
サブスクリプション ID はデフォルトでデプロイ先のものが App Settings に設定されます。
Run From Package を使っているので、新バージョンへのアップデートは再起動するだけで終わります。
ワイルドカード証明書と Linux / Containers
Let's Encrypt ではワイルドカード証明書の発行には DNS-01 を使う必要があるので、同じサブスクリプションに設定済みの Azure DNS が必要です。そして IAM で DNS Zone Contributor
の付与も必要です。
同様に発行したいドメインを App Service に追加さえしておけば、Function の実行で自動的に ACME Challenge 用の TXT レコードが作成されます。
カスタムドメイン用の A / CNAME レコードは事前に設定しておく必要があります。
Windows 以外の App Service や Web App for Containers の場合は HTTP-01 が使えないので、その場合も DNS-01 を使うことになるため Azure DNS が必要となります。
古い証明書の削除
証明書の期限まで 30 日を切っていて、どの App Service にもバインドされていない証明書を定期的に削除する Function を追加しています。
動作時刻は証明書の更新からずらしているので、同時には動かないようになっています。
おまけ
Let's Encrypt のアカウントキーは Function App の D:\home\.acme 以下に保存されています。
問題が発生した場合は削除すれば、また次回起動時に新しいアカウントが作成されます。