針對在 Azure 上使用 Terraform 時的常見問題進行疑難排解

本文列出在 Azure 上使用 Terraform 時的常見問題和可能的解決方案。

如果您遇到 Terraform 特有的問題,請使用 HashiCorp 的 其中一個社群支援管道

HashiCorp Terraform 特定支援通道

無法列出提供者註冊狀態

錯誤訊息

錯誤:無法列出提供者註冊狀態,這可能是因為認證無效,或服務主體沒有使用 Resource Manager API 的許可權,Azure 錯誤:資源。ProvidersClient#List:無法回應要求:StatusCode=403 -- 原始錯誤:autorest/azure:服務傳回錯誤。 Status=403 Code=“AuthorizationFailed” Message=“用戶端 '00000000-0000-0000-0000-000000000000000',且對象標識符為 '000000000-0000-0000-0000-0000-00 000-0000000000' 沒有授權在範圍 '/subscriptions/0000000-0000-0000-0000-0000-00000-0000000000000' 或範圍無效時執行動作 'Microsoft.Resources/subscriptions/providers/read'。 如果最近已授與存取權,請重新整理您的認證。」

背景: 如果您是從 Cloud Shell 執行 Terraform 命令,而且您已定義特定的 Terraform/Azure 環境變數,您有時可能會看到衝突。 環境變數和它們所代表的 Azure 值會列在下表中:

環境變數 Azure 值
ARM_SUBSCRIPTION_ID Azure 訂用帳戶識別碼
ARM_TENANT_ID Microsoft 帳戶租用戶標識碼
ARM_CLIENT_ID Azure 服務主體應用程式識別碼
ARM_CLIENT_SECRET Azure 服務主體密碼

原因:從撰寫本文起,在 Cloud Shell 中執行的 Terraform 腳本會 ARM_SUBSCRIPTION_ID 使用來自目前 Azure 訂用帳戶的值覆寫 和 ARM_TENANT_ID 環境變數。 因此,如果環境變數所參考的服務主體沒有目前 Azure 訂用帳戶的許可權,任何 Terraform 作業都會失敗。

取得狀態鎖定時發生錯誤

錯誤訊息

錯誤:取得狀態鎖定時發生錯誤;錯誤訊息:發生 2 個錯誤:
* 狀態 Blob 已鎖定
* blob 元數據 “terraformlockid” 是空的
Terraform 會取得狀態鎖定,以防止多個用戶同時寫入狀態。 請解決上述問題,然後再試一次。 對於大部分的命令,您可以使用 「-lock=false」 旗標停用鎖定,但不建議這麼做。

背景: 如果您針對 Terraform 狀態檔案執行 Terraform 命令,而且此錯誤是唯一出現的訊息,可能會套用下列原因。 適用於本機和遠端狀態檔案。

原因: 此錯誤有兩個可能的原因。 第一個是 Terraform 命令已經針對狀態檔案執行,而且它已強制鎖定檔案,因此不會中斷任何專案。 第二個潛在原因是當命令執行時,狀態檔案與 CLI 之間發生連線中斷。 當您使用遠端狀態檔案時,最常發生此中斷。

解決方案: 首先,請確定您尚未對狀態檔案執行任何命令。 如果您使用本機狀態檔案,請檢查您是否有執行任何命令的終端機。 或者,請檢查您的部署管線,以查看執行中的專案是否使用狀態檔案。 如果這無法解決問題,則第二個原因可能會觸發錯誤。 對於儲存在 Azure 儲存體 帳戶容器中的遠端狀態檔案,您可以找出檔案並使用 [中斷租用] 按鈕。

Screenshot that shows the Azure Storage container Break lease button.

如果您使用其他後端來儲存狀態檔案,如需建議,請參閱 HashiCorp 檔

VPN 錯誤

如需解決 VPN 錯誤的相關信息,請參閱針對混合式 VPN 連線進行疑難解答一文