探索 Azure Resource Manager 範本結構

已完成

在此單元中,您將了解如何使用 Azure Resource Manager 範本 (ARM 範本) 實作基礎結構即程式碼。 您可以調查 ARM 範本的區段、了解如何將 ARM 範本部署至 Azure,以及深入了解 ARM 範本的 resources 區段。

什麼是基礎結構即程式碼?

基礎結構即程式碼可讓您透過程式碼描述您應用程式所需的基礎結構。

您可以透過基礎結構即程式碼,在中央程式碼存放庫中維護應用程式程式碼,以及部署應用程式所需的一切。 基礎結構即程式碼的優點如下:

  • 設定一致
  • 可擴縮性提升
  • 部署速度更快
  • 可追蹤性更佳

這段影片說明基礎結構即程式碼:

什麼是 ARM 範本?

ARM 範本是 JavaScript 物件標記法 (JSON) 檔案,可定義部署的基礎結構和設定。 範本會使用的宣告式語法。 宣告式語法是一種建立結構和元素的方法,可在不描述其控制流程的情況下,概述資源的外觀。 宣告式語法與命令式語法不同,後者會使用命令,讓電腦執行。 命令式指令碼著重於指定部署資源的每個步驟。

ARM 範本可讓您宣告想要部署的內容,而不需要撰寫程式設計命令序列來建立該內容。 在 ARM 範本中,您可以指定資源和這些資源的屬性。 然後,Azure Resource Manager 會使用該資訊,以有組織且一致的方式來部署資源。

使用 ARM 範本的優點

ARM 範本可讓您將部署自動化,並使用基礎結構即程式碼 (IaC) 的做法。 範本程式碼會成為基礎結構和開發專案的一部分。 就像應用程式程式碼一樣,您可以將 IaC 檔案儲存在來源存放庫中,並控制其版本。

ARM 範本具等冪性,也就是說,您可以多次部署相同的範本,並在相同的狀態下取得相同的資源類型。

Resource Manager 會協調部署資源,使其以正確的順序建立。 可能的話,也會以平行方式建立資源,因此 ARM 範本部署的完成速度會比指令碼式部署更快。

顯示範本處理程序對應的圖表,顯示僅存在一次處理範本的呼叫,而不是數次處理指令碼的呼叫。

Resource Manager 也有內建驗證。 其在開始部署之前檢查範本,以確保部署將會成功。

如果您的部署變得更複雜,您可以將 ARM 範本分成較小、可重複使用的元件。 您可以在部署階段將這些較小的範本連結在一起。 您也可以在其他範本內嵌套範本。

在 Azure 入口網站中,您可以檢閱部署歷程記錄,並取得部署狀態的相關資訊。 入口網站會顯示所有參數和輸出的值。

您也可以將 ARM 範本整合到持續整合和持續部署 (CI/CD) 工具 (例如 Azure Pipelines) 中,這可以將您的發行管線自動化,以進行快速且可靠的應用程式和基礎結構更新。 您可以使用 Azure DevOps 和 ARM 範本工作,持續建置及部署專案。

ARM 範本檔案結構

撰寫 ARM 範本時,您需要了解組成範本的所有組件及其用途。 ARM 範本檔案是由下列元素所組成:

元素 描述
schema 必要區段,可定義描述 JSON 資料結構的 JSON 結構描述檔案的位置。 您所使用的版本號碼取決於部署範圍以及您的 JSON 編輯器。
contentVersion 必要區段,可定義範本的版本 (例如 1.0.0.0)。 您可以使用此值來記錄範本中的重大變更,以確保您部署的是正確的範本。
apiProfile 選用區段,可定義資源類型的 API 版本集合。 您可以使用此值以避免必須在範本中指定每個資源的 API 版本。
parameters 選用區段,您可以在其中定義部署期間所提供的值。 您可以在參數檔案、透過命令列參數,或在 Azure 入口網站中提供這些值。
variables 選用區段,您可以在其中定義用來簡化範本語言運算式的值。
functions 選用區段,您可以在其中定義範本內可用的使用者定義函式。 當您的範本中重複使用複雜的運算式時,使用者定義函式可以簡化您的範本。
resources 必要區段,可在資源群組或訂用帳戶中,定義您想要部署或更新的實際項目。
output 選用區段,您可以在其中指定部署結束時傳回的值。

