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"
}
}
输出:
我们正在使用 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"
}
}
输出: