Terraform部署Lambda函数报错:filename与s3_bucket不可同时指定
问题分析与解决方案
核心问题
你遇到的两个报错根源是对terraform-aws-modules/lambda/aws模块的参数逻辑理解偏差:
local_existing_package参数会自动触发模块使用本地包(即设置filename),与s3_bucket参数互斥,因此触发“只能指定filename/image_uri/s3_bucket中的一个”的报错。- 直接传入
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
相关产品推荐
相关产品推荐

