使用GitHub Actions自动化Terraform导入:Terragrunt Show导出JSON报错及资源提取
已成功通过Terragrunt将手动创建的AWS Lambda函数导入Terraform管理,现需执行terragrunt show -json并将结果导出到文件,供后续Python脚本生成管理该Lambda的Terraform新模块。但在GitHub Actions中使用terragrunt-action执行show -json > myfile.txt时,出现"too many arguments"错误。
错误原因
terragrunt-action的tg_command参数会将整个传入的字符串当作命令的参数列表解析,>和myfile.txt会被识别为show命令的额外参数,导致参数数量超出预期,触发报错。
解决方案
方法1:直接用Shell命令执行Terragrunt
跳过terragrunt-action,直接用GitHub Actions的run步骤调用terragrunt命令,这样可以正常使用Shell重定向功能:
- name: 导出Terragrunt Show结果到文件 working-directory: target-repo run: | terragrunt show -json > myfile.txt env: AWS_SDK_LOAD_CONFIG: 1 TERRAFORM_VERSION: ${{ github.event.inputs.tf_version }} TERRAGRUNT_VERSION: ${{ github.event.inputs.tg_version }}
注意:需确保Runner环境已安装对应版本的Terraform和Terragrunt,若未安装,可在该步骤前添加安装命令。
方法2:通过步骤输出捕获后写入文件
若坚持使用terragrunt-action,可先将show -json的输出捕获到步骤输出中,再写入文件:
- name: 执行Terragrunt Show id: terragrunt_show uses: gruntwork-io/terragrunt-action@v2 with: tf_version: ${{ github.event.inputs.tf_version }} tg_command: 'show -json' tg_version: ${{ github.event.inputs.tg_version }} tg_dir: target-repo env: AWS_SDK_LOAD_CONFIG: 1 - name: 将输出写入文件 working-directory: target-repo run: printf "%s" "${{ steps.terragrunt_show.outputs.stdout }}" > myfile.txt
用
printf替代echo可避免特殊字符转义问题,确保输出内容完整准确。
方法3:通过Terraform Output提取特定属性(可选)
若只需获取Lambda的核心属性,可先在Terraform配置中添加Output块,再导出指定Output的JSON:
在你的Terraform资源文件中添加:
output "lambda_details" { value = aws_lambda_function.imported_lambda }
然后在GitHub Actions中执行:
- name: 导出Lambda属性到文件 working-directory: target-repo run: terragrunt output -json lambda_details > lambda_details.json env: AWS_SDK_LOAD_CONFIG: 1
此方法可缩小后续Python脚本处理的数据范围,提升效率。
内容的提问来源于stack exchange,提问作者sakshi

