【发布时间】:2021-06-02 18:41:52
【问题描述】:
我正在构建一个 terraform 模板来创建 Azure 资源,包括 Keyvault Secrets。客户订阅政策不允许任何人更新/删除/查看 keyvault 机密。
如果我第一次运行terraform apply,它将完美运行。但是,再次运行相同的模板会出现以下错误:错误:
Error updating Key Vault "####" (Resource Group "####"): keyvault.VaultsClient#Update: Failure responding to request: StatusCode=403 --
Original Error: autorest/azure: Service returned an error. Status=403 Code="RequestDisallowedByPolicy" Message="Resource '###' was disallowed by policy. Policy identifiers: '[{\"policyAssignment\":{\"name\":\"###nis-deny-keyvault-acl\", ...
on ..\..\modules\azure\keyvault\main.tf line 15, in resource "azurerm_key_vault" "keyvault":
15: resource "azurerm_key_vault" "keyvault" {
- 如何让我的 CI/CD 正常工作,而这意味着 terraform apply 将持续运行?
- 有没有办法在 terraform 中通过此策略?
- 有没有办法阻止 terraform 在 KV 创建后更新 KV(锁定资源除外)?
这里是 Keyvault 模块:
variable "keyvault_id" {
type = string
}
variable "secrets" {
type = map(string)
}
locals {
secret_names = keys(var.secrets)
}
resource "azurerm_key_vault_secret" "secret" {
count = length(var.secrets)
name = local.secret_names[count.index]
value = var.secrets[local.secret_names[count.index]]
key_vault_id = var.keyvault_id
}
data "azurerm_key_vault_secret" "secrets" {
count = length(var.secrets)
depends_on = [azurerm_key_vault_secret.secret]
name = local.secret_names[count.index]
key_vault_id = var.keyvault_id
}
output "keyvault_secret_attributes" {
value = [for i in range(length(azurerm_key_vault_secret.secret.*.id)) : data.azurerm_key_vault_secret.secrets[i]]
}
这是我模板中的模块:
locals {
secrets_map = {
appinsights-key = module.app_insights.app_insights_instrumentation_key
storage-account-key = module.storage_account.primary_access_key
}
output_secret_map = {
for secret in module.keyvault_secrets.keyvault_secret_attributes :
secret.name => secret.id
}
}
module "keyvault" {
source = "../../modules/azure/keyvault"
keyvault_name = local.kv_name
resource_group_name = azurerm_resource_group.app_rg.name
}
module "keyvault_secrets" {
source = "../../modules/azure/keyvault-secret"
keyvault_id = module.keyvault.keyvault_id
secrets = local.secrets_map
}
module "app_service_keyvault_access_policy" {
source = "../../modules/azure/keyvault-policy"
vault_id = module.keyvault.keyvault_id
tenant_id = module.app_service.app_service_identity_tenant_id
object_ids = module.app_service.app_service_identity_object_ids
key_permissions = ["get", "list"]
secret_permissions = ["get", "list"]
certificate_permissions = ["get", "list"]
}
【问题讨论】:
-
您需要提供整个 Terraform 模板代码,以便我们找出问题所在。
-
@CharlesXu 添加的 KV 秘密模块的代码以及模板中的模块调用。
-
我认为您的问题并未表明 Terraform 代码的真正目的是什么。该错误表示您的密钥保管库未设置访问策略。
标签: continuous-integration terraform continuous-deployment terraform-provider-azure