しばやん雑記

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

Azure Key Vault を使って App Service の証明書を管理する

今や必須となっている https 対応のために App Service に SSL 証明書をバインドする場合、ほとんどの場合は PFX を作成してアップロードしていると思いますが、割とこの辺りの手順は面倒ですよね。アップロードしたはずの証明書が思ったように出てこない場合もあります。

調べた限りでは App Service にアップロードした証明書の挙動は以下のようになっています。

  • App Service の証明書は Webspace に関連付く
  • 証明書と App Service が同じ Webspace 上にある場合のみ利用可能

こういった条件があるため複数リージョンに Traffic Manager などで分散している場合には、それぞれの App Service に対して証明書のアップロードを行う必要があるので、正直なところ凄く手間がかかります。

なので後から Key Vault に保存されている証明書を使えるような機能が実装されましたが、Portal との統合は行われておらず ARM の REST API を直接実行する必要があるので、まあまあ手間ですが証明書の管理を 1 つの Key Vault に任せられるのがメリットです。

予め Key Vault を作成しつつ、アクセスポリシーに App Service を追加します。

App Service Team のブログでは ARMClient が使われていますが、Resource Explorer でも大丈夫です。以下のような JSON を用意して、certificates に対して実行すれば証明書が新しく作られます。

{
  "location": "Japan East",
  "properties": {
    "keyVaultId": "Key Vault Resource Id",
    "keyVaultSecretName": "daruyanagi-com",
    "serverFarmId": "App Service Plan Resource Id"
  }
}

とても残念なことに Front Door や対応予定されている Application Gateway v2 とは異なり Key Vault 側を更新しても自動で反映してくれません。

新しい証明書を反映させるためには、もう一度 ARM の REST API を実行する必要があるので、割といまいちな実装です。Azure App Service は歴史的な経緯から Azure Key Vault との統合が弱めです。*1

今はポータルから Sync が行えるようになっていますが、手動なのであまり意味がないですね。Key Vault の証明書が変更されたら Sync するような Azure Functions を書くしかなさそうです。

ちなみに App Service Certificate を使って証明書を発行すると Key Vault が作られ、そこに証明書が安全に格納されるようになっています。こっちは自動的に新しい証明書が発行された場合には反映されます。

補足 : Webspace の話

App Service の制約は割と Webspace に関係しているようなので、気になった部分を確認しておきました。Scale unit と同じスコープかと思っていましたが、厳密には異なっているようです。

帝国兵殿の言う通り、最近のデプロイでは Webspace は以下のルールで作られます。ちなみに大昔に作った App Service の場合はリソースグループ名が含まれていませんでした。

リソースグループ名 + "-" + リージョン名 + webspace

このような命名ルールとなっているので、同じ Webspace に新しい App Service をデプロイ出来ます。

公式ドキュメントでは App Service が動作している Service Plan を変更する場合には、同じ Webspace に Service Plan をデプロイする必要があると書いてあります。おそらく Webspace に関して言及しているのは、このドキュメントだけです。

先述した SSL 証明書も内部的には Webspace に関連付いているので、同じ Webspace にデプロイされている App Service にはバインドが可能です。Webspace は表に出てこないので意外に分かりにくい。

そして盲点となりやすいのが Premium V2 が使える Service Plan と使えない Service Plan は同じ Webspace にデプロイ出来ないことです。なので、別のリージョンを指定して Webspace を変えることで、Premium V2 が使える Service Plan と使えない Service Plan を同時にデプロイすることが可能です。

*1:単純に App Service がリリースされた時に Key Vault が無かっただけ