練習 - 有條件地部署資源

已完成

注意

當您第一次啟動沙箱並接受條款時,您的 Microsoft 帳戶會與名為「Microsoft Learn 沙箱」的新 Azure 目錄建立關聯。 系統也會將您新增至名為「指引訂用帳戶」的特殊訂用帳戶。

您需要將玩具公司的資源部署到各種環境,而且您想要使用參數和條件來控制部署到每個環境的項目。

在此練習中,您將會建立 Azure SQL 邏輯伺服器和資料庫。 然後,新增稽核設定來確保已啟用稽核,但您只想要在部署至實際執行環境時才啟用稽核。 為了稽核,您必須要有儲存體帳戶,但也只在將資源部署至實際執行環境時才部署此儲存體帳戶。

在此過程中,您將會:

  • 建立 Bicep 檔案來定義邏輯伺服器和資料庫。
  • 新增儲存體帳戶和 SQL 稽核設定,而且都依條件來部署。
  • 為開發環境設定基礎結構,然後驗證結果。
  • 重新部署實際執行環境的基礎結構,然後查看變更。

此練習使用適用於 Visual Studio Code 的 Bicep 延伸模組。 請務必在 Visual Studio Code 中安裝此延伸模組。

建立內有邏輯伺服器和資料庫的 Bicep 範本

  1. 打開 Visual Studio Code。

  2. 建立名為 main.bicep 的新檔案。

  3. 儲存空檔案,讓 Visual Studio Code 載入 Bicep 工具。

    您可以選取 [檔案]>[另存新檔],或在 Windows 中選取Ctrl+S (macOS 為 ⌘+S)。 請務必記住您儲存檔案的位置。 例如,您可能需要建立範本資料夾來儲存檔案。

  4. 若要定義邏輯伺服器和資料庫,請將下列內容新增至檔案,以及這些資源所需的參數和變數。 請自行輸入此內容,而不要複製並貼上,如此才能了解工具在寫入 Bicep 檔案上的助益。

    @description('The Azure region into which the resources should be deployed.')
    param location string
    
    @secure()
    @description('The administrator login username for the SQL server.')
    param sqlServerAdministratorLogin string
    
    @secure()
    @description('The administrator login password for the SQL server.')
    param sqlServerAdministratorLoginPassword string
    
    @description('The name and tier of the SQL database SKU.')
    param sqlDatabaseSku object = {
      name: 'Standard'
      tier: 'Standard'
    }
    
    var sqlServerName = 'teddy${location}${uniqueString(resourceGroup().id)}'
    var sqlDatabaseName = 'TeddyBear'
    
    resource sqlServer 'Microsoft.Sql/servers@2024-05-01-preview' = {
      name: sqlServerName
      location: location
      properties: {
        administratorLogin: sqlServerAdministratorLogin
        administratorLoginPassword: sqlServerAdministratorLoginPassword
      }
    }
    
    resource sqlDatabase 'Microsoft.Sql/servers/databases@2024-05-01-preview' = {
      parent: sqlServer
      name: sqlDatabaseName
      location: location
      sku: sqlDatabaseSku
    }
    

    請注意,所有參數都包含 @description 裝飾項目,有助於讓其更易於使用。 另請注意,sqlServerAdministratorLoginsqlServerAdministratorLoginPassword 參數都已套用 @secure 裝飾項目。 這告訴 Bicep 這些參數值是機密。 Azure 不會將機密值列印到記錄。

新增儲存體帳戶

在邏輯伺服器的稽核設定中,您必須指定儲存體帳戶來包含稽核資料。 您將會更新 Bicep 檔案來建立此儲存體帳戶,但只在要啟用稽核時才這麼做。

  1. 在參數宣告下方,新增下列參數:

    @description('The name of the environment. This must be Development or Production.')
    @allowed([
      'Development'
      'Production'
    ])
    param environmentName string = 'Development'
    
    @description('The name of the audit storage account SKU.')
    param auditStorageAccountSkuName string = 'Standard_LRS'
    
  2. 在變數宣告下方,新增下列變數:

    var auditingEnabled = environmentName == 'Production'
    var auditStorageAccountName = take('bearaudit${location}${uniqueString(resourceGroup().id)}', 24)
    

    請注意,您建立一個名為 auditingEnabled 的變數,作為部署稽核資源時的條件。 建立這樣的變數可讓 Bicep 程式碼更清楚且更容易閱讀。 任何查看您資源上條件的人員都將一目了然實際情況。

    另請注意,auditStorageAccountName 變數使用名為 take() 的函式。 儲存體帳戶名稱的長度上限為 24 個字元,所以此函式會截斷字串尾端,以確保名稱有效。

  3. 在檔案底部,請在資源下方,為儲存體帳戶新增下列資源定義:

    resource auditStorageAccount 'Microsoft.Storage/storageAccounts@2023-05-01' = if (auditingEnabled) {
      name: auditStorageAccountName
      location: location
      sku: {
        name: auditStorageAccountSkuName
      }
      kind: 'StorageV2'  
    }
    

    請注意,儲存體帳戶的定義包含 if 關鍵字來指定部署條件。

