在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文件都会被更新。

以上

广告
将在 10 秒后关闭
bannerAds