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

使用Terraform的fileset()归档文件部署Lambda遇错求助

问题解决方法

错误根源

你错误地给data.archive_file.test整个数据块设置了for_each,这会让Terraform创建多个archive_file实例(每个JSON文件对应一个),但你实际只需要一个包含所有目标文件的单一Zip包,完全不符合需求,因此引发后续引用错误。

正确方案

以下两种方法均可实现需求,选择适合你的方式:

方法1:用source_dir配合excludes(简洁高效)

直接指定源目录,排除不需要打包的文件,自动保留原有目录结构:

data "archive_file" "test" {
  type        = "zip"
  output_path = ".terraform/test.zip"
  source_dir  = "src"

  # 排除不需要打包的文件
  excludes = [
    "shared/random.py",
    "shared/something.py"
  ]
}

方法2:用dynamic source块精确控制文件路径

如果你需要自定义Zip内的文件路径(比如把test.py放在Zip根目录),可以用dynamic块遍历生成多个source条目:

data "archive_file" "test" {
  type        = "zip"
  output_path = ".terraform/test.zip"

  # 将test.py放在Zip根目录
  source {
    content  = file("src/lambda/test.py")
    filename = "test.py"
  }

  # 遍历shared目录下需要的文件
  dynamic "source" {
    for_each = toset([
      "shared/constants.py",
      "shared/utils.py",
      "shared/exceptions.py"
    ])
    content {
      content  = file("src/${source.value}")
      filename = "src/${source.value}"
    }
  }

  # 遍历dummyjsons目录下所有JSON文件
  dynamic "source" {
    for_each = fileset("src/dummyjsons", "*.json")
    content {
      content  = file("src/dummyjsons/${source.value}")
      filename = "src/dummyjsons/${source.value}"
    }
  }
}

Lambda资源块恢复原有写法

无论用哪种方法,aws_lambda_function块都不需要修改,保持最初的引用即可:

resource "aws_lambda_function" "test" {
  # 其他必填属性(如function_name、role、handler等)

  filename         = data.archive_file.test.output_path
  source_code_hash = data.archive_file.test.output_base64sha256

  # 其他属性
}

内容的提问来源于stack exchange,提问作者Siddarth Patil

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.25 05:52:49