Google Cloud 上的 Terraform 常見問題

本頁提供使用 Terraform 管理 Google Cloud資源時,常見問題的解答,特別是關於 API 互動和入門。

開始使用 Terraform

本節將介紹基礎概念,並說明 Terraform 新手應採取的初始步驟。

什麼是基礎架構即程式碼 (IaC)?為什麼要使用 Terraform?

基礎架構即程式碼 (IaC) 是一種做法,透過機器可讀取的定義檔管理及佈建運算基礎架構。如要全面瞭解 IaC 的概念和優點,請參閱「什麼是基礎架構即程式碼?」一文。

Terraform 是一項開放原始碼的 IaC 工具,可用於定義、佈建及管理雲端和內部部署資源。如要瞭解在 IaC 工作流程中使用 Terraform 的優點,請參閱「使用 Terraform 的優點」。

如何安裝 Terraform 並執行第一個設定?

如要開始使用 Terraform,請先在本機下載並安裝 Terraform CLI。如需相關操作說明,請造訪 HashiCorp Terraform 網站。安裝完成後,您可以建立 Terraform 設定檔、定義資源 (例如 Cloud Storage 值區),然後使用 terraform init 初始化工作目錄、使用 terraform plan 預覽變更,以及使用 terraform apply 套用變更。

什麼是 HashiCorp 設定語言 (HCL)?我可以在哪裡瞭解其語法?

HashiCorp 設定語言 (HCL) 是 Terraform 使用的設定語言。這項語言的設計宗旨是方便人類閱讀和機器解讀,讓使用者能清楚且有效率地撰寫及理解基礎架構定義。HCL 支援變數、運算式、函式和模組等各種功能。您可以透過官方 HashiCorp Terraform 說明文件學習 HCL 語法,這份文件提供詳盡的指南和範例。

哪裡可以找到 Google Cloud 資源的 Terraform 設定範例?

您可以在下列位置找到許多 Terraform 設定範例: Google Cloud

  • HashiCorp Terraform 登錄檔:官方 Terraform 登錄檔 Google Cloud 供應商包含每個資源和資料來源的說明文件和範例。

  • Google Cloud Terraform 範例:Google 提供各種 Terraform 範例,示範如何部署及管理常見 Google Cloud 資源。

  • GitHub 存放區:許多開放原始碼存放區 (包括 terraform-google-modules GitHub 機構) 提供範例和可重複使用的模組。

如何管理及測試複雜的 Terraform 設定,尤其是在處理大量資源時?

如需複雜設定,建議使用 Terraform 的功能,以利擴充及維護:

  • 模組:封裝及重複使用常見的基礎架構模式。

  • 工作區:管理單一設定的多個不同執行個體。

  • terraform planterraform validate請經常使用這些指令驗證語法,並預覽變更,不必實際部署。

  • 指定目標資源 (請謹慎使用):如要測試特定部分,可以暫時使用 -target 搭配 terraform applyterraform destroy,但由於狀態管理複雜,一般不建議在日常作業中使用。

  • 專屬環境:先部署至開發或測試環境進行測試,再部署至實際工作環境。

Google Cloud API 問題

這些問題涵蓋有關 Terraform 與Google Cloud API (包括公開和私人 API) 互動的常見查詢。

可以使用 Terraform 管理或匯入內部或私人 Google Cloud API (例如 dataproc-control.googleapis.com) 嗎?

否。內部或私人 Google Cloud API 是 Google 管理的服務基礎架構的一部分,不會公開供客戶直接管理、啟用或使用 Terraform 匯入。這些 API 會由 Google Cloud自動處理。如果嘗試使用 Terraform 直接管理這些資源,將導致發生錯誤。

如需完整說明,請參閱「瞭解 API 和 Terraform 指南 Google Cloud 」。

在 Terraform 中啟用 API 和匯入資源有何不同?

  • 啟用 API:這表示為專案啟用特定 Google Cloud 服務,並授予該專案使用該服務的必要權限。在 Google Cloud上使用 Terraform 時,通常是透過 google_project_service 資源完成這項作業。這是建立依附於該 API 的資源的必要條件。

  • 匯入資源:這是指將在 Terraform 外部建立的現有 Google Cloud 資源 (例如 Compute Engine 執行個體、Cloud Storage 值區) 納入 Terraform 的管理範圍。您匯入的是資源,而非 API 本身。

