【问题标题】:Terraform does not wait for update of azurerm_key_vault_secret.xyz.idTerraform 不等待 azurerm_key_vault_secret.xyz.id 的更新
【发布时间】:2022-01-15 01:29:12
【问题描述】:

我们正在使用 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 并更改密码时,函数应用程序指向旧版本的密码。看来azurerm_key_vault_secret.my_secret.id 是在更新机密之前被读取的。

有人知道,我如何确保 function_app 将等待密钥的更新?

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

【问题讨论】:

  • 如果您知道更新日志所需的时间,您可以引入延迟?
  • 您必须自己使用External Data Source 编写这样的逻辑。
  • 我没有提供答案,只是评论,因此可能会给出更好的答案。但你的问题并不新鲜。遗憾的是,并非 TF 中所有可能的资源都是同步的。有些是异步的,TF 不会等待它们完全完成配置或更新。
  • 哦,另外请确保您使用的是最新的 TF 和 azure 提供程序。这可能是一个错误,并且可能已经修复。
  • 我会等待一段时间,看看是否有人提供了更优雅的解决方案。如果这不会发生,我会接受。

标签: terraform azure-keyvault terraform-provider-azure


【解决方案1】:

当您更新密钥保管库机密时,更改由密钥保管库 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"
  }
}

输出:

【讨论】:

  • 从日志来看,它似乎工作正常。但是,如果直接在函数应用程序中添加depends_on [ azurerm_key_vault_secret.example ] 不能正常工作,为什么这能工作?
  • @Woozar,正如我在回答中提到的,id 的更改由 azure 端的 keyvault ui 管理.. 即使 terraform 在应用后创建它,只有 id 得到更改.. 但是当数据源是使用您告诉 terraform 检查在更改秘密值时更改的所有属性。
猜你喜欢
  • 1970-01-01
  • 2020-09-21
  • 2021-11-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-12-18
相关资源
最近更新 更多