You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.29 17:32:57