Terraform授予Azure功能应用程序,可通过MSI访问Azure Keyvault

时间:2018-08-01 21:55:34

标签: azure terraform

我正在尝试使用Terraform在Azure中设置Terraform创建的方案:
 -具有托管服务标识的Azure功能应用
 -Azure密钥保管库
 -密钥保管库访问策略,允许功能应用访问密钥保管库中的秘密

我的问题是在密钥库访问策略的定义中使用为功能应用设置的MSI的对象ID(原理ID),我怀疑我做错了(和/或愚蠢)... < / p>

我从Terraform应用中得到的错误是:

azurerm_key_vault_access_policy.msi-test-to-keyvault-test: "object_id" is an invalid UUUID: uuid: UUID string too short: 1

我怀疑问题可能与我尝试引用基于访问策略定义中的msi身份创建的服务原理的对象ID的方式有关。

object_id = "${azurerm_function_app.rg-func-app__funcapp.identity.principal_id}"

((zurerm函数的doco属性应用属性部分说,身份会导出Principle_id,但是我不知道引用该属性的正确语法是什么:()

Terraform模板为:

resource "azurerm_function_app" "rg-func-app__funcapp" {
  name = "${local.deployed-func-app-name}"
  location                  = "${azurerm_resource_group.rg-func-app.location}"
  resource_group_name       = "${azurerm_resource_group.rg-func-app.name}"
  app_service_plan_id       = "${azurerm_app_service_plan.rg-func-app__appsvcpln.id}"
  storage_connection_string = "${azurerm_storage_account.rg-func-app__sa.primary_connection_string}"

  version = "~1"

  app_settings {
    "TEST_KEYVAULT_URL" = "${azurerm_key_vault.test.vault_uri}"
  }

  identity {
    type = "SystemAssigned"
  }

}


resource "azurerm_key_vault" "test" {
  name = "msi-test-vault"
  location = "${azurerm_resource_group.rg-func-app.location}"
  resource_group_name = "${azurerm_resource_group.rg-func-app.name}"

  sku {
    name = "standard"
  }

  tenant_id = "${data.azurerm_client_config.current.tenant_id}"
}

resource "azurerm_key_vault_secret" "test" {
  name      = "secret-sauce"
  value     = "szechuan"
  vault_uri = "${azurerm_key_vault.test.vault_uri}"
}


resource "azurerm_key_vault_access_policy" "msi-test-to-keyvault-test" {
  vault_name           = "${azurerm_key_vault.test.name}"
  resource_group_name  = "${azurerm_key_vault.test.resource_group_name}"

  tenant_id = "${azurerm_key_vault.test.tenant_id}"
  object_id = "${azurerm_function_app.rg-func-app__funcapp.identity.principal_id}"

  key_permissions = [
    "get",
  ]

  secret_permissions = [
    "get",
  ] 
}

非常感谢收到任何指针。

干杯,安迪

2 个答案:

答案 0 :(得分:2)

经过一番摸索之后,一种解决方案似乎是更改咒语以将principal_id检索为:

object_id = "${lookup(azurerm_function_app.rg-func-app__funcapp.identity[0],"principal_id")}"

这将导致按预期创建访问策略。

答案 1 :(得分:0)

检出其中包含所有可用选项的terraform.tfstate文件。或terraform show命令。这将显示您要查找的GUID属性可以在以下位置找到

object_id = "${azurerm_function_app.rg-func-app__funcapp.identity.0.principal_id}"