小ネタです。Terraformを使ってKey Vaultの証明書で管理されている証明書を使ってApp ServiceのWeb Appsに証明書を設定する方法です。
結論から先に書くと、Terraformのazurerm_app_service_certificateを使って証明書を設定しようとしても権限が無くて失敗します。(Terraformの実行ユーザーやService PrincipalにKey Vaultの証明書等の読み取りポリシーを設定したとしても)
で、回避先は一応提示されてて実行ユーザーではなくApp ServiceのService Principalに対して権限を付けてあげないとダメ、ということでした。(APIを呼ばれたApp ServiceがKey Vaultから証明書を取得するため)
というわけで以下のように書いてあげるとうまくいきます。
provider "azuread" {
tenant_id = "xxxxxxxxxxxxxxxxxxxxxx" # Azure ADのテナントID
subscription_id = "xxxxxxxxxxxxxxxxxxxx" # AzureサブスクリプションID
version = "~>0.3.1"
}
data "azuread_service_principal" "MicrosoftWebApp" {
application_id = "abfa0a7c-a6b6-4736-8310-5855508787cd" # App ServiceのService PrincipalのアプリケーションID (固定)
}
resource "azurerm_key_vault_access_policy" "azure-app-service" {
key_vault_id = data.azurerm_key_vault.default.id
tenant_id = "xxxxxxxxxxxxxxxxxxxxxx" Azure ADのテナントID
through-Key-Vault.html
object_id = data.azuread_service_principal.MicrosoftWebApp.id
secret_permissions = [
"get"
]
certificate_permissions = [
"get"
]
}
# 証明書の設定
resource "azurerm_app_service_certificate" "default" {
name = "xxxx" # Key Vaultに登録されてる証明書名
resource_group_name = "xxxxxxxx"
location = "japaneast"
key_vault_secret_id = data.azurerm_key_vault_secret.yourwebsite.id
}
ポイントはApp ServiceのService PrincipalのオブジェクトIDのところです。アプリケーションIDはドキュメントにあるように”abfa0a7c-a6b6-4736-8310-5855508787cd”で固定なのですが、実際にKey Vaultのアクセスポリシーに設定するにはオブジェクトIDが必要になるのでAzure ADプロバイダーを使って読み込んでいます。もしterraform実行ユーザーなどにAzure ADのService Principalを読み取る権限がないのであれば事前に
az ad sp show --id abfa0a7c-a6b6-4736-8310-5855508787cd
を実行して得られるObuectIdを data.azuread_service_principal.MicrosoftWebApp.id の代わりに設定しましょう。
あと証明書は秘密鍵も必要なのでcertificateとsecretそれぞれに読み取り権限が必要です。
参考: