練習 - 將條件式邏輯新增到 ARM 範本

已完成

在先前的練習中,您使用了 Linux 虛擬機器。 在這裡,您會進行一些調整,並專注於管理儲存體帳戶。

假設您有三個需要部署到其中的環境:開發、預備和實際執行。

  • 「開發」環境是將您應用程式所需的所有項目放在一起的第一個位置。 此環境可能包括網頁伺服器、負載平衡器和資料庫。
  • 「預備」環境是在將新的應用程式功能發行給終端使用者之前進行最後測試的位置。
  • 「實際執行」環境是終端使用者存取您應用程式的位置。

當您從「開發」環境移至「實際執行」環境時,需要額外的基礎結構。 例如,在「實際執行」環境中,您另外還需要一個先前環境中不需要的儲存體帳戶。

在這裡,您使用條件來控制佈建儲存體帳戶的時機。 這麼做可讓您從相同的 ARM 範本支援您的每個基礎結構環境。

建立 ARM 範本

在這裡,您建立 Azure Resource Manager (ARM) 範本來定義儲存體帳戶資源。

此範本也會定義兩個參數:

  • environment:目前環境的名稱。
  • storageAccountName:儲存體帳戶的名稱。

environment 可以有以下三個值的其中之一:devstagingproduction。 只有當 environment 等於 production 時,條件才會佈建儲存體帳戶。

  1. 在 Visual Studio Code 中,於包含 azuredeploy.json 的相同目錄中,建立名為condition.json 的檔案。

  2. 將這些內容新增到 condition.json

    {
      "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
      "contentVersion": "1.0.0.0",
      "parameters": {
        "environment": {
          "type": "string",
          "defaultValue": "dev",
          "allowedValues": [
            "dev",
            "staging",
            "production"
          ],
          "metadata": {
            "description": "a value that represents the current environment"
          }
        },
        "storageAccountName": {
          "type": "string",
          "metadata": {
            "description": "a name for the account"
          }
        }
      },
      "functions": [],
      "variables": {},
      "resources": [
        {
          "condition": "[equals(parameters('environment'),'production')]",
          "name": "[parameters('storageAccountName')]",
          "type": "Microsoft.Storage/storageAccounts",
          "apiVersion": "2019-06-01",
          "tags": {
            "displayName": "[parameters('storageAccountName')]"
          },
          "location": "[resourceGroup().location]",
          "kind": "StorageV2",
          "sku": {
            "name": "Premium_LRS",
            "tier": "Premium"
          }
        }
      ],
      "outputs": {}
    }
    

在這裡,您將使用 PowerShell 與 Az 模組,利用條件建構來部署 ARM 範本。

佈建開發環境

在這裡,您會將 ARM 範本部署到「開發」環境。 若要這麼做,請將 environment 範本參數設定為 dev

由於條件只有在 environment 等於 production 時才會佈建儲存體帳戶,因此,您預期範本不會佈建儲存體帳戶。 換句話說,您預期部署不會包含任何資源。

  1. 建立 PowerShell 變數來保存儲存體帳戶名稱。

    $STORAGE_ACCT_NAME="tailwindsa"+ (Get-Random -COUNT 1 -Maximum 9999999 )
    

    儲存體帳戶名稱必須是唯一的。 Get-Random 組件確保儲存體帳戶名稱會以隨機的數字序列結束。

  2. 執行下列 New-AzResourceGroupDeployment 命令,以將範本部署到開發環境:

    New-AzResourceGroupDeployment `
      -TemplateFile "./condition.json" `
      -storageAccountName $STORAGE_ACCT_NAME `
      -environment dev
    

驗證部署到開發環境的作業

請記住,您預期範本尚未佈建儲存體帳戶。

為了驗證此一事實,您執行 Get-AzStorageAccount 命令來檢查儲存體帳戶名稱是否已在使用中。

執行 Get-AzStorageAccount 命令:

Get-AzStorageAccount -Name $STORAGE_ACCT_NAME -ResourceGroupName <rgn>sandbox resource group</rgn>

您的輸出看起來會像這樣:

Get-AzStorageAccount: The Resource 'Microsoft.Storage/storageAccounts/tailwindsa4736629' under resource group '<rgn>name of resource group</rgn>' was not found. For more details please go to https://aka.ms/ARMResourceNotFoundFix

這會告訴您,尚未佈建儲存體帳戶。 由於您尚未部署到實際執行環境,因此,您預期會發生這種情況。

佈建實際執行環境

在這裡,您會將 ARM 範本部署到實際執行環境,類似於您針對「開發」環境的做法。

複習一下,以下是條件在您範本中看起來的樣子:

"condition": "[equals(parameters('environment'),'production')]"

為了觸發此條件,您將 environment 範本參數設定為 production

執行下列 New-AzResourceGroupDeployment 命令,以將範本部署到實際執行環境:

New-AzResourceGroupDeployment `
  -TemplateFile "./condition.json" `
  -storageAccountName $STORAGE_ACCT_NAME `
  -environment production

驗證部署到實際執行環境的作業

這次,您預期範本已佈建儲存體帳戶。

為了驗證此一事實,您再次執行 Get-AzStorageAccount 命令來檢查儲存體帳戶名稱是否正在使用中。

執行下列 Get-AzStorageAccount 命令:

