使用Terraform更新Azure Key Vault密钥过期日期遇错求助
问题:Terraform批量更新Azure Key Vault密钥过期日期失败
尝试通过Terraform脚本批量更新Azure Key Vault中所有密钥的过期日期,编写的脚本如下:
main.tf 原代码
data "azurerm_key_vault" "key_vault_data" { name = var.name resource_group_name = var.resource_group_name } resource "azurerm_key_vault_secret" "all_secrets" { for_each = data.azurerm_key_vault.key_vault_data.secrets name = each.value.name value = each.value.value key_vault_id = data.azurerm_key_vault.key_vault_data.id expiration_date = timestamp() + var.days_to_expire * 24 *60 *60 }
variables.tf 原代码
variable "name" { default = "KV-***" # name of the key vault } variable "resource_group_name" { default = "RG-***" # name of the resource group } variable "days_to_expire" { type = number default = 730 }
执行脚本时触发错误:
Error: Unsupported attribute on .terraform/modules/key_vault/main.tf line 130, in resource "azurerm_key_vault_secret" "all_secrets": 130:for_each = data.azurerm_key_vault.key_vault_data.secrets this object has no argument, nested block, or exported attribute name "secrets".
错误原因
azurerm_key_vault数据源并未导出secrets属性,无法直接通过该数据源获取密钥列表。同时原代码中expiration_date的计算方式错误:timestamp()返回字符串类型,不能直接与数字进行算术运算。
解决方案
步骤1:确认AzureRM Provider版本
确保使用v3.0+版本的AzureRM Provider(该版本支持azurerm_key_vault_secrets数据源),在versions.tf中声明:
terraform { required_providers { azurerm = { source = "hashicorp/azurerm" version = ">= 3.0.0" } } }
步骤2:修正脚本逻辑
先批量获取密钥名称,再逐个拉取密钥当前值,最后更新过期日期。修正后的main.tf代码:
data "azurerm_key_vault" "key_vault_data" { name = var.name resource_group_name = var.resource_group_name } # 获取Key Vault中所有密钥的名称列表 data "azurerm_key_vault_secrets" "all_secret_names" { key_vault_id = data.azurerm_key_vault.key_vault_data.id } # 逐个获取密钥的详细信息 data "azurerm_key_vault_secret" "secret_details" { for_each = toset(data.azurerm_key_vault_secrets.all_secret_names.names) name = each.value key_vault_id = data.azurerm_key_vault.key_vault_data.id } # 更新每个密钥的过期日期 resource "azurerm_key_vault_secret" "updated_secrets" { for_each = data.azurerm_key_vault_secret.secret_details name = each.key value = each.value.value key_vault_id = data.azurerm_key_vault.key_vault_data.id expiration_date = timeadd(timestamp(), "${var.days_to_expire}d") }
关键说明
- 用
azurerm_key_vault_secrets批量获取密钥名称列表 - 通过
azurerm_key_vault_secret逐个拉取密钥原始值,避免覆盖丢失内容 - 用
timeadd函数正确计算过期日期,"${var.days_to_expire}d"表示添加指定天数
内容的提问来源于stack exchange,提问作者sac
相关产品推荐
相关产品推荐

