しばやん雑記

Azure とメイドさんが大好きなフリーランスのプログラマーのブログ

Let's Encrypt 周りの自動化を行う Azure Functions の正式版をリリースした

前に作った 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 のデプロイと初期設定が行えるようになっています。

リソースグループ、アプリ名、メールアドレスを入力すれば完了です。

f:id:shiba-yan:20180828103352p:plain

サブスクリプション 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 レコードが作成されます。

f:id:shiba-yan:20180828102742p:plain

カスタムドメイン用の A / CNAME レコードは事前に設定しておく必要があります。

Windows 以外の App Service や Web App for Containers の場合は HTTP-01 が使えないので、その場合も DNS-01 を使うことになるため Azure DNS が必要となります。

古い証明書の削除

証明書の期限まで 30 日を切っていて、どの App Service にもバインドされていない証明書を定期的に削除する Function を追加しています。

f:id:shiba-yan:20180828104057p:plain

動作時刻は証明書の更新からずらしているので、同時には動かないようになっています。

おまけ

Let's Encrypt のアカウントキーは Function App の D:\home\.acme 以下に保存されています。

f:id:shiba-yan:20180828105048p:plain

問題が発生した場合は削除すれば、また次回起動時に新しいアカウントが作成されます。