Terraform配置AWS Secrets Manager遇索引无效错误,需正确获取Vault字段值
问题分析与解决方案
错误根源
你遇到的Invalid index错误是因为两个核心问题:
- 硬编码了索引
[2],但通过for_each生成的data.vault_generic_secret.aws_secrets是映射对象,当前只有键为0的元素,不存在索引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
相关产品推荐
相关产品推荐

