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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.30 08:14:49