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

  1. 在AWS创建S3 Bucket
  2. 根据以下的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   
  }
}

Loading

Facebook评论