在GCS中管理Terraform的tfstate文件
简而言之
这是一段关于使用Terraform创建的、用于管理环境信息的状态(tfstate文件)在Google云存储(GCS)中进行管理的故事。
前提 tí) – precondition
操作系统:macOS 10.14.4
Terraform 版本:v0.11.13
在云存储中管理状态的好处
以下是可能的优点:
以下列举了可能的好处:
-
- stateをリモートで一元管理できる
-
- チーム単位で管理する場合は現在のインフラ情報をチーム内で同期できる
-
- stateをバージョン管理できる
- 同時更新によるstateの競合を防げる
请你找资料时参考一下这本书。
- Backends – Terraform by HashiCorp
提前准备
创建服务账号
我会从这里创建一个适用于Terraform调用GCP API的服务帐号,并下载JSON文件。
- Getting Started with the Google provider – Terraform by HashiCorp
设置密码
为了将认证信息传递给Terraform,将下载的JSON文件路径设置为GOOGLE_CLOUD_KEYFILE_JSON。
同样地,为了使Terraform能够上传到GCS,将相同的JSON文件路径设置为应用程序的默认认证信息,即GOOGLE_APPLICATION_CREDENTIALS。
export GOOGLE_CLOUD_KEYFILE_JSON={{path}}
export GOOGLE_APPLICATION_CREDENTIALS=$GOOGLE_CLOUD_KEYFILE_JSON
-
- サーバー間での本番環境アプリケーションの認証の設定 | 認証
- | Google Cloud
创建tf文件
创建桶
首先,创建一个用于管理tfstate文件的存储桶资源设置。
由于此次在Always Free的范围内使用GCS,因此设置了以下位置和存储类。
此外,还启用了版本控制以管理以前的tfstate文件,并进行了生命周期设置,以便最多管理5个旧版本。
resource "google_storage_bucket" "terraform-state-store" {
name = "my-terraform-bucket"
location = "us-west1"
storage_class = "REGIONAL"
versioning {
enabled = true
}
lifecycle_rule {
action {
type = "Delete"
}
condition {
num_newer_versions = 5
}
}
}
-
- Google: google_storage_bucket – Terraform by HashiCorp
-
- オブジェクトのバージョニング | Cloud Storage
-
- | Google Cloud
-
- オブジェクトのライフサイクル管理 | Cloud Storage
- | Google Cloud
tfstate文件的存储位置
这是关于tfstate文件存储位置(后端)的设置。
将GCS指定为后端。
(附注)※详细内容将在后面提到,但是在指定后端类型之前,需要先创建桶。
terraform {
backend "gcs" {
bucket = "my-terraform-bucket"
}
}
- Backend Type: gcs – Terraform by HashiCorp
最终的tf文件
我只写了在GCS中管理tfstate文件所需的配置。
provider "google" {
project = "<プロジェクトID>"
region = "us-west1"
zone = "us-west1-a"
}
terraform {
backend "gcs" {
bucket = "my-terraform-bucket"
}
}
resource "google_storage_bucket" "terraform-state-store" {
name = "my-terraform-bucket"
location = "us-west1"
storage_class = "REGIONAL"
versioning {
enabled = true
}
lifecycle_rule {
action {
type = "Delete"
}
condition {
num_newer_versions = 5
}
}
}
...(続く)
执行
(补充)※请注意
因为收到了kodai305的评论,并且有些解释不足,所以我补充一下。
如果在没有桶的情况下指定backend类型进行初始化,将会失败。
在进行backend类型更改之前,需要提前创建桶。
初始化
为了将后端从本地更改为GCS,进行初始化。
$ terraform init
在路上被问到的问题,我会回答“是”。
如果本地已经有tfstate文件,那么只需要这样的话,tfstate文件就会被上传到GCS上。
从现在开始,每次进行apply或destroy操作时,GCS上的tfstate文件都会被更新。
以上