新增稽核設定

  1. 在您剛新增的儲存體帳戶下方,新增下列設定:

    resource sqlServerAudit 'Microsoft.Sql/servers/auditingSettings@2024-05-01-preview' = if (auditingEnabled) {
      parent: sqlServer
      name: 'default'
      properties: {
        state: 'Enabled'
        storageEndpoint: environmentName == 'Production' ? auditStorageAccount.properties.primaryEndpoints.blob : ''
        storageAccountAccessKey: environmentName == 'Production' ? auditStorageAccount.listKeys().keys[0].value : ''
      }
    }
    

    請注意,此定義與儲存體帳戶一樣,包含相同的 if 條件。 此外,storageEndpointstorageAccountAccessKey 屬性使用問號 (?) 三元運算子,以確保值一律有效。 如果您不這麼做,Azure Resource Manager 會先評估運算式值,再評估資源部署條件,結果傳回錯誤,因為找不到儲存體帳戶。

  2. 儲存對檔案所做的變更。

驗證 Bicep 檔案

完成上述所有變更之後,Bicep 檔案看起來應該像下列範例:

@description('The Azure region into which the resources should be deployed.')
param location string

@secure()
@description('The administrator login username for the SQL server.')
param sqlServerAdministratorLogin string

@secure()
@description('The administrator login password for the SQL server.')
param sqlServerAdministratorLoginPassword string

@description('The name and tier of the SQL database SKU.')
param sqlDatabaseSku object = {
  name: 'Standard'
  tier: 'Standard'
}

@description('The name of the environment. This must be Development or Production.')
@allowed([
  'Development'
  'Production'
])
param environmentName string = 'Development'

@description('The name of the audit storage account SKU.')
param auditStorageAccountSkuName string = 'Standard_LRS'

var sqlServerName = 'teddy${location}${uniqueString(resourceGroup().id)}'
var sqlDatabaseName = 'TeddyBear'
var auditingEnabled = environmentName == 'Production'
var auditStorageAccountName = take('bearaudit${location}${uniqueString(resourceGroup().id)}', 24)

resource sqlServer 'Microsoft.Sql/servers@2024-05-01-preview' = {
  name: sqlServerName
  location: location
  properties: {
    administratorLogin: sqlServerAdministratorLogin
    administratorLoginPassword: sqlServerAdministratorLoginPassword
  }
}

resource sqlDatabase 'Microsoft.Sql/servers/databases@2024-05-01-preview' = {
  parent: sqlServer
  name: sqlDatabaseName
  location: location
  sku: sqlDatabaseSku
}

resource auditStorageAccount 'Microsoft.Storage/storageAccounts@2023-05-01' = if (auditingEnabled) {
  name: auditStorageAccountName
  location: location
  sku: {
    name: auditStorageAccountSkuName
  }
  kind: 'StorageV2'  
}

resource sqlServerAudit 'Microsoft.Sql/servers/auditingSettings@2024-05-01-preview' = if (auditingEnabled) {
  parent: sqlServer
  name: 'default'
  properties: {
    state: 'Enabled'
    storageEndpoint: environmentName == 'Production' ? auditStorageAccount.properties.primaryEndpoints.blob : ''
    storageAccountAccessKey: environmentName == 'Production' ? auditStorageAccount.listKeys().keys[0].value : ''
  }
}

否則,請複製範例或調整範本,以符合範例。

將 Bicep 範本部署至 Azure

若要將此範本部署至 Azure,您必須從 Visual Studio Code 終端機登入您的 Azure 帳戶。 請確定您已安裝 Azure CLI,並記得使用您用來啟動沙箱的相同帳戶登入。

  1. 在 [終端機] 功能表上,選取 [新增終端機]。 終端機視窗通常隨即在畫面的下半部開啟。

  2. 如果終端視窗在右側顯示 bash,表示已開啟正確的殼層。 或者,如果您在右側看到 Bash 殼層圖示,則可以加以選取來啟動殼層。

    Visual Studio Code 終端視窗的螢幕擷取畫面,其中顯示 bash 選項。

    如果出現 bash 以外的殼層,請選取殼層下拉式清單箭號,然後選取 [Git Bash]

    Visual Studio Code 終端視窗的螢幕擷取畫面,其中顯示終端殼層下拉式清單並已選取 [Git Bash (預設)]。

  3. 在終端機中,前往您儲存範本的目錄。 例如,若將範本儲存於 templates 資料夾,則可使用此命令:

    cd templates
    

