Terraform更新Secrets Manager密钥报错:secret_string需为字符串类型
解决Terraform Secrets Manager版本的类型错误
错误原因
aws_secretsmanager_secret_version的secret_string属性要求传入JSON格式的字符串,但你用jsondecode(local.database_url)把手动拼接的JSON字符串转成了Terraform的map对象,类型不匹配导致报错。
修复方案
不要手动拼接JSON字符串,通过以下步骤安全更新密钥:
- 读取现有密钥内容
先获取现有密钥的完整数据,避免覆盖原有键值对:
data "aws_secretsmanager_secret_version" "existing_secret" { secret_id = "some existing secret" }
- 合并原有数据与新键值
解析现有密钥为map,再合并新的DATABASE_URL字段:
locals { db_name = "mydb" username = jsondecode(data.aws_secretsmanager_secret_version.rdscreds.secret_string)["rds_username"] password = jsondecode(data.aws_secretsmanager_secret_version.rdscreds.secret_string)["rds_password"] # 解析现有密钥为map existing_secret_data = jsondecode(data.aws_secretsmanager_secret_version.existing_secret.secret_string) # 合并原有数据和新字段 updated_secret_data = merge( local.existing_secret_data, { DATABASE_URL = "postgres://${local.username}:${local.password}@${module.rds.endpoint}/${local.db_name}" } ) }
- 生成符合要求的JSON字符串
用jsonencode将合并后的map转成JSON字符串,传入secret_string:
resource "aws_secretsmanager_secret_version" "example" { secret_id = "some existing secret" secret_string = jsonencode(local.updated_secret_data) }
额外说明
- 手动拼接JSON字符串容易出现转义错误,使用
jsonencode能自动处理特殊字符转义,更可靠。 merge函数会保留原有密钥的所有字段,仅添加/覆盖新的DATABASE_URL字段,避免误删原有数据。
内容的提问来源于stack exchange,提问作者LP13
相关产品推荐
相关产品推荐

