將 Terraform 狀態儲存在 Cloud Storage 值區中

在本教學課程中,您將瞭解如何將 Terraform 狀態儲存在 Cloud Storage bucket 中。

根據預設,Terraform 會將狀態儲存在本機的 terraform.tfstate 檔案中。如果多位使用者同時執行 Terraform,且每部電腦對目前的基礎架構都有自己的解讀,這種預設設定可能會讓團隊難以使用 Terraform。

為協助您避免這類問題,本頁面將說明如何設定指向 Cloud Storage bucket 的遠端狀態。遠端狀態是 Terraform 後端的一項功能。

目標

本教學課程說明如何執行下列操作:

  • 使用 Terraform 佈建 Cloud Storage bucket,以儲存 Terraform 狀態。
  • 在 Terraform 設定檔中新增範本,將狀態從本機後端遷移至 Cloud Storage bucket。

費用

在本文件中,您將使用下列 Google Cloud計費元件:

如要根據預測用量估算費用,請使用 Pricing Calculator。

初次使用 Google Cloud 的使用者可能符合免費試用期資格。

完成本文所述工作後,您可以刪除建立的資源,避免繼續計費,詳情請參閱「清除所用資源」一節。

Cloud Storage 會收取儲存、讀取和寫入作業、網路輸出和複製的費用。

本教學課程中的 Cloud Storage bucket 已啟用物件版本控管,可保留部署作業的記錄。啟用物件版本管理功能會增加儲存空間費用,您可以設定物件生命週期管理功能來刪除舊版狀態,藉此降低費用。

事前準備

  1. 在 Google Cloud 控制台中啟用 Cloud Shell。

    啟用 Cloud Shell

    Cloud Shell 已預先安裝 Terraform。

  2. 如果您使用本機殼層,請按照下列步驟操作:

  3. 建立或選取 Google Cloud 專案。

    選取或建立專案所需的角色

    • 選取專案:選取專案時,不需要具備特定 IAM 角色,只要您在專案中獲派角色,即可選取該專案。
    • 建立專案:如要建立專案,您需要專案建立者角色 (roles/resourcemanager.projectCreator),其中包含 resourcemanager.projects.create 權限。瞭解如何授予角色。
    • 建立 Google Cloud 專案:

      gcloud projects create PROJECT_ID

      將 PROJECT_ID 替換為要建立的專案名稱。 Google Cloud

    • 選取您建立的 Google Cloud 專案:

      gcloud config set project PROJECT_ID

      將 PROJECT_ID 替換為 Google Cloud 專案名稱。

  4. 確認 Google Cloud 專案已啟用計費功能。

  5. 如尚未啟用,請啟用 Cloud Storage API:

    啟用 API 時所需的角色

    如要啟用 API,您必須具備 serviceusage.services.enable 權限。如果您建立了專案,可能已透過「擁有者」角色 (roles/owner) 取得這項權限。否則,您可以透過「服務使用管理員」角色 (roles/serviceusage.serviceUsageAdmin) 取得這項權限。瞭解如何授予角色。

    gcloud services enable storage.googleapis.com
  6. 將角色授予使用者帳戶。針對下列每個 IAM 角色,執行一次下列指令: roles/storage.admin

    gcloud projects add-iam-policy-binding PROJECT_ID --member="user:USER_IDENTIFIER" --role=ROLE

    更改下列內容:

    或者,您也可以建立包含下列權限的自訂 IAM 角色:

    • storage.buckets.create
    • storage.buckets.list
    • storage.objects.get
    • storage.objects.create
    • storage.objects.delete
    • storage.objects.update

    最佳做法是控管對儲存區和狀態檔案的存取權。只有少數使用者 (例如主要雲端管理員,以及擔任替代或備份管理員的人員) 應具備 bucket 的管理員權限。其他開發人員應只具備在 bucket 中寫入及讀取物件的權限。

準備環境

  1. 複製包含 Terraform 範例的 GitHub 存放區:

    git clone https://github.com/terraform-google-modules/terraform-docs-samples.git --single-branch
    
  2. 變更為目前使用的目錄:

    cd terraform-docs-samples/storage/remote_terraform_backend_template
    

