Terraform读取Secrets Manager密钥至RDS时jsondecode报错求助
解决Terraform jsondecode解析Secrets Manager密钥时的换行符错误
问题原因
报错提示invalid character '\n' in string literal,说明从AWS Secrets Manager读取的secret_string包含未转义的换行符,jsondecode函数无法解析带有这类字符的JSON字符串。通常是因为Secrets Manager中存储的JSON是格式化后的(带换行、缩进),而非紧凑格式。
解决方案
1. 清理字符串中的换行符
修改locals块,在jsondecode前用replace函数移除所有换行符:
locals { your_secret = jsondecode( replace(data.aws_secretsmanager_secret_version.creds.secret_string, "\n", "") ) }
如果还有制表符或多余空格,可使用regex_replace统一替换为单个空格:
locals { your_secret = jsondecode( regex_replace(data.aws_secretsmanager_secret_version.creds.secret_string, "\\s+", " ") ) }
2. 验证Secrets Manager中的JSON格式
登录AWS控制台,检查Secrets Manager中存储的密钥内容,确保是合法的JSON格式:
- 避免多余的换行、缩进
- 确保引号配对正确,逗号使用规范
- 示例正确格式:
{"username":"admin","password":"your_secure_password"}
3. 调试原始字符串(可选)
若不确定问题所在,可添加输出查看原始密钥内容:
output "raw_secret_string" { value = data.aws_secretsmanager_secret_version.creds.secret_string sensitive = true # 避免明文输出敏感信息 }
执行terraform refresh后,通过terraform output raw_secret_string查看原始字符串,定位具体格式问题。
修改后的完整示例
data "aws_secretsmanager_secret_version" "creds" { secret_id = "your_secret" } locals { your_secret = jsondecode( replace(data.aws_secretsmanager_secret_version.creds.secret_string, "\n", "") ) } resource "aws_db_instance" "example" { engine = "mysql" engine_version = "8.0" instance_class = "db.t3.micro" name = "example_db" username = local.your_secret.username password = local.your_secret.password # 其他必要配置... }
内容的提问来源于stack exchange,提问作者bhawna
相关产品推荐
相关产品推荐

