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

需求:基于单一模板与Makefile在账户专属目录生成TF文件

需求说明

基于现有以ami.template为输入的Makefile工作流,需调整实现:用唯一模板与Makefile从根目录出发,根据输入将TF文件生成到对应账户的专属文件夹中,目标目录结构示例如下:

demo-account-1
  ami_demo-account-1_us-east-1.tf
  ami_demo-account-1_us-east-2.tf
demo-account-2
  ami_demo-account-2_eu-east-1.tf
  ami_demo-account-2_ap-south-1.tf

现有配置与文件内容

当前环境变量配置

export regions=us-east-1 ;
export aws_account_alias=demo-account

现有Makefile内容

default, help::
    @echo "USAGE:"
    @echo "then make all"

all : preprocess

preprocess:
    REGIONS="${regions}" ACCOUNTS="${aws_account_alias}" ./preprocess.sh ami.template

现有ami.template内容

provider "aws" {
  alias  = "${REGION}"
  region = "${REGION}"
}

module "ami_${aws_account_alias}_${regions}" {
  count             = contains(var.regions, "${REGION}")
  source            = "./modules/ami/"
  providers = {
    aws = aws.${REGION}
  }
}

现有preprocess.sh内容

#!/bin/bash

for template in $*
do
    BASE_NAME=$(basename "${template}" .tf.template)
    for region in ${REGIONS}
    do
        # shellcheck disable=SC2002
        cat "${template}" | REGION=${region} envsubst > "${BASE_NAME}"."${region}".tf
    done
done

修改实现方案

1. 调整preprocess.sh脚本

新增账户目录创建逻辑,修改输出文件的命名与路径,支持多账户多区域:

#!/bin/bash

# 遍历传入的所有模板文件
for template in "$@"
do
    # 获取模板基础名称(移除.tf.template后缀)
    BASE_NAME=$(basename "${template}" .tf.template)
    # 遍历每个目标账户(ACCOUNTS环境变量用空格分隔多账户)
    for account in ${ACCOUNTS}
    do
        # 创建账户专属目录,已存在则跳过
        mkdir -p "${account}"
        # 遍历每个目标区域
        for region in ${REGIONS}
        do
            # 替换模板变量,生成到对应账户目录下,文件名包含账户与区域标识
            envsubst '${REGION},${aws_account_alias}' < "${template}" > "${account}/${BASE_NAME}_${account}_${region}.tf"
        done
    done
done

2. 优化Makefile(支持多账户输入提示)

更新提示信息,明确支持多账户多区域的环境变量配置方式:

default, help::
    @echo "USAGE:"
    @echo "  export regions=\"us-east-1 us-east-2\""
    @echo "  export aws_account_alias=\"demo-account-1 demo-account-2\""
    @echo "  then make all"

all : preprocess

preprocess:
    REGIONS="${regions}" ACCOUNTS="${aws_account_alias}" ./preprocess.sh ami.template

3. 修正ami.template变量引用

将模块名称中的全局区域变量${regions}改为当前区域变量${REGION},确保命名准确:

provider "aws" {
  alias  = "${REGION}"
  region = "${REGION}"
}

module "ami_${aws_account_alias}_${REGION}" {
  count             = contains(var.regions, "${REGION}")
  source            = "./modules/ami/"
  providers = {
    aws = aws.${REGION}
  }
}

使用示例

  1. 设置环境变量(支持同时指定多账户多区域):
export regions="us-east-1 us-east-2 eu-east-1 ap-south-1"
export aws_account_alias="demo-account-1 demo-account-2"
  1. 执行命令生成文件:
make all

内容的提问来源于stack exchange,提问作者Satyam Pandey

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 12:30:00