Get-AzStorageAccount -Name $STORAGE_ACCT_NAME -ResourceGroupName <rgn>sandbox resource group</rgn>

這次,您將得到不同的輸出。 其不會顯示錯誤訊息,而是顯示此資料表輸出,其中顯示儲存體帳戶資源的相關資訊:

您的輸出看起來會像這樣:

Location Name              Type                              Kind
-------- ----              ----                              ----
westus   tailwindsa4736629 Microsoft.Storage/storageAccounts StorageV2

這些值會告訴您,儲存體帳戶已如您所預期般佈建。

雖然這是基本範例,但您會看到如何根據條件進行部署。

實務上,您的「開發」、「預備」和「實際執行」環境均包含額外的 Azure 資源,以支援您的計算、網路和儲存需求。 每個環境可能都會透過其本身的資源群組進行管理,如此便能佈建環境並將其視為單一單位。

建立 ARM 範本

在這裡,您建立 Azure Resource Manager (ARM) 範本來定義儲存體帳戶資源。

此範本也會定義兩個參數:

  • environment:目前環境的名稱。
  • storageAccountName:儲存體帳戶的名稱。

environment 可以有以下三個值的其中之一:devstagingproduction。 只有當 environment 等於 production 時,條件才會佈建儲存體帳戶。

  1. 在 Visual Studio Code 中,於包含 azuredeploy.json 的相同目錄中,建立名為condition.json 的檔案。

  2. 將這些內容新增到 condition.json

    {
      "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
      "contentVersion": "1.0.0.0",
      "parameters": {
        "environment": {
          "type": "string",
          "defaultValue": "dev",
          "allowedValues": [
            "dev",
            "staging",
            "production"
          ],
          "metadata": {
            "description": "a value that represents the current environment"
          }
        },
        "storageAccountName": {
          "type": "string",
          "metadata": {
            "description": "a name for the account"
          }
        }
      },
      "functions": [],
      "variables": {},
      "resources": [
        {
          "condition": "[equals(parameters('environment'),'production')]",
          "name": "[parameters('storageAccountName')]",
          "type": "Microsoft.Storage/storageAccounts",
          "apiVersion": "2019-06-01",
          "tags": {
            "displayName": "[parameters('storageAccountName')]"
          },
          "location": "[resourceGroup().location]",
          "kind": "StorageV2",
          "sku": {
            "name": "Premium_LRS",
            "tier": "Premium"
          }
        }
      ],
      "outputs": {}
    }
    

佈建開發環境

在這裡,您會將 ARM 範本部署到「開發」環境。 若要這麼做,請將 environment 範本參數設定為 dev

由於條件只有在 environment 等於 production 時才會佈建儲存體帳戶,因此,您預期範本不會佈建儲存體帳戶。 換句話說,您預期部署不會包含任何資源。

  1. 建立 Bash 變數來保存儲存體帳戶名稱。

    STORAGE_ACCT_NAME=tailwindsa$RANDOM
    

    儲存體帳戶名稱必須是唯一的。 $RANDOM 組件確保儲存體帳戶名稱會以隨機的數字序列結束。

  2. 執行下列 az deployment group create 命令,以將範本部署到開發環境:

    az deployment group create \
      --template-file condition.json \
      --parameters storageAccountName=$STORAGE_ACCT_NAME environment=dev
    

驗證部署到開發環境的作業

請記住,您預期範本尚未佈建儲存體帳戶。

為了驗證此一事實,您執行 az storage account check-name 命令來檢查儲存體帳戶名稱是否已在使用中。

執行下列 az storage account check-name 命令:

az storage account check-name --name $STORAGE_ACCT_NAME

您會看到:

{
  "message": null,
  "nameAvailable": true,
  "reason": null
}

nameAvailable 的值為 true,這表示儲存體帳戶名稱仍然可用且尚未佈建。 由於您尚未部署到實際執行環境,因此,您預期會發生這種情況。

佈建實際執行環境

在這裡,您會將 ARM 範本部署到實際執行環境,類似於您針對「開發」環境的做法。

複習一下,以下是條件在您範本中看起來的樣子:

"condition": "[equals(parameters('environment'),'production')]"

為了觸發此條件,您將 environment 範本參數設定為 production

執行下列 az deployment group create 命令,以將範本部署到實際執行環境:

az deployment group create \
  --template-file condition.json \
  --parameters storageAccountName=$STORAGE_ACCT_NAME environment=production

驗證部署到實際執行環境的作業

這次,您預期範本已佈建儲存體帳戶。

為了驗證此一事實,您再次執行 az storage account check-name 命令來檢查儲存體帳戶名稱是否正在使用中。

執行下列 az storage account check-name 命令:

az storage account check-name --name $STORAGE_ACCT_NAME

您的輸出看起來會像這樣:

{
  "message": "The storage account named tailwindsa32100 is already taken.",
  "nameAvailable": false,
  "reason": "AlreadyExists"
}

這些值會告訴您,儲存體帳戶已如您所預期般佈建。

雖然這是基本範例,但您會看到如何根據條件進行部署。

實務上,您的「開發」、「預備」和「實際執行」環境均包含額外的 Azure 資源,以支援您的計算、網路和儲存需求。 每個環境可能都會透過其本身的資源群組進行管理,如此便能佈建環境並將其視為單一單位。