安裝 Bicep

執行以下命令,確保您有最新版本 Bicep:

az bicep install && az bicep upgrade

登入 Azure

  1. 在 Visual Studio Code 終端中,執行下列命令以登入 Azure:

    az login
    
  2. 在開啟的瀏覽器中,登入您的 Azure 帳戶。 Visual Studio Code 終端機會顯示與此帳戶相關聯的訂用帳戶清單。 選取名為 [指引訂用帳戶] 的訂用帳戶。

    如果您最近使用多個沙箱,則終端機可能會顯示多個「指引訂用帳戶」執行個體。 在此情況下,請使用接下來的兩個步驟來將其設定為預設訂用帳戶。

    1. 取得指引訂用帳戶識別碼。

        az account list \
         --refresh \
         --query "[?contains(name, 'Concierge Subscription')].id" \
         --output table
      
    2. 使用訂用帳戶識別碼設定預設訂用帳戶。 將 {your subscription ID} 取代為最新的指引訂用帳戶識別碼。

      az account set --subscription {your subscription ID}
      

設定預設資源群組

使用 Azure CLI 時,您可以設定預設的資源群組,並省略本練習中其餘的 Azure CLI 命令參數。 將預設值設定為在沙箱環境中為您建立的資源群組。

az configure --defaults group="<rgn>[sandbox resource group name]</rgn>"

使用 Azure CLI 將範本部署至 Azure

在 Visual Studio Code 終端機中,透過執行下列程式碼,將 Bicep 範本部署到 Azure。 請注意,您明確將 location 參數設定為 westus3

az deployment group create --name main --template-file main.bicep --parameters location=westus3

若要將此範本部署至 Azure,請從 Visual Studio Code 終端登入 Azure 帳戶。 請確定您已安裝 Azure PowerShell,並登入啟動沙箱的相同帳戶。

  1. 在 [終端機] 功能表上,選取 [新增終端機]。 終端機視窗通常隨即在畫面的下半部開啟。

  2. 如果終端視窗在右側顯示 pwshpowershell,表示已開啟正確的殼層。 或者,如果您在右側看到 PowerShell 殼層圖示,則可以加以選取來啟動殼層。

    Visual Studio Code 終端機視窗的螢幕擷取畫面,其中殼層下拉式清單中顯示 [pwsh] 選項。

    如果出現 pwshpowershell 以外的殼層,則請選取殼層下拉式箭頭,然後選取 [PowerShell]

    Visual Studio Code 終端機視窗的螢幕擷取畫面,其中顯示終端機殼層下拉式清單且已選取 [PowerShell]。

  3. 在終端機中,前往您儲存範本的目錄。 例如,若將範本儲存在 templates 資料夾,則可使用此命令:

    Set-Location -Path templates
    

安裝 Bicep CLI

若要從 Azure PowerShell 使用 Bicep,請安裝 Bicep CLI

使用 Azure PowerShell 登入 Azure

  1. 在 Visual Studio Code 終端中,執行下列命令:

    Connect-AzAccount
    

    瀏覽器隨即開啟,讓您可以登入您的 Azure 帳戶。 瀏覽器可能會在背景中開啟。

  2. 登入 Azure 之後,您會在終端機中看到與此帳戶相關聯的訂用帳戶清單。 如果您已啟動沙箱,則會顯示名為「指引訂用帳戶」的訂用帳戶。 針對練習的其餘部分選取此訂用帳戶。

    如果您最近使用多個沙箱,則終端機可能會顯示多個「指引訂用帳戶」執行個體。 在此情況下,請使用接下來的兩個步驟來將其設定為預設訂用帳戶。

    1. 取得訂用帳戶識別碼。 執行下列命令會列出您的訂用帳戶與其識別碼。 尋找 Concierge Subscription,然後複製第二個資料行的識別碼。 其看起來像 aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e

      Get-AzSubscription
      
    2. 將您使用中的訂用帳戶變更為「指引訂用帳戶」。 請務必將 {Your subscription ID} 取代為您複製的訂用帳戶。

      $context = Get-AzSubscription -SubscriptionId {Your subscription ID}
      Set-AzContext $context
      

設定預設資源群組

您可以設定預設資源群組,並省略本練習中其餘的 Azure PowerShell 命令參數。 將此預設值設定為在沙箱環境中為您建立的資源群組。

Set-AzDefault -ResourceGroupName <rgn>[sandbox resource group name]</rgn>

使用 Azure PowerShell 將範本部署至 Azure

