将 Terraform 状态存储在 Cloud Storage 存储桶中

在本教程中,您将学习如何在 Cloud Storage 存储桶中存储 Terraform 状态。

默认情况下,Terraform 会将状态存储在名为 terraform.tfstate 的本地文件中。当多个用户同时运行 Terraform 并且每个机器都对当前基础架构有自己的理解时,如果采用此默认配置,则使用 Terraform 对团队而言可能会很困难。

为帮助您避免此类问题,本页面介绍了如何配置指向 Cloud Storage 存储桶的远程状态。远程状态是 Terraform 后端的一项功能。

费用

Cloud Storage 会产生存储、读写操作、网络出站流量和复制费用

本教程中的 Cloud Storage 存储桶启用了对象版本控制,以保留部署历史记录。启用“对象版本控制”会增加存储费用,您可以将对象生命周期管理配置为删除旧的状态版本,以缓解存储费用增加问题。

准备工作

  1. 确保您的用户帐号具有必要的 Cloud Storage 权限
    • storage.buckets.create
    • storage.buckets.list
    • storage.objects.get
    • storage.objects.create
    • storage.objects.delete
    • storage.objects.update

    转到 IAM 页面

    详细了解角色和权限。

    我们建议的最佳实践是控制对存储桶及其中存储的状态文件的访问权限。只有一小部分用户(例如,主要的云管理员和担任顶替管理员的人员)应具有存储桶的管理员权限。其他开发者应具有仅在存储桶中读写对象的权限。

  2. 启动 Cloud Shell

    Cloud Shell 是一个 Compute Engine 虚拟机。与此虚拟机关联的服务凭据会自动获取,因此无需设置或下载服务帐号密钥。

  3. 启用 Cloud Storage API:

    gcloud services enable storage.googleapis.com
    

将 Terraform 配置为在 Cloud Storage 存储桶中存储状态

在以下步骤中,您将创建一个 Cloud Storage 存储桶,并将后端配置更改为新的存储桶和 Google Cloud 项目。

创建存储桶

  1. 将以下 google_storage_bucket Terraform 资源添加到 Terraform 配置文件(例如 main.tf)中。

    resource "google_storage_bucket" "default" {
      name          = "bucket-tfstate"
      force_destroy = false
      location      = "US"
      storage_class = "STANDARD"
      versioning {
        enabled = true
      }
    }

    在此代码段中,location 字段硬编码为 US(这意味在美国创建了一个多区域存储桶)。您可以将此字段更改为您选择的位置。

  2. 运行 terraform apply 以创建存储桶。

如果应用失败,可能是因为存储桶名称不具有全局唯一性。下一部分将向您介绍如何解决此问题。

使存储桶名称具有唯一性

为了使存储桶名称具有全局唯一性,您可以添加用于创建随机 ID 的 Terraform 插件。

// Terraform plugin for creating random IDs
resource "random_id" "instance_id" {
  byte_length = 8
}

然后,在存储桶 name 特性中使用随机 ID。

resource "google_storage_bucket" "default" {
  name = "bucket-tfstate-${random_id.instance_id.hex}"
  ...
}

重试 terraform apply 命令。

更改后端配置

  1. 将以下文本添加到名为 backend.tf 的新 Terraform 配置文件中。

    terraform {
     backend "gcs" {
       bucket  = "BUCKET_NAME"
       prefix  = "terraform/state"
     }
    }
    

    请务必更新 BUCKET_NAME,以匹配新 Cloud Storage 存储桶的名称。

  2. 运行 terraform init 以配置 Terraform 后端。

    Terraform 检测到本地已有状态文件,并提示您将其复制到新的 Cloud Storage 存储桶。输入 yes

运行此命令后,您的 Terraform 状态将存储在 Cloud Storage 存储桶中。Terraform 在运行命令之前从此存储桶拉取最新状态,并在运行命令后将最新状态推送到存储桶。

后续步骤