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

如何使用archive_file打包node_modules与lambda handler资源?

方案1:调用系统zip命令(兼容性最好,无额外依赖要求)

直接通过Terraform的external数据源调用本地原生的zip命令打包两个目录,完全不修改本地文件结构,可根据需要自行调整压缩包内的文件层级:

data "external" "lambda_zip" {
  program = ["bash", "-c", <<EOT
    set -e
    OUTPUT_PATH="$1"
    # 进入dist目录执行打包,保证dist内的编译产物直接在压缩包根目录
    cd "${path.module}/../dist"
    zip -r "$OUTPUT_PATH" ./* ../node_modules -q
    # 输出符合external数据源要求的JSON格式
    jq -n --arg path "$OUTPUT_PATH" '{"output_path": $path}'
  EOT
  , "${path.module}/../${var.tempfolder}/${local.prefix}.zip"]
}

# 后续Lambda资源引用时使用 data.external.lambda_zip.result.output_path 取压缩包路径即可

如果是Windows环境可以替换成PowerShell的Compress-Archive命令实现相同逻辑。


方案2:使用archive provider的sources参数(纯Terraform实现,无需调用外部命令)

将hashicorp/archive provider升级到v2.2.0及以上版本(该版本完全兼容Terraform 1.0.x),即可使用支持多路径输入的sources列表参数,配合fileset函数读取两个目录的所有文件:

data "archive_file" "lambda_zip_file" {
  type        = "zip"
  output_path = "${path.module}/../${var.tempfolder}/${local.prefix}.zip"
  # 合并两个目录的所有文件路径,可根据需要的压缩包内层级调整base路径和匹配规则
  sources = setunion(
    fileset("${path.module}/../dist", "**"),
    fileset("${path.module}/../node_modules", "**")
  )
}

该方案为纯Terraform原生实现,不需要依赖系统的zip命令,跨平台兼容性更好。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 03:24:04