在 Visual Studio Code 終端機中,透過執行下列 Azure PowerShell 命令,將範本部署到 Azure。 此過程可能需要幾分鐘的時間才能完成,然後就會成功完成部署。

New-AzResourceGroupDeployment -Name main -TemplateFile main.bicep -location westus3

執行部署時,會提示您輸入 sqlServerAdministratorLoginsqlServerAdministratorLoginPassword 參數的值。

提示

輸入安全參數時,您選擇的值必須遵循特定規則:

  • sqlServerAdministratorLogin 不能是輕易猜到的登入名稱,例如 adminroot。 只能包含英數字元,且開頭必須是字母。
  • sqlServerAdministratorLoginPassword 的長度必須至少為 8 個字元,且必須包含小寫字母、大寫字母、數字及符號。 如需密碼複雜性的詳細資訊,請參閱 SQL Azure 密碼原則

如果參數值不符合需求,Azure SQL 將不會部署邏輯伺服器。

此外,務必記下您輸入的登入和密碼。 很快就會用到。

因為您尚未指定 environmentName 參數的值,所以使用 Development 預設值。

等待部署完成。 如果您的部署失敗,並顯示位置不接受建立新 Windows Azure SQL Database 伺服器的訊息,請選取不同的區域,例如 eastuseastus2

檢查部署

使用 Azure 入口網站檢查您部署的資源,並檢查每個部署的結果。

  1. 前往 Azure 入口網站,執行下列動作以確定您在沙箱訂用帳戶中:

    a. 在右上方選取您的虛擬人偶。
    b. 選取 [切換目錄]。 在清單中,選取 [Microsoft Learn 沙箱] 目錄。

  2. 在左窗格中,選取 [資源群組]

  3. 選取 [沙箱資源群組名稱]。

  4. 在 [概觀] 區段中,您會看到一個部署已成功。 您也可以看到已部署邏輯伺服器和 SQL 資料庫,但未部署用於稽核的儲存體帳戶。

    注意

    名稱開頭為 cloudshell 的儲存體帳戶與您的部署無關,由 Learn 沙箱所建立。

    Azure 入口網站資源群組概觀窗格的螢幕擷取畫面,其中有一個區段顯示成功的部署。

  5. 在 [部署] 旁,選取 [1 個成功] 以查看部署詳細資料。

    Azure 入口網站資源群組概觀窗格的螢幕擷取畫面,其中顯示成功部署的其他詳細資料。

  6. 選取名為 main 的部署,並查看已部署的資源,然後選取 [部署詳細資料] 來予以展開。

    在此案例中,我們部署一個邏輯伺服器和一個 SQL 資料庫。 請注意,儲存體帳戶和稽核設定不在資源清單中。

    此螢幕擷取畫面為 Azure 入口網站針對特定部署顯示的資源群組概觀窗格,其中列出邏輯伺服器和資料庫資源。

  7. 將頁面在瀏覽器中保持開啟。 您稍後將再次檢查部署。

重新部署生產環境

在先前的部署中使用了 environmentName 參數的預設值,這表示該參數已設定為 Development

現在,您要將參數值明確設定為 Production。 在進行此變更後,您預期會部署用於稽核的儲存體帳戶,並將在邏輯伺服器上啟用稽核。

部署實際執行環境的範本

在 Visual Studio Code 終端機中,透過執行下列程式碼,將 Bicep 範本部署到 Azure:

az deployment group create --name main --template-file main.bicep --parameters environmentName=Production location=westus3

在 Visual Studio Code 終端機中,執行下列 Azure PowerShell 命令,將範本部署到 Azure:

New-AzResourceGroupDeployment -Name main -TemplateFile main.bicep -environmentName Production -location westus3

警告

請務必使用您先前所用相同的登入和密碼,否則部署將無法成功完成。

一、兩分鐘後,部署應該就會順利完成。

確認重新部署

若要完成此練習,請確認重新部署已順利完成,且已啟用稽核。

  1. 返回 Azure 入口網站,然後移至您的資源群組。 如果您已開啟資源群組,請選取 [重新整理]

    您應該會看到已部署額外的儲存體帳戶,以供稽核之用。

    Azure 入口網站資源群組概觀窗格的螢幕擷取畫面,其中顯示已部署儲存體帳戶以供稽核之用。

  2. 選取您的邏輯伺服器 (尋找類型為 SQL Server 的資源)。

  3. 在搜尋欄位中,輸入 Auditing。 在 [安全性] 底下,選取 [稽核]

    Azure 入口網站介面的邏輯伺服器螢幕擷取畫面,其中顯示已輸入 Auditing 的搜尋欄位。

  4. 確認已為此邏輯伺服器啟用稽核。

    Azure 入口網站介面的邏輯伺服器螢幕擷取畫面,其中顯示已啟用稽核設定。