如何创建可继承基础模块配置且无需重定义变量的Terraform模块?
Terraform 模块预配置:无需重定义所有变量的实现方案
要实现仅预配置特定参数,同时让使用者能访问基础模块的全部变量与输出,核心靠参数合并+展开和动态输出继承两个技巧,具体操作如下:
1. 封装模块的变量配置
在你的php_function封装模块里,不用逐个复制基础模块的变量,只需做两件事:
- 定义需要预配置的参数(用来设置默认值,使用者可覆盖)
- 定义一个接收额外参数的变量,承接使用者传入的其他变量
示例variables.tf:
# 预配置的默认参数,使用者可按需覆盖 variable "default_runtime" { type = string default = "provided.al2" } # 接收基础模块的其他所有变量,用any类型兼容任意结构 variable "base_module_vars" { type = any default = {} }
2. 合并参数并调用基础模块
在封装模块的main.tf中,用merge函数将预配置默认值与使用者传入的参数合并(使用者参数优先级更高,会覆盖默认值),再通过...操作符展开所有参数传递给基础模块:
locals { # 合并预配置值与用户传入参数 merged_config = merge( { runtime = var.default_runtime }, # 预配置的固定参数 var.base_module_vars # 用户传入的其他参数 ) } # 调用基础模块并展开所有合并后的参数 module "base_lambda" { source = "the/base/module" # 用...展开map,将所有键值对作为模块参数传递 ...local.merged_config }
使用者调用php_function模块时,既能用预配置的runtime,也能传入function_name、description等基础模块变量:
module "my_php_lambda" { source = "./path/to/php_function" # 可选:覆盖预配置的runtime # default_runtime = "provided.al2023" # 传入基础模块的其他变量 base_module_vars = { function_name = "my-php-function" description = "PHP runtime Lambda function" # 基础模块支持的其他变量都可在此传入 } }
3. 自动继承基础模块的输出
要让使用者访问基础模块的全部输出,不用逐个定义输出,直接在封装模块的outputs.tf中导出整个基础模块的输出:
# 导出基础模块所有输出,使用者可通过module.my_php_lambda.base_outputs.xxx访问 output "base_outputs" { type = any value = module.base_lambda }
如果希望使用者直接通过module.my_php_lambda.function_arn这类方式访问(不用嵌套一层),可以用动态输出自动生成所有输出项:
# 动态生成基础模块的所有输出 dynamic "output" { for_each = keys(module.base_lambda) content { name = output.value value = module.base_lambda[output.value] } }
注意事项
- 需使用Terraform 1.2及以上版本,
...参数展开操作符是1.2版本引入的 - 如果基础模块变量有严格类型定义,建议把
variable "base_module_vars"的类型设为与基础模块匹配的object类型,而非any,能提前校验参数合法性
内容的提问来源于stack exchange,提问作者Matthieu Napoli
相关产品推荐
相关产品推荐

