Terraform – Module 模块的使用
在 Terraform 中,module(模块) 是一组组织良好的 Terraform 配置文件的集合,用于封装和复用基础设施代码。Terraform 模块的作用包括:
1. 代码复用
- 模块可以封装常见的基础设施组件(如 VPC、EC2、RDS 等),使其可以在多个项目或环境中复用,而无需重复编写相同的代码。

2. 提高可维护性
- 通过模块化设计,基础设施代码更加清晰,方便团队协作和管理。不同的模块可以独立开发和更新,而不会影响整个 Terraform 配置。
3. 简化配置
- 使用模块可以将复杂的基础设施分解成多个小的、可管理的部分,使主配置文件更简洁,易于理解。
4. 支持参数化
- 模块支持通过 输入变量(variables) 和 输出变量(outputs) 进行参数化配置,使其更加灵活,适用于不同的环境或需求。
5. 版本控制
- Terraform 允许对模块进行版本管理,确保在不同环境中可以使用稳定的版本,避免因配置变更导致的问题。
6. 提升一致性
- 通过模块,可以确保不同环境(如开发、测试、生产)中的基础设施配置保持一致,减少人为错误。
Module Registry
可以从这里找到模块,有官方提供的module
https://registry.terraform.io/browse/modules
Module Sources
可以从不同的数据源拉去module,比如S3 / Github / Terraform Registry / 本地
可以从文档当中查询获取源的写法方式
https://developer.hashicorp.com/terraform/language/modules/sources
使用案例(本地module)
- 在本地创建这个文件夹和文件 modules/ec2/main.tf
terraform {
required_version = ">= 1.0.0" # Ensure that the Terraform version is 1.0.0 or higher
required_providers {
aws = {
source = "hashicorp/aws" # Specify the source of the AWS provider
version = "~> 5.0" # Use a version of the AWS provider that is compatible with version
}
}
}
provider "aws" {
region = var.region
}
resource "aws_instance" "myec2" {
ami = var.ami
instance_type = var.instance_type
}
variable "region" {}
variable "ami" {}
variable "instance_type" {}
2. 在外部使用本地的module
module "ec3" {
source = "./modules/ec2"
ami = "ami-0bb84b8ff87024d8"
instance_type = "t3.micro"
region = "us-east-1"
}
如果module有使用region了,外部再指定region,那么使用这个module的时候是使用哪个region?
- 如果module内部没有自己显式定义 provider 配置,那么就会默认继承外部
- 如果module内部已经有自定义的provider了之后那么就会使用内部的provider为主
Module 当中为什么需要required_provider?
每个module都需要明确声明它所依赖的 provider,这样 Terraform 才能在执行前自动下载并安装正确的 provider 插件。
如果module内部的required_providers使用aws 1.0 版本,但是外部使用aws 5.0 版本的,那么如果在外部应有这个module的话,是使用1.0还是5.0 ?
- 如果模块内部声明的 aws 版本约束非常严格(例如
"~> 1.0"
,只允许 1.x 版本),而外部根模块要求使用 aws 5.0,那么这两个版本约束无法同时满足,Terraform 在执行terraform init
时会报错,提示版本冲突。 - 如果模块内部的约束比较宽松(例如
">= 1.0"
),那么外部指定的 aws 5.0 只要满足模块内部的约束,就会被选中作为全局使用的 provider 版本。
Facebook评论