將 ARM 範本部署至 Azure

您可以使用下列其中一種方式,將 ARM 範本部署至 Azure:

  • 部署本機範本
  • 部署連結的範本
  • 在持續部署管線中部署

此課程模組著重於部署本機 ARM 範本。 在之後的學習課程模組中,您會了解如何部署更複雜的基礎結構,以及如何與 Azure Pipelines 整合。

若要部署本機範本,您必須在本機上安裝 Azure PowerShellAzure CLI

首先,您要使用 Azure CLI 或 Azure PowerShell 登入 Azure。

az login

接下來,請定義您的資源群組。 您可以使用已定義的資源群組,或是使用下列命令建立新的資源群組。 您可以從:az account list-locations (CLI) 或 Get-AzLocation (PowerShell) 取得可用的位置值。 您可以使用 az configure --defaults location=<location> 設定預設位置。

az group create \
  --name {name of your resource group} \
  --location "{location}"

若要開始在資源群組進行範本部署,請使用 Azure CLI 命令 az deployment group create 或 Azure PowerShell 命令 New-AzResourceGroupDeployment

提示

az deployment group createaz group deployment create 之間的差異在於 az group deployment create 是即將淘汰的舊命令,且會取代為 az deployment group create。 因此,建議您使用 az deployment group create 在資源群組範圍下部署資源。

這兩個命令都需要資源群組、區域和部署的名稱,以便您能夠輕鬆地在部署歷程記錄中識別。 為了方便起見,練習會建立變數來儲存範本檔案的路徑。 此变量使你能够更轻松地运行部署命令,因为无需在每次部署时都重新键入路径。 以下是範例:

若要執行此部署命令,您必須擁有 Azure CLI 的最新版本

templateFile="{provide-the-path-to-the-template-file}"
az deployment group create \
  --name blanktemplate \
  --resource-group myResourceGroup \
  --template-file $templateFile

使用連結的範本來部署複雜的解決方案。 您可以將一個範本分成許多範本,並透過主要範本部署這些範本。 當您部署主要範本時,其會觸發連結範本的部署。 您可以使用 SAS 權杖來儲存及保護連結的範本。

CI/CD 管線會自動建立及部署開發專案,包括 ARM 範本專案。 用於範本部署的兩個最常見的管線分別是 Azure PipelinesGitHub Actions

這兩種部署類型的詳細資訊將涵蓋在其他課程模組中。

將資源新增至範本

若要將資源新增至範本,您必須知道資源提供者及其資源類型。 此組合的語法採用 {resource-provider}/{resource-type} 的格式。 例如,若要將儲存體帳戶資源新增至範本,您將需要 Microsoft.Storage 資源提供者。 這個提供者的其中一個類型是 storageAccount。 因此,資源類型會顯示為 Microsoft.Storage/storageAccounts。 您可以使用 Azure 服務的資源提供者清單來尋找您所需的提供者。

定義提供者和資源類型之後,您必須了解所要使用的每個資源類型屬性。 如需詳細資料,請參閱在 Azure Resource Manager 範本中定義資源 \(英文\)。 若要尋找資源,請檢視左側資料行中的清單。 請注意,這些屬性是依 API 版本排序的。

顯示已選取儲存體帳戶文件的 Microsoft 文件頁面螢幕擷取畫面。

以下是 [儲存體帳戶] 頁面中列出的一些屬性範例:

顯示部分儲存體帳戶屬性的 Microsoft 文件頁面螢幕擷取畫面。

針對我們的儲存體範例,您的範本可能如下所示:

{
  "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
  "contentVersion": "1.0.0.1",
  "apiProfile": "",
  "parameters": {},
  "variables": {},
  "functions": [],
  "resources": [
    {
      "type": "Microsoft.Storage/storageAccounts",
      "apiVersion": "2023-05-01",
      "name": "learntemplatestorage123",
      "location": "westus",
      "sku": {
        "name": "Standard_LRS"
      },
      "kind": "StorageV2",
      "properties": {
        "supportsHttpsTrafficOnly": true
      }
    }
  ],
  "outputs": {}
}