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

Terraform部署Lambda函数报错:filename与s3_bucket不可同时指定

问题分析与解决方案

核心问题

你遇到的两个报错根源是对terraform-aws-modules/lambda/aws模块的参数逻辑理解偏差:

  1. local_existing_package参数会自动触发模块使用本地包(即设置filename),与s3_bucket参数互斥,因此触发“只能指定filename/image_uri/s3_bucket中的一个”的报错。
  2. 直接传入s3_key不被识别,是因为不同使用场景下,模块的参数规则不同:当通过本地包上传到S3时,s3_key不是直接输入参数;当直接引用S3已有包时,才需要配合s3_bucket传入s3_key。

分场景解决方案

场景1:上传本地包到指定S3桶后部署Lambda

如果你需要将module.package生成的本地包上传到自己的S3桶,修改代码如下:

module "lambda_function"{
  source  = "terraform-aws-modules/lambda/aws"
  local_existing_package = "${path.root}/${module.package.local_filename}"
    
  function_name = local.name
  description   = var.lambda_description
  handler       = var.lambda_handler
  runtime       = "nodejs20.x"
  store_on_s3 = true
  existing_s3_bucket = var.lambda_s3_bucket # 替换原s3_bucket参数
  package_name = "your-custom-package.zip" # 可选:自定义S3中的对象键名(即原想设置的s3_key)
}
  • 用existing_s3_bucket指定你的自定义S3桶,而非s3_bucket(该参数用于直接引用S3已有包)。
  • 若需自定义S3对象的键名,通过package_name参数设置,无需直接传入s3_key。

场景2:直接使用S3桶中已存在的包部署Lambda

如果你不需要上传本地包,直接引用S3中已有的包,修改代码如下:

module "lambda_function"{
  source  = "terraform-aws-modules/lambda/aws"
  # 移除local_existing_package参数
  function_name = local.name
  description   = var.lambda_description
  handler       = var.lambda_handler
  runtime       = "nodejs20.x"
  # 移除store_on_s3=true(该参数用于上传本地包)
  s3_bucket   = var.lambda_s3_bucket
  s3_key      = "path/to/your/package.zip" # 此时可正常指定s3_key
}
  • 移除local_existing_package和store_on_s3=true,避免与s3_bucket参数互斥。
  • 直接通过s3_bucket和s3_key指定S3中已有的包路径。

补充说明

你之前尝试将filename、image_uri设为null无效,是因为local_existing_package会强制模块使用本地包逻辑,自动覆盖filename参数,因此必须通过调整参数组合来解决冲突,而非手动设null。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.25 10:04:53