优化同一Git仓库多个Terraform模块的检索拉取效率
Terraform 默认对每个独立声明的Git源模块单独执行全量克隆,即使多个模块归属同一个私有Git仓库也不会自动复用拉取内容,这是初始化流程耗时过长的核心原因,可通过以下方案优化:
开启全局模块缓存,统一模块引用规则
在用户级Terraform CLI配置文件(类Unix系统为~/.terraformrc,Windows系统为%APPDATA%/terraform.rc)中添加模块缓存目录配置:module_cache_dir = "~/.terraform.d/module-cache"配置后需要保证所有引用同一私有Git仓库的模块,
source地址中的仓库路径、ref(分支、Tag、Commit Hash)参数完全一致,例如统一引用同一个版本Tag:module "vpc" { source = "git::https://mygiturl/terraform-modules.git//modules/vpc?ref=v1.2.0" # 模块其余参数 } module "subnet" { source = "git::https://mygiturl/terraform-modules.git//modules/subnet?ref=v1.2.0" # 模块其余参数 }满足规则的前提下,Terraform只会克隆一次对应版本的仓库内容,后续同仓库同版本的模块引用会直接读取缓存,不会重复发起克隆请求。注意:如果不同模块引用同仓库时
ref参数不一致,或未指定ref默认拉取分支最新提交,会因版本差异导致缓存不命中。预克隆模块仓库,改用本地路径引用
本地开发场景可通过Git Submodule将存放模块的私有仓库作为子模块挂载到主Terraform仓库的固定目录;CI/CD场景可在执行terraform init前提前将模块仓库克隆到工作区固定路径,之后将所有模块的source改为本地相对路径,例如预克隆路径为./.tf-modules/terraform-modules时,模块引用写法为:module "vpc" { source = "./.tf-modules/terraform-modules/modules/vpc" }该方案完全跳过init阶段的远程Git克隆操作,速度最快,配合CI的工作区缓存能力还可进一步省去每次流水线的模块仓库克隆步骤。
给Git源添加浅克隆参数,降低单次拉取耗时
如果暂时无法统一模块版本、也不方便改成本地路径引用,可在source地址中添加Git浅克隆参数,大幅减少单次克隆的下载体积:module "vpc" { source = "git::https://mygiturl/terraform-modules.git//modules/vpc?depth=1&ref=v1.2.0" }添加
depth=1参数后,Git仅拉取对应ref的最新一次提交内容,不会拉取完整提交历史,单次克隆的数据传输量可降低90%以上,即使存在重复克隆,总耗时也会明显缩短。该方案无法完全消除重复克隆,仅作为低成本过渡方案使用。搭建私有Terraform模块注册表
企业级大规模使用场景,可搭建私有Terraform模块注册表托管自定义模块,Terraform从注册表拉取模块时会自动对同版本模块做全局复用,不会重复拉取,同时还可配套实现模块版本管理、权限控制、安全扫描等能力。
额外提示:执行terraform init时默认不会主动更新已拉取的模块,只要没有修改模块的source参数或版本标识,二次执行时会直接读取本地.terraform/modules目录下的已有文件,无需重复拉取;只有添加-upgrade参数时才会触发全量模块更新检查。
内容的提问来源于stack exchange,提问作者GaTechThomas

