如何在无源码包的情况下通过Terragrunt部署AWS Lambda函数?
我尝试在不附加Zip包的前提下,通过Terragrunt部署AWS Lambda函数,目标是创建仅包含基础配置的函数并由Terragrunt直接管理。
第一次尝试设置create_package: false时,Terragrunt抛出错误:Could not locate source_path "null";之后我尝试使用 dummy 包,配置local_existing_package: "./dummy.zip"和ignore_source_code_hash: true,但错误依然存在。
两次尝试的配置如下:
第一次尝试配置
- function_name: test-function create_package: false description: "test-function" handler: "lambda_handler"
第二次尝试配置
- function_name: test-function create_package: false local_existing_package: "./dummy.zip" ignore_source_code_hash: true description: "test-function" handler: "lambda_handler"
解决方法
问题核心是:即使禁用自动打包(create_package: false),Terraform/Terragrunt的Lambda模块依然需要明确的代码来源配置,不能完全空缺。以下是可行的解决方案:
1. 用空文件作为代码占位符
创建一个空的对应运行时的文件(比如empty.py对应Python运行时),然后配置固定的源码哈希值,同时明确指定运行时:
- function_name: test-function create_package: false filename: "./empty.py" # 确保本地存在该空文件 source_code_hash: "${base64sha256(\" \")}" # 固定空内容的哈希值 description: "test-function" handler: "lambda_handler" runtime: "python3.11" # 必须指定运行时,匹配handler的语言
这样既满足了模块对代码来源的要求,又不需要实际的业务代码包。
2. 直接使用原生AWS Lambda资源定义
如果使用的第三方Lambda模块限制过多,可绕开模块,直接用Terraform原生aws_lambda_function资源配置:
resource "aws_lambda_function" "test_function" { filename = "./empty.py" function_name = "test-function" role = aws_iam_role.lambda_exec_role.arn # 提前创建好Lambda执行角色 handler = "lambda_handler" runtime = "python3.11" source_code_hash = base64sha256(file("./empty.py")) }
这种方式完全自主控制配置,无需依赖模块的打包逻辑,适合仅需基础配置的场景。
3. 检查Lambda模块的必填参数
如果你使用的是特定的Terragrunt/Lambda模块,务必查看模块文档,确认create_package: false时是否需要额外参数跳过代码包检查。部分模块要求禁用自动打包时,必须显式指定source_path或其他替代参数,不能留空。
内容的提问来源于stack exchange,提问作者Hakuna matata

