TerraformでAzure Web AppsにKey Vault内の証明書を設定する

小ネタです。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それぞれに読み取り権限が必要です。

参考:

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト /  変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト /  変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト /  変更 )

%s と連携中