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

