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

Terraform使用archive_file后Lambda函数找不到zip文件的问题

问题排查与解决

核心问题大概率是路径变量误用或流水线工作目录不匹配,以下是具体分析和修复方案:

1. 理清Terraform路径变量的实际指向

Terraform的${path.root}是根模块的路径(即执行terraform init/apply时所在的目录对应的模块路径);${path.module}是当前模块(main.tf所在目录)的路径。

你的main.tf位于Infrastructure/Lambda下,若流水线在Infrastructure目录执行Terraform命令:

  • ${path.root} = Infrastructure
  • ${path.module} = Infrastructure/Lambda

如果手动写路径时混淆了这两个变量,就会导致文件生成路径和读取路径不匹配。

2. 最可靠的修复:用${path.module}统一路径+直接引用资源属性

不管流水线工作目录如何配置,用${path.module}指向当前模块路径,同时直接引用archive_file的输出路径,彻底避免路径错误:

修改你的Terraform代码:

data "archive_file" "lambda_zip" {
  source_dir  = "${path.module}/scripts"  # 明确指向当前模块下的scripts目录
  output_path = "${path.module}/test.zip"  # 将zip生成到当前模块目录(Infrastructure/Lambda/test.zip)
}

resource "aws_lambda_function" "test" {
  filename      = data.archive_file.lambda_zip.output_path  # 直接引用archive_file的输出路径,无需手动写路径
  function_name = "test-lambda"
  runtime       = "python3.9"
  handler       = "index.lambda_handler"
  role          = aws_iam_role.lambda_role.arn
  
  # 无需额外配置depends_on,因为引用了archive_file的属性,Terraform会自动处理依赖顺序
}

3. 检查流水线的工作目录配置

确认流水线执行Terraform命令时,要么工作目录是Infrastructure,要么用-chdir参数指定根模块路径:

terraform -chdir=Infrastructure init
terraform -chdir=Infrastructure apply -auto-approve

如果流水线未指定-chdir且在Infrastructure的父目录执行,根模块会被识别为父目录,所有路径都会错位。

4. 排查流水线的文件清理机制

部分流水线会在执行apply前清理临时文件,可在流水线中添加一步前置检查,确认zip文件是否存在:

# 假设工作目录为Infrastructure
ls -la Lambda/test.zip

若文件不存在,说明archive_file的source_dir路径错误(比如指向了不存在的目录,Terraform不会报错但会生成空zip,甚至可能因权限问题未生成文件)。

内容的提问来源于stack exchange,提问作者Christian Townsend

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 05:45:32