查看 Terraform 檔案

  1. 查看 main.tf 檔案:

    cat main.tf
    

    輸出內容大致如下:

    resource "random_id" "default" {
      byte_length = 8
    }
    
    resource "google_storage_bucket" "default" {
      name     = "${random_id.default.hex}-terraform-remote-backend"
      location = "US"
    
      force_destroy               = false
      public_access_prevention    = "enforced"
      uniform_bucket_level_access = true
    
      versioning {
        enabled = true
      }
    }
    
    resource "local_file" "default" {
      file_permission = "0644"
      filename        = "${path.module}/backend.tf"
    
      # You can store the template in a file and use the templatefile function for
      # more modularity, if you prefer, instead of storing the template inline as
      # we do here.
      content = <<-EOT
      terraform {
        backend "gcs" {
          bucket = "${google_storage_bucket.default.name}"
        }
      }
      EOT
    }

    這個檔案說明下列資源:

    • random_id:附加至 Cloud Storage bucket 名稱,確保 Cloud Storage bucket 名稱不重複。
    • google_storage_bucket:用於儲存狀態檔案的 Cloud Storage bucket。這個值區已設定下列屬性:
      • force_destroy 設為 false,確保值區內有物件時不會遭到刪除。這樣可確保值區中的狀態資訊不會意外刪除。
      • public_access_prevention 設為 enforced,確保 bucket 內容不會意外公開。
      • uniform_bucket_level_access 設為 true,即可使用 IAM 權限 (而非存取控管清單),控管值區及其內容的存取權。
      • versioning,確保狀態的舊版會保留在 bucket 中。
    • local_file:本機檔案。這個檔案的內容會指示 Terraform 在 bucket 建立後,使用 Cloud Storage bucket 做為遠端後端。

佈建 Cloud Storage bucket

  1. 初始化 Terraform:

    terraform init
    

    首次執行 terraform init 時,您在 main.tf 檔案中指定的 Cloud Storage bucket 尚不存在,因此 Terraform 會初始化本機後端,將狀態儲存在本機檔案系統中。

  2. 套用設定,佈建 main.tf 檔案中描述的資源:

    terraform apply
    

    系統顯示提示訊息時,請輸入 yes。

    首次執行 terraform apply 時,Terraform 會佈建 Cloud Storage bucket,用於儲存狀態。此外,這項指令也會建立本機檔案,檔案內容會指示 Terraform 使用 Cloud Storage bucket 做為遠端後端,以儲存狀態。

將狀態遷移至 Cloud Storage bucket

  1. 將 Terraform 狀態遷移至遠端 Cloud Storage 後端:

    terraform init -migrate-state
    

    Terraform 會偵測到您在本機已有狀態檔案,並提示您將狀態遷移至新的 Cloud Storage bucket。系統顯示提示訊息時,請輸入 yes。

執行這項指令後,Terraform 狀態會儲存在 Cloud Storage bucket 中。Terraform 會先從這個 bucket 提取最新狀態,再執行指令,並在執行指令後將最新狀態推送至 bucket。

清除所用資源

為避免因為本教學課程所用資源,導致系統向 Google Cloud 收取費用,請刪除含有相關資源的專案,或者保留專案但刪除個別資源。

刪除專案

如要避免系統向您的 Google Cloud 帳戶收取本頁面所用資源的費用,請按照下列步驟操作。

  1. 開啟 main.tf 檔案。

  2. 在 google_storage_bucket.default 資源中,將 force_destroy 的值更新為 true。

  3. 套用更新後的設定:

    terraform apply
    

    系統顯示提示訊息時,請輸入 yes。

  4. 刪除狀態檔案:

    rm backend.tf
    
  5. 將後端重新設定為本機:

    terraform init -migrate-state
    

    系統顯示提示訊息時,請輸入 yes。

  6. 執行下列指令,刪除 Terraform 資源:

    terraform destroy
    

    系統顯示提示訊息時,請輸入 yes。

後續步驟