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
相关产品推荐
相关产品推荐

