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

Terraform从AWS Secrets Manager读取密钥值格式错误带多余转义引号问题

问题根因

转义符异常是双重JSON编码导致的:

  • 往Secrets Manager写入密钥时,你把"1.1.1.1/1", "2.2.2.2/2"这段带双引号的内容整体作为普通字符串赋值给了example字段。Secrets Manager存储键值对结构时会自动对字符串内的双引号做转义,最终实际存储的JSON结构等价于:
{
  "example": "\"1.1.1.1/1\", \"2.2.2.2/2\""
}
  • Terraform里的jsondecode仅解析了最外层的Secrets Manager密钥结构,返回的example字段值本身仍是一段被转义过的字符串,因此会携带多余的\"符号。
解决方案

方案1:修正Secrets Manager侧的密钥存储格式(长期推荐)

直接调整Secrets Manager中存储的密钥内容,去掉值外层多余的双引号,根据实际使用场景选择存储结构:

  • 如果后续需要遍历使用这些CIDR段,直接存为数组类型,密钥明文如下:
{
  "example": ["1.1.1.1/1", "2.2.2.2/2"]
}
  • 如果需要使用逗号分隔的字符串格式,直接去掉值两端手动添加的双引号,密钥明文如下:
{
  "example": "1.1.1.1/1, 2.2.2.2/2"
}

修改完成后,原有Terraform读取代码无需调整,即可直接获取符合预期的原始值。

方案2:Terraform侧做兼容处理(临时方案,无需修改存量密钥)

如果暂时无法调整Secrets Manager中的存量密钥,可以在Terraform中对读取到的值做二次处理:

  • 如果需要拿到CIDR数组,由于当前返回的example值本质是多了一层编码的JSON字符串片段,补全数组格式后二次解码即可:
locals {
  secret_full = jsondecode(nonsensitive(data.aws_secretsmanager_secret_version.example.secret_string))
  example_cidr_list = jsondecode("[${local.secret_full.example}]")
}
  • 如果只需要拿到无转义的逗号分隔字符串,直接替换掉多余的转义引号即可:
locals {
  example_cidr_str = replace(
    jsondecode(nonsensitive(data.aws_secretsmanager_secret_version.example.secret_string)).example,
    "\\"",
    ""
  )
}

注意:该兼容方案和错误的存储格式强绑定,一旦后续有人修正了Secrets Manager中的密钥格式,这段逻辑会直接报错,生产环境优先使用方案1从存储侧解决问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 07:30:50