使用 Bash 在 Azure Cloud Shell 中設定 Terraform

Terraform 可讓您定義、預覽和部署雲端基礎結構。 使用 Terraform 時,您可以使用 HCL 語法來建立設定檔。 HCL 語法可讓您指定雲端提供者 (例如 Azure) 和構成雲端基礎結構的元素。 建立設定檔之後,您可以建立執行計畫,讓您先預覽基礎結構變更,之後再部署。 驗證變更之後,您可以套用執行計畫來部署基礎結構。

本文提供向 Azure 驗證以搭配 Terraform 使用的選項。

在本文中,您將學會如何:

  • 設定Cloud Shell
  • 顯示目前的 Azure 帳戶
  • 瞭解常見的 Terraform 和 Azure 驗證案例
  • 使用 Bash 或 PowerShell) 透過 Cloud Shell (Microsoft 帳戶進行驗證
  • 使用 Bash 或 PowerShell) 透過 Windows (的 Microsoft 帳戶進行驗證
  • 使用 Azure CLI 建立服務主體
  • 使用 Azure PowerShell 建立服務主體
  • 在環境變數中指定服務主體認證
  • 在 Terraform 提供者區塊中指定服務主體認證

1. 設定環境

  • Azure 訂用帳戶:如果您沒有 Azure 訂用帳戶,請在開始前建立免費帳戶

2. 開啟Cloud Shell

  1. 如果您已經開啟Cloud Shell會話,您可以跳到下一節。

  2. 瀏覽至 Azure 入口網站

  3. 如有必要,請登入您的 Azure 訂用帳戶並變更 Azure 目錄。

  4. 開啟 Cloud Shell。

    從Azure 入口網站的頂端功能表開啟Cloud Shell。

  5. 如果您先前未使用 Cloud Shell,請設定環境和儲存體設定。

  6. 選取命令列環境。

    選取您想要在 Cloud Shell中使用的 CLI。

3.在 Azure Cloud Shell中安裝最新版本的 Terraform

Cloud Shell自動更新最新版的 Terraform。 不過,更新會于發行後的幾周內出現。 本文說明如何下載並安裝目前版本的 Terraform。

  1. 判斷Cloud Shell中使用的 Terraform 版本。

    terraform version
    
  2. 如果安裝在 Cloud Shell 中的 Terraform 版本不是最新版本,您會看到一則訊息,指出 Terraform 的版本已過期。

  3. 如果您使用指定的版本,請跳至下一節。 否則,請繼續進行下列步驟。

  4. 流覽至 Terraform 下載頁面

  5. 向下捲動至 Linux 下載連結。

  6. 將滑鼠移至 64 位 連結上方。 此連結適用于最新的 64 位 Linux AMD 版本,適用于Cloud Shell。

  7. 複製 URL。

  8. 執行 curl ,將預留位置取代為上一個步驟中的 URL。

    curl -O <terraform_download_url>
    
  9. 將檔案解壓縮。

    unzip <zip_file_downloaded_in_previous_step>
    
  10. 如果目錄不存在,請建立名為 的 bin 目錄。

    mkdir bin
    
  11. terraform 檔案移至 bin 目錄。

    mv terraform bin/    
    
  12. 關閉並重新啟動Cloud Shell。

  13. 確認下載的 Terraform 版本是路徑中的第一個版本。

    terraform version
    

4.確認預設 Azure 訂用帳戶

當您使用 Microsoft 帳戶登入Azure 入口網站時,會使用該帳戶的預設 Azure 訂用帳戶。

Terraform 會自動使用預設 Azure 訂用帳戶中的資訊進行驗證。

執行 az account show 以確認目前的 Microsoft 帳戶和 Azure 訂用帳戶。

az account show

您透過 Terraform 所做的任何變更都位於顯示的 Azure 訂用帳戶上。 如果這是您想要的內容,請略過本文的其餘部分。

5.向 Azure 驗證 Terraform

Terraform 和 Azure 驗證案例

Terraform 僅支援透過 Azure CLI 向 Azure 進行驗證。 不支援使用Azure PowerShell進行驗證。 因此,雖然您可以在執行 Terraform 工作時使用 Azure PowerShell 模組,但您必須先使用 Azure CLI 向 Azure 進行驗證。

本文說明如何針對下列案例向 Azure 驗證 Terraform。 如需向 Azure 驗證 Terraform 選項的詳細資訊,請參閱 使用 Azure CLI 進行驗證

透過 Microsoft 帳戶向 Azure 進行驗證

Microsoft 帳戶是與電子郵件及其認證相關聯的使用者名稱 (,) 用來登入 Microsoft 服務,例如 Azure。 Microsoft 帳戶可以與一或多個 Azure 訂用帳戶相關聯,其中一個訂用帳戶是預設值。

下列步驟示範如何:

  • 使用 Microsoft 帳戶以互動方式登入 Azure
  • 列出帳戶的相關 Azure 訂用帳戶, (包括預設)
  • 設定目前的訂用帳戶。
  1. 開啟可存取 Azure CLI 的命令列。

  2. 執行不含任何參數 的 az login ,並遵循指示登入 Azure。

    az login
    

    重點︰

    • 成功登入時, az login 會顯示與已登入 Microsoft 帳戶相關聯的 Azure 訂用帳戶清單,包括預設訂用帳戶。
  3. 若要確認目前的 Azure 訂用帳戶,請執行 az account show

    az account show
    
  4. 若要檢視特定 Microsoft 帳戶的所有 Azure 訂用帳戶名稱和識別碼,請執行 az account list

    az account list --query "[?user.name=='<microsoft_account_email>'].{Name:name, ID:id, Default:isDefault}" --output Table
    

    重點︰

    • <microsoft_account_email> 預留位置取代為您想要列出其 Azure 訂用帳戶的 Microsoft 帳戶電子郵件地址。
    • 使用 Live 帳戶,例如 Hotmail 或 Outlook ,您可能需要指定完整的電子郵件地址。 例如,如果您的電子郵件地址是 admin@hotmail.com ,您可能需要將預留位置取代為 live.com#admin@hotmail.com
  5. 若要使用特定的 Azure 訂用帳戶,請執行 az account set

    az account set --subscription "<subscription_id_or_subscription_name>"
    

    重點︰

    • <subscription_id_or_subscription_name> 預留位置取代為您要使用的訂用帳戶識別碼或名稱。
    • 呼叫 az account set 不會顯示切換至指定 Azure 訂用帳戶的結果。 不過,您可以使用 az account show 來確認目前的 Azure 訂用帳戶是否已變更。
    • 如果您從上一個步驟執行 az account list 命令,您會看到預設 Azure 訂用帳戶已變更為您指定的訂用 az account set 帳戶。

建立服務主體

部署或使用 Azure 服務的自動化工具 (例如 Terraform),應一律具有受限制的權限。 Azure 提供的服務主體,可替代以具有完整權限的使用者身分登入應用程式。

最常見的模式是以互動方式登入 Azure、建立服務主體、測試服務主體,然後使用該服務主體進行未來驗證, (以互動方式或從腳本) 。

  1. 若要建立服務主體,請登入 Azure。 透過 Microsoft 帳戶向 Azure 驗證之後,請返回這裡。

  2. 如果您要從 Git Bash 建立服務主體,請設定 MSYS_NO_PATHCONV 環境變數。 (如果您使用 Cloud Shell.) ,則不需要此步驟

    export MSYS_NO_PATHCONV=1    
    

    重點︰

    • 您可以 MSYS_NO_PATHCONV 針對所有終端機會話) 或本機 (設定全域 (的環境變數,只針對目前的會話) 。 由於建立服務主體不是您經常執行的動作,因此範例會設定目前會話的值。 若要全域設定此環境變數,請將設定新增至 ~/.bashrc 檔案。
  3. 若要建立服務主體,請執行 az ad sp create-for-rbac

    az ad sp create-for-rbac --name <service_principal_name> --role Contributor --scopes /subscriptions/<subscription_id>
    

    重點︰

    • 您可以將 取代 <service-principal-name> 為環境的自訂名稱,或完全省略 參數。 如果您省略 參數,則會根據目前的日期和時間產生服務主體名稱。
    • 成功完成時,az ad sp create-for-rbac 會顯示數個值。 下一個步驟會使用 appIdpasswordtenant 值。
    • 如果遺失,就無法擷取密碼。 因此,您應該將密碼儲存在安全的地方。 如果您忘記密碼,您可以 重設服務主體認證
    • 在本文中,正在使用具有 參與者 角色的服務主體。 如需Role-Based 存取控制 (RBAC) 角色的詳細資訊,請參閱RBAC:內建角色
    • 建立服務主體的輸出包含敏感性認證。 請確定您的程式碼中未包含這些認證,或將認證簽入原始檔控制。
    • 如需使用 Azure CLI 建立服務主體時之選項的詳細資訊,請參閱 使用 Azure CLI 建立 Azure 服務主體一文。

在環境變數中指定服務主體認證

建立服務主體之後,您可以透過環境變數指定其認證給 Terraform。

  1. ~/.bashrc新增下列環境變數來編輯檔案。

    export ARM_SUBSCRIPTION_ID="<azure_subscription_id>"
    export ARM_TENANT_ID="<azure_subscription_tenant_id>"
    export ARM_CLIENT_ID="<service_principal_appid>"
    export ARM_CLIENT_SECRET="<service_principal_password>"
    
  2. 若要執行 ~/.bashrc 腳本,請執行 source ~/.bashrc (或其縮寫的對等 . ~/.bashrc) 。 您也可以結束並重新開啟Cloud Shell,讓腳本自動執行。

    . ~/.bashrc
    
  3. 設定環境變數之後,您可以驗證其值,如下所示:

    printenv | grep ^ARM*
    

重點︰

  • 如同任何環境變數,若要從 Terraform 腳本記憶體取 Azure 訂用帳戶值,請使用下列語法: ${env.<environment_variable>} 。 例如,若要存取 ARM_SUBSCRIPTION_ID 值,請指定 ${env.ARM_SUBSCRIPTION_ID}
  • 建立及套用 Terraform 執行計畫會對與服務主體相關聯的 Azure 訂用帳戶進行變更。 如果您已登入一個 Azure 訂用帳戶,而環境變數指向第二個 Azure 訂用帳戶,這個事實有時可能會造成混淆。 讓我們看看下列範例來說明。 假設您有兩個 Azure 訂用帳戶:SubA 和 SubB。 如果目前的 Azure 訂用帳戶是 SubA (透過) 決定 az account show ,而環境變數指向 SubB,則 Terraform 所做的任何變更都位於 SubB 上。 因此,您必須登入您的 SubB 訂用帳戶,才能執行 Azure CLI 命令或Azure PowerShell命令來檢視變更。

在 Terraform 提供者區塊中指定服務主體認證

Azure 提供者區塊會定義可讓您指定 Azure 訂用帳戶驗證資訊的語法。

terraform {
  required_providers {
    azurerm = {
      source = "hashicorp/azurerm"
      version = "~>2.0"
    }
  }
}

provider "azurerm" {
  features {}

  subscription_id   = "<azure_subscription_id>"
  tenant_id         = "<azure_subscription_tenant_id>"
  client_id         = "<service_principal_appid>"
  client_secret     = "<service_principal_password>"
}

# Your code goes here

警告

在 Terraform 組態檔中指定 Azure 訂用帳號憑證的能力可能很方便,特別是在測試時。 不過,不建議將認證儲存在可由非信任個人檢視的純文字檔案中。

對 Azure 上的 Terraform 進行疑難排解

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

後續步驟