管理 Terraform 狀態檔案

對於任何部署作業,您可能需要檢查或修改狀態檔案。舉例來說,您可能想從部署作業中匯入或移除資源,這可以透過修改狀態檔案來完成。

本頁面說明如何使用為每個部署作業和修訂版本建立的 Terraform 狀態檔案。如要進一步瞭解狀態檔案,請參閱「狀態」。

本頁說明假設您已熟悉 Terraform

事前準備

  1. 請確認您具備處理狀態檔案的必要權限。config.admin 角色包含必要權限。所需的具體權限如下:

    • config.deployments.lock
    • config.revisions.getState
    • config.deployments.updateState
    • config.deployments.unlock
    • config.deployments.getLock
    • config.deployments.getState
  2. 請確認您有 Terraform 設定的本機副本。這是與您使用的狀態檔案相對應的設定。

    設定檔的本機副本可讓您在修改狀態檔案時,在本機執行 terraform refreshterraform plan 等指令。

  3. 安裝 Terraform,即可在本機電腦上使用 Terraform CLI。

變更或檢查狀態檔案

如要變異 (修改) 或檢查狀態檔案,您必須鎖定部署作業並下載狀態檔案。接著,您可以變更或檢查狀態檔案。

變更狀態檔案後,請上傳檔案,讓 Infra Manager 在部署作業中使用。

鎖定部署作業

  1. 鎖定部署作業,以免在變更狀態檔案時,部署作業發生任何變更。您必須鎖定部署作業,才能下載狀態檔案。

     gcloud infra-manager deployments lock DEPLOYMENT_ID --project PROJECT_ID --location LOCATION
    

    取代:

    • DEPLOYMENT_ID 與部署 ID 搭配使用。
    • PROJECT_ID 與部署專案。
    • LOCATION 與部署作業執行的位置。

    這項指令的輸出內容包含 lock ID,可用於上傳及解鎖 statefile。

  2. 如要隨時擷取鎖定 ID,請使用下列指令:

     gcloud infra-manager deployments export-lock DEPLOYMENT_ID --project PROJECT_ID --location LOCATION
    

下載狀態檔案

如要下載狀態檔案,請使用已簽署的 Cloud Storage 網址

   SIGNED_STATE_DOWNLOAD_URL=$(gcloud infra-manager deployments export-statefile DEPLOYMENT_ID --project PROJECT_ID --location LOCATION --format="get(signedUri)")

   curl -s -X GET --output terraform.tfstate ${SIGNED_STATE_DOWNLOAD_URL}

在本機變更狀態檔案

  1. 確認設定檔 (*.tf 檔案) 與下載的狀態檔案 (terraform.tfstate) 位於相同目錄。

  2. 初始化 Terraform:

     terraform init
    
  3. 如果您先前已初始化 Terraform,可能需要使用重新設定標記進行初始化:

     terraform init -reconfigure
    
  4. 視需要使用狀態檔案。舉例來說,您可以執行狀態檢查變異作業。如要進一步瞭解如何使用狀態檔案,請參閱「操控 Terraform 狀態」。

  5. 如果您在本機對 Terraform 設定檔進行任何變更,請上傳修改過的設定。將這項設定上傳至您用來部署設定的儲存空間 bucket 或公開 Git 存放區。

上傳狀態檔案

使用已簽署的 Cloud Storage 網址上傳狀態檔案:

  1. 取得鎖定 ID:

     LOCK_ID=$(gcloud infra-manager deployments export-lock DEPLOYMENT_ID --project PROJECT_ID --location LOCATION --format="get(lockId)")
    
  2. 取得上傳網址:

     SIGNED_STATE_UPLOAD_URL=$(gcloud infra-manager deployments import-statefile DEPLOYMENT_ID --project PROJECT_ID --location LOCATION --lock-id ${LOCK_ID} --format="get(signedUri)")
    
     curl -s -X PUT --upload-file terraform.tfstate $SIGNED_STATE_UPLOAD_URL
    

解鎖部署

  1. 取得鎖定 ID:

     LOCK_ID=$(gcloud infra-manager deployments export-lock DEPLOYMENT_ID --project PROJECT_ID --location LOCATION --format="get(lockId)")
    
  2. 解鎖部署:

     gcloud infra-manager deployments unlock DEPLOYMENT_ID --project PROJECT_ID --location LOCATION --lock-id ${LOCK_ID}
    

後續步驟