しばやん雑記

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

API Management にカスタムドメインと SSL/TLS 証明書を追加してみた

これまでに API Management をちゃんと弄ったことがなかったのと、運用するとなるとカスタムドメインと証明書設定は必須になるので絞って確認してみました。

カスタムドメインは Azure の場合、確認用の CNAME / TXT レコードを作成する必要があることが多いので、その辺りを調べておきたいという意図です。特に証明書に関してはローテーションが必要になるので、出来れば Key Vault に寄せておきたいです。

ドキュメントによると Gateway / Portal / Management / SCM の 4 つに対して、個別にカスタムドメインの割り当てが可能と書いてありますが、基本は Gateway を抑えておけばよいです。

テスト用に API Management を作成しておきました。Consumption 以外はデプロイに 15 分ぐらいかかるので注意が必要です。バックエンドが Cloud Services なのでインフラ周りは改善してほしいです。

API Management を作成した後は、適当に Swagger 定義を読み込ませて API を作成しておきます。

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

ここで作成した API は Product と紐づけておけば利用できるようになります。API Management は結構重厚なサービスなので Subscription や Product といった要素があるので、理解するのは少し大変です。

とはいえ、使わないという方法や Consumption を使うとかなりの機能が制限されているので、基本的な API Gateway としてまず使うのが良いかと思いました。

Azure DNS に CNAME レコードを追加

先に DNS レコードの追加が必要かと思っていましたが、実は全く関係ないドメイン名でも API Gateway に追加可能のようです。App Service のように検証はしてくれなかったので、この点は注意が必要です。

Consumption 以外では A / CNAME の両方が使えるようですが、CNAME を使うのが安全です。

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

これで保存すれば、設定したドメイン名で API Management への解決が行えるようになります。

Key Vault に証明書を作成

証明書は API Management へのカスタムドメイン追加時に同時に指定する必要があるので、先に Key Vault 側に証明書を作成しておきます。

自己署名証明書でも問題ないかもしれませんが、今回は Let's Encrypt の証明書を使いました。

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

Azure DNS と Key Vault を使って Let's Encrypt を作るには、前に作った keyvault-acmebot を使いました。サクサク証明書を Key Vault に作成できるので便利です。

Key Vault を使うと証明書の一元管理が簡単に行えるようになるので、App Service で使う場合でも Key Vault 経由で証明書をインポートした方が便利なことが多いです。

API Management にカスタムドメインと証明書を追加

ここまでで DNS レコードと Key Vault 証明書の準備が完了したので、API Management に設定を追加していきます。Custom domains から Add を選ぶとドメイン追加の画面になります。

ドメインの割当先は Gateway にしておきます。Developer Portal への割り当ても考え方は同じなので、必要な場合は追加しておけばよいです。

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

ログインに OpenID Connect を使っている場合は、リダイレクト URL の変更も必要になるはずです。

証明書は PFX をアップロードする方法と Key Vault 証明書を参照する方法の 2 つが選べますが、PFX の手動管理は事故の元なので Key Vault を使うようにしていきましょう。

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

対象となる Key Vault と証明書を選ぶだけなので、非常に簡単に設定できます。

保存しようとすると、初回の場合は以下のようなメッセージが表示されると思うので、Yes を選んで Managed Identity と Key Vault のアクセスポリシーの設定を自動的に行ってもらいましょう。

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

ドキュメントでは自分で設定が必要という風に書いてありましたが、Azure Portal からの場合は全て自動でやってくれるので便利です。App Service と同様の仕組みですね。

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

Consumption Tier 以外の場合は設定完了までに 10 数分かかるようなのでしばらく待ちます。Cloud Services で動いてるインスタンスにデプロイしに行っているからか、割と時間がかかります。

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

設定が完了すれば、追加したカスタムドメインを使って API Management へのアクセスが行えるようになります。Key Vault 証明書を選んだ場合は、更新があれば自動的にアップデートしてくれるようでした。

API を呼び出して確認

設定が完了したので適当に API を呼び出して、カスタムドメインと証明書が設定されているか確認します。

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

ちゃんと Let's Encrypt で発行した証明書が使われていることが確認できます。

Protocol settings からは SSL/TLS の暗号スイートやプロトコル、HTTP/2 の有無なども設定できるので、要件に合わせて適宜選ぶことができます。デフォルトでは TLS 1.2 のみ有効になっています。

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

基本的には安全側に倒すような設定になっているので、変更する際はその副作用をしっかりと理解しておく必要があります。ほとんどのケースではデフォルト設定のままで良いはずです。

利用する際には Consumption Tier がかなり良いと感じているので、時間があればスケールについても調べてみたいですね。ちなみに Consumption は App Service 上に作られているので、多少は制限があります。