使用 Bash 在 Azure Cloud Shell 中設定 Terraform

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

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

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

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

1.設定您的環境

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

2. 開啟 Cloud Shell

  1. 如果您已經開啟 Cloud Shell 工作階段,您可以跳至下一節。

  2. 瀏覽至 Azure 入口網站

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

  4. 開啟 Cloud Shell。

    Open Cloud Shell from the top menu in the Azure portal.

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

  6. 選取命令行環境。

    Select the CLI you want to use in Cloud Shell.

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 位 連結上方。 此連結適用於適用於 Cloud Shell 的最新 64 位 Linux AMD 版本。

  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 值。
    • 如果遺失,就無法擷取密碼。 因此,您應該將密碼儲存在安全的地方。 如果您忘記密碼,您可以 重設服務主體認證
    • 在本文中,正在使用具有 參與者 角色的服務主體。 如需角色型 存取控制 (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. 若要執行文稿,請執行 ~/.bashrcsource ~/.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 時的常見問題進行疑難排解

下一步