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

Terraform更新Secrets Manager密钥报错:secret_string需为字符串类型

解决Terraform Secrets Manager版本的类型错误

错误原因

aws_secretsmanager_secret_version的secret_string属性要求传入JSON格式的字符串,但你用jsondecode(local.database_url)把手动拼接的JSON字符串转成了Terraform的map对象,类型不匹配导致报错。

修复方案

不要手动拼接JSON字符串,通过以下步骤安全更新密钥:

  1. 读取现有密钥内容
    先获取现有密钥的完整数据,避免覆盖原有键值对:
data "aws_secretsmanager_secret_version" "existing_secret" {
  secret_id = "some existing secret"
}
  1. 合并原有数据与新键值
    解析现有密钥为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}"
    }
  )
}
  1. 生成符合要求的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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 10:50:23