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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 14:27:17