共用方式為


基礎結構即程式碼

提示

此內容摘錄自《建構適用於 Azure 的雲端原生 .NET 應用程式》電子書,您可以在 .NET Docs 找到此電子書,或免費下載可離線閱讀的 PDF。

Cloud Native .NET apps for Azure eBook cover thumbnail.

雲端原生系統採用微服務、容器和現代化系統設計,以達到速度和靈活性。 其自動化建置和發行階段可確保程式碼的一致性與品質。 但這只說明了部分情況。 該如何佈建這些系統執行所在的雲端環境?

新式雲端原生應用程式採用廣受使用的做法:基礎結構即程式碼 (或簡稱 IaC)。 透過 IaC,您可以自動執行平台佈建。 您基本上會將測試和版本設定等軟體工程實務套用至 DevOps 做法。 您的基礎結構和部署是自動化、一致且可重複的。 就像持續傳遞實現了傳統模型手動部署的自動化一樣,基礎結構即程式碼 (IaC) 也正在改進應用程式環境的管理方式。

Azure Resource Manager (ARM)、Terraform 和 Azure 命令列介面 (CLI) 等工具可讓您以宣告方式編寫所需雲端基礎結構的指令碼。

Azure Resource Manager 範本

ARM 代表 Azure Resource Manager。 這是內建於 Azure、並以 API 服務形式公開的 API 佈建引擎。 ARM 可讓您在一個協調的作業中部署、更新、刪除和管理 Azure 資源群組中包含的資源。 您可為引擎提供以 JSON 為基礎的範本,以指定您所需的資源及其組態。 ARM 會根據相依性以正確順序自動協調部署。 引擎會確保等冪性。 如果已有所需的資源設定了相同組態,則會忽略佈建。

Azure Resource Manager 範本是以 JSON 為基礎的語言,用來定義 Azure 中的各種資源。 基本結構描述如圖 10-14 所示。

{
  "$schema": "https://schema.management.azure.com/schemas/2015-01-01/deploymentTemplate.json#",
  "contentVersion": "",
  "apiProfile": "",
  "parameters": {  },
  "variables": {  },
  "functions": [  ],
  "resources": [  ],
  "outputs": {  }
}

圖 10-14 - Resource Manager 範本的結構描述

在此範本中,我們可在資源區段內定義儲存體容器,如下所示:

"resources": [
    {
      "type": "Microsoft.Storage/storageAccounts",
      "name": "[variables('storageAccountName')]",
      "location": "[parameters('location')]",
      "apiVersion": "2018-07-01",
      "sku": {
        "name": "[parameters('storageAccountType')]"
      },
      "kind": "StorageV2",
      "properties": {}
    }
  ],

圖 10-15 - Resource Manager 範本中定義的儲存體帳戶的範例

ARM 範本可使用動態環境和組態資訊進行參數化。 這麼做可使其重複用來定義不同的環境,例如開發、QA 或生產環境。 一般而言,範本會在單一 Azure 資源群組內建立所有資源。 如有需要,可以在單一 Resource Manager 範本中定義多個資源群組。 您可以藉由刪除資源群組本身,將某個環境中的所有資源全部刪除。 此外也可在資源群組層級執行成本分析,以快速計算每個環境的成本。

GitHub 上的 Azure 快速入門範本專案提供了許多 ARM 範本的範例。 這些範例有助於加速建立新範本或修改現有的範本。

Resource Manager 範本可透過許多方式執行。 最簡單的方式或許是直接將其貼到 Azure 入口網站中。 如果是實驗性部署,此方法可能很快速。 這些範本也可以在 Azure DevOps 中以建置或發行程序執行。 有些工作會藉由連線至 Azure 來執行範本。 Resource Manager 範本的變更會以累加方式套用,意即若要新增資源,只需將其新增至範本即可。 工具會協調目前的資源與範本中定義的資源之間的差異。 隨後將據以建立或改變資源,使其符合範本中定義的資源。

Terraform

雲端原生應用程式常會建構為 cloud agnostic。 這表示應用程式不會與特定雲端廠商緊密關聯,而可部署到任何公用雲端。

Terraform 是一項商業範本化工具,可在所有主要雲端平台間佈建雲端原生應用程式:Azure、Google Cloud Platform、AWS 和 AliCloud。 此工具不使用 JSON 作為範本定義語言,而是使用較為精簡的 HCL (Hashicorp Configuration Language)。

圖 10-16 顯示與上一個 Resource Manager 範本 (圖 10-15) 執行相同動作的範例 Terraform 檔案:

provider "azurerm" {
  version = "=1.28.0"
}

resource "azurerm_resource_group" "testrg" {
  name     = "production"
  location = "West US"
}

resource "azurerm_storage_account" "testsa" {
  name                     = "${var.storageAccountName}"
  resource_group_name      = "${azurerm_resource_group.testrg.name}"
  location                 = "${var.region}"
  account_tier             = "${var.tier}"
  account_replication_type = "${var.replicationType}"

}

圖 10-16 - Resource Manager 範本的範例

Terraform 也提供問題範本的直覺式錯誤訊息。 另外還有一項方便的驗證工作,可在建置階段用來及早攔截範本錯誤。

與 Resource Manager 範本相同,命令列工具也可用來部署 Terraform 範本。 Azure Pipelines 中也有社群建立的工作,可用來驗證及套用 Terraform 範本。

Terraform 和 ARM 範本有時會輸出有意義的值,例如新建資料庫的連接字串。 這項資訊可以在組建管線中擷取,並且後續工作中使用。

Azure CLI 指令碼和工作

最後,您可以利用 Azure CLI 以宣告方式編寫雲端基礎結構的指令碼。 您可以建立、尋找及共用 Azure CLI 指令碼,以佈建和設定絕大多數的 Azure 資源。 CLI 很容易使用,且學習曲線平緩。 指令碼可在 PowerShell 或 Bash 內執行。 其偵錯也很容易,與 ARM 範本相比尤其如此。

當您需要拆卸並重新部署基礎結構時,Azure CLI 指令碼將有良好成效。 更新現有的環境可能並不容易。 許多 CLI 命令不具等冪性。 這表示它們在每次執行時都會重新建立資源,即使資源已存在亦然。 在建立每項資源之前,一律可新增程式碼來檢查該資源是否已存在。 但如此一來,您的指令碼可能會變得過大而難以管理。

這些指令碼也可以內嵌在 Azure DevOps 管線中,作為 Azure CLI tasks。 執行管線時會叫用指令碼。

圖 10-17 顯示 YAML 程式碼片段,其中列出 Azure CLI 的版本和訂閱的詳細資料。 請留意 Azure CLI 命令如何包含在內嵌指令碼中。

- task: AzureCLI@2
  displayName: Azure CLI
  inputs:
    azureSubscription: <Name of the Azure Resource Manager service connection>
    scriptType: ps
    scriptLocation: inlineScript
    inlineScript: |
      az --version
      az account show

圖 10-17 - Azure CLI 指令碼

基礎結構即程式碼是什麼一文中,作者 Sam Guckenheimer 說明「實作 IaC 的團隊如何快速且大規模地交付穩定的環境。 團隊可避免手動設定環境,並透過程式碼表示其環境的預期狀態以強制執行一致性。 使用 IaC 的基礎結構部署是可重複的,並能防止因組態漂移或遺失相依性所造成的執行階段問題。 DevOps 團隊可以使用一組整合的做法和工具,以快速、可靠且大規模的方式交付應用程式及其支援的基礎結構。」