terraform-远程状态存储

Posted 我的二狗呢

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了terraform-远程状态存储相关的知识,希望对你有一定的参考价值。

默认情况下,terraform在运行完后,会在当前目录下生成state状态文件,里面存储的是上一次执行成功后的资源状态。

但是在生产环境,通常会有多名SRE/DevOps负责运维,基于本地state的方式,可能造成terraform的资源文件版本上的分叉。

那么为啥不把state文件放到git上,这样大家都可以更改? 

原因是,如果多个人并发执行了terraform的修改,还是会导致state的不一致。

这种时候,我们最容易想到的一个解决方法,就是把这个state放到类似数据库中,A运维在执行时先对这个记录加锁,完成后才释放,B运维才能继续执行。

terraform这里,对于remote state的存储,目前已经支持了s3、阿里云的oss,consul 这些(可能列的不全)。

 

 

下面以网上的一个例子来说:

 

 

vim /root/.zshrc 添加下aws的ak,类似如下:

export AWS_ACCESS_KEY_ID = AKIA2PA4F44444Q7C72XJ
export AWS_SECRET_ACCESS_KEY = RnckzT427mR222222nZRHHA3333kRV

 

克隆示例代码

git clone https://github.com/loujaybee/terraform-aws-github-action-bootstrap.git 

 

cd terraform-aws-github-action-bootstrap/

 我这里简单修改了下 main.tf,如下:

provider "aws" {
  region  = "us-east-1"
}

terraform {
  backend "s3" {
    bucket = "lee-terraform-project-name-bootstrap-terraform-state"
    key    = "default-infrastructure"
    region = "us-east-1"
  }
}

#resource "aws_s3_bucket" "terraform_state" {
#  bucket = "lee-terraform-project-name-bootstrap-terraform-state"
#  versioning {
#    enabled = true
#  }
#}

 

然后执行 

terraform init
terraform apply

 

完成后,将会创建一个s3bucket,名称为 lee-terraform-project-name-bootstrap-terraform-state ,如下图:

\'terraform-远程状态存储_terraform\'

 

然后,我们把terraform的状态文件存储到远程s3中

修改 main.tf  修改后的文件如下:

provider "aws" {
  region  = "us-east-1"
}

terraform {
  backend "s3" {
    bucket = "lee-terraform-project-name-bootstrap-terraform-state"
    key    = "default-infrastructure"
    region = "us-east-1"
  }
}

resource "aws_s3_bucket" "terraform_state" {
  bucket = "lee-terraform-project-name-bootstrap-terraform-state"

  versioning {
    enabled = true
  }
}

 

然后,执行下如下命令,使其生效:

terraform init
terraform apply

 

到s3的存储上,可以看到产生了一个state文件。感兴趣的可以下载下来看看,是一个json文件。

\'terraform-远程状态存储_IAC_02\'

 

我们还可以尝试去开一个ec2主机,修改后代码如下:

provider "aws" {
  region  = "us-east-1"
}

terraform {
  backend "s3" {
    bucket = "lee-terraform-project-name-bootstrap-terraform-state"
    key    = "default-infrastructure"
    region = "us-east-1"
  }
}

resource "aws_s3_bucket" "terraform_state" {
  bucket = "lee-terraform-project-name-bootstrap-terraform-state"

  versioning {
    enabled = true
  }
}

resource "aws_instance" "app_server" {
  ami           = "ami-087c17d1fe0178315"
  instance_type = "t2.nano"
  count         = 1
  tags = {
    Name = "prod-devops-dba-01"
  }
}

 

运行一下,即可开一台ec2实例出来

terraform plan
terraform apply

 

每次变动后,执行apply后都会把最新的state传到s3中,运行多次的s3,s3中的记录的版本如下:

\'terraform-远程状态存储_terraform_03\'

 

最后,测试完成后,记得 terraform destroy 销毁相关资源,避免开着浪费钱,哥可是吃过大亏的!

 

 

以上是关于terraform-远程状态存储的主要内容,如果未能解决你的问题,请参考以下文章

为啥需要远程保存 terraform 状态文件?

创建谷歌云存储桶并使用相同的 terraform 脚本将 terraform 状态保存到其中?

Terraform 参考为远程后端创建了 S3 存储桶

无法使用“terraform init -reconfigure”将 S3 后端中的 Terraform 远程状态转换为本地状态

如何从 terraform 状态中删除资源?

aws cdk 可以提供远程状态吗?