1. Backend概念简介及原理
1.1 State简介
TerraformState是用来存放基础设施资源及其属性和状态的机制。TerraformState从存储形态上分为两种:
local
:本地存储资源状态存放在本地的一个state文件中,默认为执行目录下的名为 terraform.tfstate 文件。此方式也是Terraform默认的存储形式remote
:资源状态存放在逆端的一个服务中,例如阿里云的OSS Terraform Cloud, HashiCorp Consul等。远端存储带来的好处是实现了与资源定义模板管理的解耦,可以让State脱离本地磁盘而存储,在提升State安全性的同时,团队协作可以不再受制于Terraform的执行环境、执行目录和多人执行时间的限制,提升了管理的灵活性。
Terraform State的存储是由一个称之为Backend的组件决定的,local state使用的是local backend。除了local backend,其他所有的backend在使用之前都需要在模板中显式定义并通过terraform init
来实现加载和配置。
- terraform.tfstate
- terraform.tfstate.backup
local state存在问题
- 缺乏灵活性
- 状态文件存储在本地,不便于团队成员协同;
- 文件系统损坏,导致状态文件丢失;
- 缺乏安全性
- state存在敏感数据,缺乏数据的保护;
- 当多人同时变更时,存在状态不一致导致基础设施风险;
1.2 Backend简介
Backend是存储State的机制,它决定了State数据的加载逻辑和Terraform命令执行之后State的数据的更新过程。 Terraform生命周期中与Backend的交互过程,如下图所示。
Terraform通过terraform init命令完成Backend的加载和配置。在执行plan和apply命令,加载资源模板的同时,通过Backend加载State中的存量数据(如果有)。命令束后,将Provider或Provisioner响应中的数据通过Backend更新到State中,最终达到State数据与模板定义的一致。
vim provider.tf
yaml
terraform {
backend "oss" {
region = "cn-shanghai"
bucket = "terraform-hsuing" //需要提前创建好
prefix = "terraform/dev"
key = "terraform.tfstate"
//endpoint = "https://oss-cn-shanghai.aliyuncs.com"
access_key = "xx"
secret_key = "xxx"
}
}
terraform {
backend "oss" {
region = "cn-shanghai"
bucket = "terraform-hsuing" //需要提前创建好
prefix = "terraform/dev"
key = "terraform.tfstate"
//endpoint = "https://oss-cn-shanghai.aliyuncs.com"
access_key = "xx"
secret_key = "xxx"
}
}
把本地terraform.tfstate删除,重新init ,apply
backend中无法使用var变量
如果删除了远程tfstate文件,需要重新reconfigure下
1.3 Backend原理
- 配置 Backend: 首先,在 Terraform 配置文件中通过 terraform 块配置所需的 Backend。这包括指定使用的 Backend 类型以及连接到 Backend 所需的认证信息和配置参数。不同的 Backend 类型需要不同的配置信息,例如存储桶名称、访问密钥等。
- 初始化 Terraform: 在配置了 Backend 后,通过运行 terraform init 命令来初始化 Terraform。初始化过程将下载所需的提供者插件和配置 Backend,确保 Terraform 可以与 Backend 进行交互。
- 状态文件存储: 在进行 Terraform 操作时(例如 terraform apply 或 terraform destroy),Terraform 会将状态文件上传到配置的 Backend。这将确保状态信息在远程位置进行存储,并供其他团队成员访问和使用。
- 状态锁定: 在多人协作的场景中,当一个用户正在执行 Terraform 操作时,其他用户可能也希望对相同的基础设施资源进行操作。为了避免冲突,Backend 支持状态锁定机制。当一个用户开始执行 Terraform 操作时,Backend 会将状态文件锁定,阻止其他用户对状态文件进行修改,直到操作完成后解锁。
- 状态同步: 多人协作的场景下,团队成员可能会频繁地更改 Terraform 配置并执行操作。每次执行操作后,Terraform 会更新状态文件,并将最新的状态文件保存到 Backend。其他团队成员可以通过 terraform refresh 命令从 Backend 中获取最新的状态信息,并与本地配置进行同步。
2. 实战
2.1 oss
https://developer.hashicorp.com/terraform/language/backend/oss
OSS Backend是基于阿里云的表格存储服务(Tablestore)和对象存储服务(OSS)实现
vim provider.tf
yaml
terraform {
backend "oss" {
access_key = "xxxxxxxx"
secret_key = "xxxxxxxx"
bucket = "terraform-data"
prefix = "dev/"
key = "terraform.tfstate"
region = "cn-beijing"
tablestore_endpoint = "https://terraform-data.cn-beijing.ots.aliyuncs.com"
tablestore_table = "terraform_state"
}
}
terraform {
backend "oss" {
access_key = "xxxxxxxx"
secret_key = "xxxxxxxx"
bucket = "terraform-data"
prefix = "dev/"
key = "terraform.tfstate"
region = "cn-beijing"
tablestore_endpoint = "https://terraform-data.cn-beijing.ots.aliyuncs.com"
tablestore_table = "terraform_state"
}
}