在本教學課程中,您將瞭解如何將 Terraform 狀態儲存在 Cloud Storage bucket 中。
根據預設,Terraform 會將狀態儲存在名為 terraform.tfstate 的本機檔案中。如果多位使用者同時執行 Terraform,且每部機器對目前的基礎架構都有自己的理解,這個預設設定會使得團隊難以使用 Terraform。
為協助您避免這類問題,本頁說明如何設定指向 Cloud Storage 值區的遠端狀態。遠端狀態是 Terraform 後端的一項功能。
目標
本教學課程說明如何執行下列操作:
- 使用 Terraform 佈建 Cloud Storage bucket,以儲存 Terraform 狀態。
- 在 Terraform 設定檔中新增範本,將狀態從本機後端遷移至 Cloud Storage bucket。
費用
在本文件中,您會使用下列 Google Cloud的計費元件:
如要根據預測用量估算費用,請使用 Pricing Calculator。
完成本文所述工作後,您可以刪除建立的資源,避免繼續計費,詳情請參閱「清除所用資源」一節。
Cloud Storage 會收取儲存、讀取和寫入作業、網路輸出和複製的費用。
本教學課程中的 Cloud Storage 值區已啟用物件版本管理功能,可保留部署作業的記錄。不過,啟用這項功能會增加儲存空間成本;您可以設定物件生命週期管理將舊的狀態版本刪除,藉此降低相關費用的支出。
事前準備
-
在 Google Cloud 控制台中啟用 Cloud Shell。
Cloud Shell 已預先安裝 Terraform。
如果您使用本機殼層,請執行下列步驟:
- 安裝 Terraform。
-
為使用者帳戶建立本機驗證憑證:
gcloud auth application-default login
如果系統傳回驗證錯誤,且您使用外部識別資訊提供者 (IdP),請確認您已 使用聯合身分登入 gcloud CLI。
-
選取或建立專案所需的角色
- 選取專案:選取專案時,不需要具備特定 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 專案名稱。
-
啟用 Cloud Storage API:
啟用 API 時所需的角色
如要啟用 API,您需要具備服務使用情形管理員 IAM 角色 (
roles/serviceusage.serviceUsageAdmin),其中包含serviceusage.services.enable權限。瞭解如何授予角色。gcloud services enable storage.googleapis.com
-
將角色授予使用者帳戶。針對下列每個 IAM 角色,執行一次下列指令:
roles/storage.admingcloud projects add-iam-policy-binding PROJECT_ID --member="user:USER_IDENTIFIER" --role=ROLE
更改下列內容:
PROJECT_ID:專案 ID。USER_IDENTIFIER:使用者帳戶的 ID。 帳戶。如需範例,請參閱「 在 IAM 政策中代表工作團隊集區使用者」。ROLE:授予使用者帳戶的 IAM 角色。
或者,您也可以建立包含下列權限的自訂 IAM 角色:
storage.buckets.createstorage.buckets.liststorage.objects.getstorage.objects.createstorage.objects.deletestorage.objects.update
建議您最好控管值區和儲存在其中的狀態檔案存取權。只有少數使用者 (例如主要雲端管理員,以及擔任替代或備份管理員的人員) 應具備 bucket 的管理員權限。其他開發人員應只具備在值區中寫入及讀取物件的權限。
準備環境
複製包含 Terraform 範例的 GitHub 存放區:
git clone https://github.com/terraform-google-modules/terraform-docs-samples.git --single-branch變更為工作目錄:
cd terraform-docs-samples/storage/remote_terraform_backend_template
查看 Terraform 檔案
查看
main.tf檔案:cat main.tf輸出內容類似如下
這個檔案說明下列資源:
random_id:附加至 Cloud Storage bucket 名稱,確保 Cloud Storage bucket 名稱不重複。google_storage_bucket:用於儲存狀態檔案的 Cloud Storage bucket。這個 bucket 已設定下列屬性:force_destroy設為false,確保值區中如有物件,就不會遭到刪除。這樣可確保儲存空間中的狀態資訊不會遭到誤刪。public_access_prevention設為enforced,確保儲存空間內容不會意外公開。uniform_bucket_level_access設為true,即可使用 IAM 權限 (而非存取控制清單) 控管值區和內容的存取權。versioning確保值區中保留較舊版本的狀態。
local_file:本機檔案。這個檔案的內容會指示 Terraform 在 bucket 建立完成後,使用 Cloud Storage bucket 做為遠端後端。
佈建 Cloud Storage bucket
初始化 Terraform:
terraform init首次執行
terraform init時,您在main.tf檔案中指定的 Cloud Storage bucket 尚不存在,因此 Terraform 會初始化本機後端,將狀態儲存在本機檔案系統中。套用設定,佈建
main.tf檔案中說明的資源:terraform apply系統顯示提示訊息時,請輸入
yes。首次執行
terraform apply時,Terraform 會佈建 Cloud Storage 值區,用於儲存狀態。此外,這個指令也會建立本機檔案,檔案內容會指示 Terraform 使用 Cloud Storage bucket 做為遠端後端,儲存狀態。
將狀態遷移至 Cloud Storage 值區
將 Terraform 狀態遷移至遠端 Cloud Storage 後端:
terraform init -migrate-stateTerraform 會偵測到您在本機已有狀態檔案,並提示您將狀態遷移至新的 Cloud Storage bucket。系統顯示提示時,請輸入
yes。
執行這項指令後,Terraform 狀態會儲存在 Cloud Storage bucket 中。Terraform 會先從這個 bucket 提取最新狀態,再執行指令,並在執行指令後將最新狀態推送至 bucket。
清除所用資源
為避免因為本教學課程所用資源,導致系統向 Google Cloud 收取費用,請刪除含有相關資源的專案,或者保留專案但刪除個別資源。
刪除專案
如要避免系統向您的 Google Cloud 帳戶收取本頁面所用資源的費用,請按照下列步驟操作。
開啟
main.tf檔案。在
google_storage_bucket.default資源中,將force_destroy的值更新為true。套用更新後的設定:
terraform apply系統顯示提示訊息時,請輸入
yes。刪除狀態檔案:
rm backend.tf將後端重新設定為本機:
terraform init -migrate-state系統顯示提示訊息時,請輸入
yes。執行下列指令,刪除 Terraform 資源:
terraform destroy系統顯示提示訊息時,請輸入
yes。