Terraform执行local-exec报参数定义需以换行结尾错误咨询
报错含义
该报错属于Terraform配置语法解析错误,代表Terraform在扫描配置文件时,识别到某条参数定义没有按照语法要求以换行收尾,解析流程无法继续。这类报错绝大多数不是真的漏写了换行,而是字符串引号、括号不匹配导致解析器误判参数的结束位置。
触发原因
- 直接诱因是
command参数的双引号嵌套未做转义:配置中最外层使用双引号包裹整个shell命令字符串,但字符串内部直接书写了(dirname "{PWD}")片段,片段内的未转义双引号会被Terraform识别为整个command字符串的结束标记,后续剩余的命令内容会被判定为参数结束后多余的非法字符,最终触发参数未以换行结尾的报错。 - 配置中还存在两处隐性语法问题:
- 书写的
(dirname "{PWD}")不符合shell命令替换的语法规则,正确的命令替换格式应为$(dirname "$PWD") - Terraform自带路径内置常量,直接在命令中调用shell取
$PWD容易出现执行路径和预期不符的问题,优先使用path.cwd(当前执行terraform命令的目录)或path.module(当前配置文件所在目录)替代更稳定。
- 书写的
修正参考
使用Terraform的heredoc语法书写长shell命令,可以彻底避免多层引号嵌套的转义问题,修正后的配置如下:
resource "null_resource" "install_dependencies" { provisioner "local-exec" { command = <<-EOT docker run -v "$(dirname "$PWD"):/var/task" "public.ecr.aws/sam/build-${local.python_runtime}" /bin/sh -c "pip install -r ${var.package_requirements_path} -t ${var.lambda_function_source_directory}; exit" EOT } triggers = { dependencies_versions = filemd5(var.package_requirements_path) } }
如果不想使用heredoc,也可以保留双引号包裹命令的写法,只需要把字符串内部的所有双引号用\转义即可,但这种写法可读性差,后续修改命令很容易再次出现引号匹配错误。
内容的提问来源于stack exchange,提问作者theSekyi
相关产品推荐
相关产品推荐

