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
相关产品推荐
相关产品推荐

