共用方式為


基礎結構即程式碼

小提示

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

Azure 電子書的雲端原生 .NET 應用程式封面縮圖。

雲端原生系統採用微服務、容器和現代化系統設計,以達到速度和靈活性。 它們提供自動化的建置和發行階段,以確保一致且高品質的程序代碼。 但是,這隻是故事的一部分。 如何布建這些系統執行所在的雲端環境?

新式雲端原生應用程式採用基礎結構 即程式代碼IaC廣泛接受的做法。 透過 IaC,您將平臺佈建自動化。 您基本上會將測試與版本控制等軟體工程實務套用至 DevOps 實務。 您的基礎結構和部署是自動化、一致且可重複的。 就像持續傳遞自動化傳統手動部署模型一樣,基礎結構即程序代碼 (IaC) 正在演進如何管理應用程式環境。

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

Azure 資源管理員範本

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 設定語言)。

圖 10-16 顯示與先前 Resource Manager 範本相同的範例 Terraform 檔案(圖 10-15:

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 CLI tasks 內嵌在 Azure DevOps 管線中。 執行管線會調用腳本。

圖 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 的 Teams 如何快速且大規模地提供穩定環境。 Teams 透過以程式碼來表示其環境的預期狀態,避免手動設定環境並確保一致性。 使用 IaC 的基礎結構部署是可重複的,並防止因設定漂移或遺失相依性所造成的運行時間問題。 DevOps 小組可以與一組統一的做法和工具合作,以快速、可靠且大規模地傳遞應用程式和其支援的基礎結構。