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

在Makefile中使用sed替换Terraform输出变量到模板文件问题求解

Makefile中sed替换Terraform输出变量失败解决方案

问题根因

  • sed命令使用单引号包裹替换规则,单引号会阻止Make对内部变量进行展开,也会阻止Shell解析变量,无论用$$()还是${}写法,都会被当成普通字符串输出,无法替换为实际的桶名
  • jq默认输出带前后双引号的JSON格式字符串,没有加-r参数的情况下,拿到的存储桶、表名会自带冗余引号
  • 原sed命令末尾多了一个冗余的右括号),存在语法错误

修复步骤

  1. 调整变量定义,添加jq -r参数输出无引号的原始值
# 定义Make全局变量,:= 表示只执行一次shell命令避免重复调用
S3_BUCKET_NAME_STATE := $(shell terraform output -json | jq -r '.S3_Bucket.value')
DYNAMODB_LOCK := $(shell terraform output -json | jq -r '.dynamo_db_lock.value')
  1. 调整sed命令,用双引号包裹替换规则,支持变量自动展开
    如果存储桶名可能包含/字符,建议将sed的分隔符替换为#等不会出现在桶名中的符号,避免语法冲突:
sed "s#{{ BUCKET_NAME }}#$(S3_BUCKET_NAME_STATE)#g" variables.tf.template > variables.tf

注意:Makefile中目标下的命令行必须以制表符(Tab)开头,不能使用空格缩进,否则会触发Make语法错误。

完整可运行示例

.PHONY: generate-tf

# 提前拉取Terraform输出变量
S3_BUCKET_NAME_STATE := $(shell terraform output -json | jq -r '.S3_Bucket.value')
DYNAMODB_LOCK := $(shell terraform output -json | jq -r '.dynamo_db_lock.value')

generate-tf:
	@echo "生成variables.tf文件..."
	@sed "s#{{ BUCKET_NAME }}#$(S3_BUCKET_NAME_STATE)#g" variables.tf.template > variables.tf
	@sed "s#{{ DYNAMODB_LOCK }}#$(DYNAMODB_LOCK)#g" -i variables.tf

执行make generate-tf即可完成替换。

内容的提问来源于stack exchange,提问作者David Villasmil

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 17:45:03