【问题标题】:Terraform - How to get App Service object id for azurerm key vault access policy?Terraform - 如何获取 azurerm 密钥保管库访问策略的应用服务对象 ID?
【发布时间】:2019-06-08 21:50:03
【问题描述】:

使用 Terraform,我正在尝试向应用程序(也在 Terraform 中创建)添加密钥库访问策略,这需要该应用程序的 object_it(即 GUID)。在 ARM 模板中是这样的:

 "objectId": "[reference(variables('myAppResourceId'), '2015-08-31-PREVIEW').principalId]"

所以 Terraform 需要将 principal id 分配给 object_id。如果我像这样使用 "object_id = ${azurerm_app_service.myApp.id}" 值:

  resource "azurerm_key_vault_access_policy" "pol1" {
  vault_name          = "${azurerm_key_vault.kv1.name}"
  resource_group_name = "${azurerm_key_vault.kv1.resource_group_name}"

  tenant_id = "${data.azurerm_subscription.current.subscription_id}"
  object_id = "${azurerm_app_service.myApp.id}"

  key_permissions = "${var.app_keys_permissions}"
  secret_permissions = "${var.app_secrets_permissions}"
} 

然后当我运行应用命令时,我收到以下错误:

azurerm_key_vault_access_policy.pol1: "object_id" is an invalid UUUID: encoding/hex: invalid byte: U+002F '/'

这可能是看起来像带有斜线的 url 的 id,所以这不起作用,因为我只需要 GUID。


我还尝试了来自 Terraform grant azure function app with msi access to azure keyvault 的建议,将 object_id = "${lookup(azurerm_app_service.app1.identity[0],"principal_id")}" 用于应用服务而不是该函数,我得到一个错误:

 azurerm_key_vault_access_policy.appPolicy1: At column 43, line 1: list "azurerm_app_service.app1.identity" does not have any elements so cannot determine type. in:

${lookup(azurerm_app_service.app1.identity[0],"principal_id")}

有人可以帮我解决这个 object_id 吗?

谢谢

【问题讨论】:

    标签: azure terraform azure-keyvault


    【解决方案1】:

    当您阅读 azurerm_key_vault_access_policy 属性 object_id 的描述时,您应该知道它可能表示 Web 应用程序主体 ID。

    并且您放置的 azurerm_app_service.myApp.id 不是主体 ID,而是应用服务资源 ID。您应该放置与您的 Web 应用关联的 azurerm_app_service.myApp.identity.principal_id。看看Attributes of the App Service Resource。希望这会对你有所帮助。

    但是,文档中没有提到需要在 app_service 声明中指定标识块。

    identity { type = "SystemAssigned" }
    

    如果你不指定它,你可能会得到一个空列表作为身份属性。

    【讨论】:

    • 这是我最初遇到的问题。文档说:您可以通过以下方式访问主体 ID:${azurerm_app_service.test.identity.0.principal_id} 和租户 ID:${azurerm_app_service.test.identity.0.principal_id} 因此,当我尝试获取主体 ID:object_id = "${azurerm_app_service.app1.identity.0.principal_id}" 时,会出现以下错误:* azurerm_key_vault_access_policy.appPolicy1: Resource 'azurerm_app_service.app1' does not have attribute 'identity.0.principal_id' for variable 'azurerm_app_service.app1.identity.0.principal_id'
    • 如果您在应用服务资源中设置,您可以使用主体 ID。你设置了吗?
    • 您能否再解释一下。是不是我也应该创建 azuread_service_principal 并分配 application_id 然后 app1 将拥有 identity.0.principal_id。还是您的意思是我应该在 azurerm_app_service 中包含 identity 部分并在其中包含主体 ID?
    • 你说的有两种方法可以做到。我是说第二个。但我认为它们都可以为你工作。
    • 好的。似乎将 identity { type = "SystemAssigned" } 添加到 azurerm_app_service 就可以了,现在 output "application_identity_principal_id" { value = "${azurerm_app_service.app1.identity.0.principal_id}" } 显示了 id。我认为这将解决我的问题。感谢您指出对身份分配的明确需求。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-09-28
    • 1970-01-01
    • 1970-01-01
    • 2021-11-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多