詳情請參閱「瞭解 API 和 Terraform 指南」。 Google Cloud

如果我沒有明確管理或匯入 dataproc-control.googleapis.com,會發生什麼情況?這會影響我使用 Dataproc 的能力嗎?

不會,這不會影響您使用 Dataproc 的能力。dataproc-control.googleapis.com 是 Dataproc 用於自身作業控制的內部 API,這項功能是由Google Cloud自動管理,您不需要使用 Terraform 啟用、匯入或管理。您的 Dataproc 叢集和作業將正常運作,無需手動處理這個內部 API。

如何排解 Terraform 中的 403「權限遭拒」錯誤?

403 Permission Denied 錯誤通常表示 Terraform 使用的服務帳戶或使用者憑證缺少必要的 IAM 權限,無法對特定 Google Cloud 資源執行要求的動作。疑難排解方式:

  1. 找出受影響的資源和 API 方法:錯誤訊息通常會指定資源類型和失敗的 API 呼叫。

  2. 檢查 IAM 角色:確認主體 (服務帳戶或使用者) 在適當層級 (專案、資料夾、機構或資源) 已獲派正確的 IAM 角色。在 Google Cloud 控制台中使用 IAM 疑難排解工具

  3. 確認服務已啟用:確認專案已啟用必要的 Google Cloud API 服務 (例如使用 gcloud services enablegoogle_project_service)。

  4. 查看機構政策:檢查是否有任何機構政策限制這項動作。

如果專案嘗試消耗的資源或發出的 API 要求超出目前配額限制,就會發生配額錯誤。解決方法如下:

  1. 找出特定配額:錯誤訊息通常會指出 API 和超過的配額限制。

  2. 查看目前配額:前往 Google Cloud 控制台的「配額」頁面,查看目前的用量和限制。

  3. 要求增加配額:如需更多容量,可以直接在「配額」頁面要求增加配額。

  4. 注意事項 user_project_override部分資源的 API 要求可能會計入憑證專案的配額,因此如果憑證專案與資源專案不同,請務必留意。使用 user_project_override (請參閱「供應商參考資料」) 有時可強制將配額計入資源的專案,藉此解決問題。

什麼是使用者管理的預設服務帳戶?如何使用 Terraform 管理其權限?

建立專案或啟用服務時,某些 Google Cloud 服務會自動建立使用者代管的服務帳戶 (通常稱為預設服務帳戶)。這類角色通常具有廣泛的權限。雖然這些金鑰由使用者管理,但由 Google 建立。您可以使用 IAM 資源 (例如 google_project_iam_member) 管理權限,修改使用者的角色。如要對預設服務帳戶本身採取行動,例如移除預設高權限角色或完全刪除帳戶,可以使用 google_project_default_service_accounts 資源。Google 也提供預設服務帳戶類型的相關指南。

什麼是 Google 代管的服務帳戶?如何在 Terraform 設定中參照這類帳戶?

Google 代管的服務帳戶是由 Google 建立及全代管,適用於特定服務。這類帳戶位於使用者專案之外,使用者無法直接設定,與使用者管理的服務帳戶不同。不過,您可能需要授予 IAM 權限,讓他們與您的資源互動。您可以使用 Terraform 中的 google_project_service_identity 資料來源或資源,參照特定服務的 Google 管理服務帳戶電子郵件地址,然後對其套用 IAM 政策。舉例來說,Cloud Build 或 Cloud Composer 等服務通常會使用這類帳戶。

如果我 terraform destroydisable_on_destroy設定的資源,會發生什麼事?

google_project_service 上的 disable_on_destroy 引數和其他一些資源 (例如 google_storage_bucket) 會控管基礎雲端資源在 Terraform 資源遭到銷毀時,是停用還是刪除。

  • 如果 disable_on_destroytrue (或未設定,因為這通常是預設值),terraform destroy 會嘗試停用 (適用於 API) 或刪除 (適用於 buckets) 對應的雲端資源。

  • 如果 disable_on_destroyfalseterraform destroy 會從 Terraform 狀態中移除資源,但保留專案中的實際雲端資源 (例如已啟用的 API 或儲存空間)。 Google Cloud 對於不應意外停用或刪除的重要服務,這通常是較好的做法。