Terraform – Backend远端存储tfstate和state locking
tfstate会存储服务器的密码如果直接把tfstate存在git当中就有泄密的风险,所以通常都会存在远端,比如kubernetes, s3等等。而且使用state locking的的话,多人协作开发可以避免同事覆盖的问题出现。
不一定每一个backend configuration都支持state locking, 需要在官方文档查清楚了才使用。
比如把tfstate存入了AWS的S3当中,但是之前的版本不支持state locking的,所以需要结合dynamodb来达到state locking的效果。但是由于现在S3也能支持state locking了,所以使用之前必须查看官方文档。

官方文档的backend configuration:https://developer.hashicorp.com/terraform/language/backend
使用案例
结合S3和DynamoDB来设定backend
- 在AWS创建S3 Bucket
- 根据以下的terraform代码来部署
terraform {
# 定义Terraform版本要求
required_version = ">= 1.0.0"
# 配置远程状态存储后端为S3
backend "s3" {
bucket = "tempBucket" # S3桶名称
key = "tf/prod/terraform.tfstate" # 状态文件在S3中的存储路径
region = "ap-southeast-5" # S3桶所在区域
use_lockfile = true # 启用锁文件以防止状态文件并发修改
}
# 声明所需的provider及其版本
required_providers {
aws = {
source = "hashicorp/aws"
version = "~> 5.0"
}
}
}
# 配置AWS提供者
provider "aws" {
region = "ap-southeast-5" # 设置AWS区域
}
# 获取最新的Amazon Linux 2023 AMI信息
data "aws_ami" "latest_amazon_linux" {
most_recent = true # 获取最新的AMI版本
owners = ["amazon"] # 指定AMI的所有者为Amazon
# 根据架构过滤AMI
filter {
name = "architecture"
values = ["x86_64"]
}
# 根据AMI名称过滤,找出最新版本的Amazon Linux 2023 AMI
filter {
name = "name"
values = ["al2023-ami-2023*"]
}
}
# 创建一个EC2实例
resource "aws_instance" "ec2" {
ami = data.aws_ami.latest_amazon_linux.id # 使用获取到的AMI ID
instance_type = "t3.micro" # 指定实例类型
subnet_id = "subnet-0f8a070f233b7543a" # 指定实例所在的子网ID
}
3. 当我在执行的时候就会生成tfstate 文件,locking file生成是因为当下有人在用着,所以避免同时覆盖的问题出现。

4. 如果s3当中含有tflock文件的话代表当下有进程正在创建着资源,那么就无法同时使用,如果运行的话就会报错

结合workspace使用
不同的workspace,可以个别存自己的的remote state
了解workspace的使用:https://www.pangzai.win/terraform-workspace%e7%9a%84%e4%bd%bf%e7%94%a8/
terraform {
backend "s3" {
bucket = "my-terraform-state-bucket"
key = "tf/${terraform.workspace}/terraform.tfstate"
region = "ap-southeast-5"
use_lockfile = true
}
}
Facebook评论