使用Terraform部署Azure ARM资源报invalid character '\r'错误如何排查
invalid character '\r' in string literal 报错排查指南 常见错误来源
- Terraform 配置内嵌入ARM模板的行尾符问题:如果ARM模板是直接写在Terraform的heredoc块(
<<EOF/<<JSON等语法)里,Windows环境下编辑的tf文件默认行尾为\r\n(CRLF),部分Terraform版本会把heredoc内未转义的\r识别为JSON字符串的非法字符,单独导出ARM静态内容检查时会被编辑器自动过滤,因此找不到对应字符。 - 独立ARM模板的隐藏字符问题:若你通过
file/templatefile函数读取独立的ARM模板文件,文件如果是带BOM的UTF-8编码,或行尾为CRLF,读取时\r字符会被带入最终拼接的JSON结构,普通文本编辑器默认不会显示这类控制字符,排查时容易忽略。 - 动态注入值携带隐藏字符:如果ARM模板内的参数是通过Terraform变量、外部数据源、本地执行命令输出传入的,这些值如果来自Windows系统输出、剪贴板或带CRLF的文本文件,也会携带
\r进入最终的JSON字符串,静态排查ARM模板自然无法发现。
定位排查方法
- 扫描文件原始十六进制内容确认
\r存在:\r的十六进制编码为0D,可通过命令直接扫描相关文件的原始字节:
Linux/macOS 扫描指定文件:cat your-file-path | hexdump -C | grep 0d
Windows PowerShell 扫描指定文件:Get-Content .\your-file-path -Encoding Byte | ForEach-Object { $_.ToString("X2") } | Select-String "0D"
需要扫描的文件包括所有tf配置文件、独立ARM模板文件、涉及变量取值的数据源文件。 - 输出渲染后的完整ARM模板校验:在Terraform配置中新增临时output块,打印最终传给Azure的完整ARM模板内容,再对输出内容做扫描:
执行output "rendered_arm_template" { value = your_arm_template_expression # 替换为你实际传入azurerm_resource_group_template_deployment的template_content参数的表达式即可 }terraform apply后把输出的内容存为本地JSON文件,再按上述方法扫描\r字符。 - 统一文件编码与行尾符:把所有相关文件的行尾符统一设置为LF,编码设置为不带BOM的UTF-8,大部分代码编辑器(如VS Code)可直接点击右下角状态栏的行尾符/编码按钮一键转换,转换后重新执行Terraform命令验证。
内容的提问来源于stack exchange,提问作者David.d
相关产品推荐
相关产品推荐

