Skip to content

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的交互过程,如下图所示。

image-20250723173627568

​ 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

image-20250723191202989

backend中无法使用var变量

如果删除了远程tfstate文件,需要重新reconfigure下

image-20250723191028172

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)实现

img

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"
  }
}