Terraform打包Lambda归档:排除目录及文件嵌套问题解决
Terraform打包Lambda函数体积超标问题解决
问题1:为什么zip文件中包含自身?
从你提供的unzip -l输出可以看到,zip文件本身被列在打包内容里,这确实是递归嵌套导致的。因为你把output_path设置在了和source_dir相同的目录(path.module)下,第一次执行terraform apply生成lambda_function_add_user_post.zip后,后续打包操作会把这个已生成的zip文件也纳入source_dir的扫描范围,重复打包进去,最终形成递归嵌套,体积越来越大。
问题2:如何正确排除整个目录并修正配置错误
你的原配置存在两个核心问题:
- 语法错误:
excludes =后面直接换行写数组,Terraform语法要求赋值表达式需保持连贯,等号后应直接跟数组左括号,或调整换行格式保证语法合法。 - fileset用法错误:
fileset函数返回的是字符串列表,直接将其作为数组的一个元素会形成列表嵌套列表,不符合excludes所需的纯字符串列表类型。
正确配置方案
方案1:使用Glob通配符直接排除目录(推荐)
首先将输出的zip文件放到独立子目录,从根源避免递归打包;然后用**通配符一次性排除整个目录的所有内容:
data "archive_file" "lambda_function_add_user_post" { type = "zip" source_dir = "${path.module}" output_path = "${path.module}/build/lambda_function_add_user_post.zip" # 放到子目录避免递归 excludes = [ ".terraform/**", # 排除.terraform目录下所有层级的内容 ".terraform.lock.hcl", "terraform.tfstate", "terraform.tfstate.backup", "venv/**", # 排除venv目录下所有内容 "build/**" # 排除输出目录本身,避免后续打包 ] }
方案2:使用fileset函数结合concat
如果需要用fileset,需通过concat函数将多个列表合并为一个纯字符串列表:
data "archive_file" "lambda_function_add_user_post" { type = "zip" source_dir = "${path.module}" output_path = "${path.module}/build/lambda_function_add_user_post.zip" excludes = concat( fileset("${path.module}", ".terraform/**"), [ ".terraform.lock.hcl", "terraform.tfstate", "terraform.tfstate.backup", "venv/**", "build/**" ] ) }
关键说明
**是Glob通配符,代表匹配目标目录下所有层级的文件和子目录,可实现一键排除整个目录。- 将输出文件放到独立子目录(如
build),彻底避免了zip文件被重复打包的递归问题。
内容的提问来源于stack exchange,提问作者Runeaway3
相关产品推荐
相关产品推荐

