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

Terraform配置AWS Secrets Manager遇索引无效错误,需正确获取Vault字段值

问题分析与解决方案

错误根源

你遇到的Invalid index错误是因为两个核心问题:

  1. 硬编码了索引[2],但通过for_each生成的data.vault_generic_secret.aws_secrets是映射对象,当前只有键为0的元素,不存在索引2;
  2. 没有从Vault返回的secret中正确提取vault_field指定的字段值,而是直接传入了整个数据资源实例。

修正方案

需要针对aws_secretsmanager_secret_version中的secret_string字段做两处关键修改,同时优化Secret名称避免冲突:

data "vault_generic_secret" "aws_secrets" {
  for_each = { for idx, val in var.aws_secrets : idx => val }

  path = each.value.vault_path
}

resource "aws_secretsmanager_secret" "aws_secrets" {
  for_each = { for idx, val in var.aws_secrets : idx => val }
  # 修正名称:用变量中定义的aws_secret_id作为Secret名称,避免重复冲突
  name = each.value.aws_secret_id
}

resource "aws_secretsmanager_secret_version" "aws_secrets" {
  for_each      = { for idx, val in var.aws_secrets : idx => val }
  secret_id     = aws_secretsmanager_secret.aws_secrets[each.key].id
  # 正确关联当前迭代项的Vault数据,提取指定字段并包装为JSON
  secret_string = jsonencode({
    (each.value.vault_field) = data.vault_generic_secret.aws_secrets[each.key].data[each.value.vault_field]
  })
}

关键修改说明

  • 动态索引关联:用each.key代替硬编码的[2],确保每次迭代都指向当前对应的Vault数据资源实例,匹配for_each的迭代逻辑;
  • 指定字段提取:通过data.vault_generic_secret.aws_secrets[each.key].data[each.value.vault_field]精准获取Vault secret中vault_field定义的字段值;
  • 合法JSON结构:使用Terraform动态键语法(each.value.vault_field),生成以目标字段名为键、对应值为内容的JSON对象,符合AWS Secrets Manager对secret_string的格式要求;
  • 避免名称冲突:将原固定的my-secrets改为变量中的aws_secret_id,防止多个Secret实例因重名创建失败。

内容的提问来源于stack exchange,提问作者J H

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 01:15:54