Terraform AWS CodeBuild项目加载buildspec.yml失败:模板渲染出现插值表达式错误
解决Terraform解析CodeBuild buildspec.yml时的插值表达式错误
你的问题根源在于Terraform的template_file数据源和CodeBuild的变量语法冲突了——template_file会把文件里的${}当成自己的插值表达式去解析,但你buildspec里的${ps_asset_url}是给CodeBuild用的Parameter Store变量引用,并不是Terraform变量,这就导致Terraform解析时因找不到对应变量、语法不匹配而报错。
下面给你两个实用的解决方案,按需选择即可:
方案1:用file函数替代template_file(推荐,无Terraform变量注入需求时)
既然你当前只是单纯读取buildspec内容,没有要替换的Terraform变量,完全可以跳过template_file,直接用file函数读取文件原始内容——它不会解析文件内的${}语法,直接把内容原封不动传给CodeBuild:
修改你的CodeBuild配置:
source { buildspec = file("${path.module}/buildspec.yml") git_clone_depth = 0 insecure_ssl = false report_build_status = false type = "CODEPIPELINE" }
之后删掉那个data "template_file" "buildspec"的代码块就好,不用再维护它了。
方案2:转义${}符号(需保留模板渲染能力时)
如果你以后要在buildspec里注入Terraform变量,或者必须使用模板渲染的话,把buildspec里所有属于CodeBuild的${}改成$${}——这样Terraform渲染后会自动把$${}转成${},既满足Terraform的解析要求,又能让CodeBuild正确识别变量:
修改后的buildspec.yml:
version: 0.2 env: parameter-store: PS_ASSET_S3_URL : "$${ps_asset_url}" phases: pre_build: on-failure: ABORT commands: - echo Logging in to Amazon ECR... - IMAGE_TAG=${COMMIT_HASH:=latest}
另外,如果你用的是Terraform 0.12及以上版本,更推荐用内置的templatefile函数替代旧的template_file数据源,语法更简洁:
source { buildspec = templatefile("${path.module}/buildspec.yml", {}) # 空字典表示没有要注入的变量 # 其他配置保持不变 }
内容的提问来源于stack exchange,提问作者Seifolah
相关产品推荐
相关产品推荐

