Terraform 不等待 azurerm_key_vault_secret.xyz.id 的更新

Terraform does not wait for update of azurerm_key_vault_secret.xyz.id

我们正在使用 terraform 通过 azurerm 提供程序构建我的 azure 资源。 我们在 terraform 运行 期间注入了一个秘密,这个秘密可能会不时改变。 我们使用 azurerm_key_vault_secret 来存储秘密和具有托管身份的函数应用程序(具有对密钥保管库的读取权限)接收秘密,如下所示:

resource "azurerm_key_vault_secret" "my_secret" {
  name         = "my-secret"
  value        = var.my_secret
  key_vault_id = azurerm_key_vault.default.id
}

resource "azurerm_function_app" "app" {
  name         = "..."
  app_settings = {
      MySecret = "@Microsoft.KeyVault(SecretUri=${azurerm_key_vault_secret.my_secret.id})"
  }
  identity {
    type = "SystemAssigned"
  }
  ...
}

当我 运行 terraform apply 并且 secret 被更改时,函数 app 指向旧版本的 secret。似乎 azurerm_key_vault_secret.my_secret.id 在更新秘密之前正在被读取。

有谁知道我如何确保 function_app 会等待秘密更新?

(是的,id 改变了,我也不喜欢它,但这就是提供者的工作方式。)

当您更新密钥保管库机密时,更改由密钥保管库处理 UI。因此 Terraform 不会检测到 azurerm_key_vault_secret.example.id 上的更改,因此引用也不会被修改。

作为变通方法,您可以使用 数据源 相同的 key vault secret 并在 function-app 中提供它,如下面的代码所示,以便可以从中读取在 key vault secret 中所做的所有更改数据源和更改可以相应地应用:

  resource "azurerm_key_vault_secret" "example" {
  name         = "functionappsecret"
  value        = "changedpassword"
  key_vault_id = azurerm_key_vault.example.id
}

data "azurerm_key_vault_secret" "secret" {
  name="functionappsecret"
  key_vault_id = azurerm_key_vault.example.id
  depends_on = [
    azurerm_key_vault_secret.example
  ]
}
resource "azurerm_function_app" "example" {
  name                       = "ansuman-azure-functions"
  location                   = azurerm_resource_group.example.location
  resource_group_name        = azurerm_resource_group.example.name
  app_service_plan_id        = azurerm_app_service_plan.example.id
  storage_account_name       = azurerm_storage_account.example.name
  storage_account_access_key = azurerm_storage_account.example.primary_access_key
  app_settings = {
      MySecret = "@Microsoft.KeyVault(SecretUri=${data.azurerm_key_vault_secret.secret.id})"
  }

  identity {
    type="SystemAssigned"
  }
}

输出: