Terraform中如何避免重复编写Lambda归档代码实现DRY原则
Terraform批量打包Lambda的DRY实现方案
你可以直接用Terraform原生的for_each元参数批量生成archive_file数据块,完全消除重复代码,后续新增Lambda也只需要维护一份清单即可。
具体实现步骤
- 统一维护Lambda清单与路径规则
把所有零散的路径变量、函数名都收敛到locals块里统一配置,不用给每个Lambda单独定义source、output变量:locals { # 所有需要打包的Lambda函数名,后续新增函数直接往这个列表加名字即可 lambda_function_names = [ "index_to_s3", "from_s3", "to_s3", "to_fetch", "sql_fetch", "sql_def" ] # 统一配置根路径,后续调整目录只需要改这两处 lambda_source_dir = "${path.module}/../lambda_functions" lambda_zip_output_dir = "${path.module}/lambda_zips" } - 提前创建打包输出目录(可选,避免打包报错)
如果输出目录不存在,archive_file打包时会报错,可以用null_resource提前自动创建目录:resource "null_resource" "init_build_dir" { provisioner "local-exec" { command = "mkdir -p ${local.lambda_zip_output_dir}" } } - 批量生成打包配置
用for_each遍历函数名列表,只需要写一次archive_file块就能自动生成所有函数的独立zip包:data "archive_file" "lambda_packages" { # 依赖目录创建步骤,确保目录存在再打包 depends_on = [null_resource.init_build_dir] for_each = toset(local.lambda_function_names) type = "zip" source_file = "${local.lambda_source_dir}/${each.key}.py" output_path = "${local.lambda_zip_output_dir}/${each.key}.zip" }
产物引用方式
生成的打包产物和你单独写archive_file块的效果完全一致,可以按函数名索引引用:
- 引用from_s3函数的zip输出路径:
data.archive_file.lambda_packages["from_s3"].output_path - 引用to_s3函数的zip base64编码内容(Lambda资源常用属性):
data.archive_file.lambda_packages["to_s3"].output_base64
后续不管是批量创建Lambda资源,还是单独给某个函数创建关联资源,都可以直接通过索引取值,不需要额外调整配置。
方案优势
- 完全符合DRY原则,消除了重复的archive_file块代码
- 新增Lambda只需要在函数名列表加一行,不需要新增任何打包相关配置
- 所有路径、打包规则统一维护,修改配置时不会出现多份代码漏改的问题
内容的提问来源于stack exchange,提问作者theSekyi
相关产品推荐
相关产品推荐

