練習 - 使用課程模組將資源部署至多個範圍

已完成

注意

此練習需要 Azure 訂用帳戶。 如果沒有,您可以取得免費的訂用帳戶

R&D 小組已要求您提供協助,以在 Project Teddybear 訂用帳戶中建立虛擬網路。 您知道您將會在未來協助具有更多訂用帳戶的小組,因此您決定擴充可重複使用的 Bicep 範本,以部署要供小組成員使用的虛擬網路。

在此練習中,您將更新您在上一個練習中開始建置的範本。

在此過程中,您將會:

  • 更新訂用帳戶範圍的範本,以建立新的資源群組。
  • 使用虛擬網路建立個別的 Bicep 模組,並使用參數來控制如何設定虛擬網路。
  • 更新範本以將模組部署至資源群組。
  • 部署範本。

此練習需要您擁有部署訂用帳戶範圍資源的權限。 如果您無法使用目前的 Azure 帳戶來滿足這些需求,可以取得免費的試用版,並建立新的 Azure 訂用帳戶和租用戶。 或者,您也可以略過此練習中的部署步驟。

建立資源群組

  1. 在 Visual Studio Code 中,開啟您在先前練習中建立的 main.bicep 檔案。

  2. 在目前變數定義下方,新增下列變數定義:

    var resourceGroupName = 'ToyNetworking'
    
  3. 在檔案底端,新增下列資源定義:

    resource resourceGroup 'Microsoft.Resources/resourceGroups@2024-07-01' = {
      name: resourceGroupName
      location: deployment().location
    }
    

    請注意,您正要定義資源群組,就像您定義另一個資源一樣。 資源群組是訂用帳戶範圍資源,可以在 targetScope 設定為 subscription 的 Bicep 檔案中進行部署和管理。

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

新增模組以建立虛擬網路

接下來,您將為 R&D 小組的虛擬交換器建立 Bicep 模組。 稍後在此練習中,您會將模組中的資源部署至資源群組。

  1. 在 Visual Studio Code 中,於 main.bicep 檔案建立所在的相同資料夾中建立名為 modules 的新資料夾。

  2. modules 資料夾中,建立並儲存名為 virtualNetwork.bicep 的檔案。

  3. virtualNetwork.bicep 檔案中,新增下列內容:

    param virtualNetworkName string
    param virtualNetworkAddressPrefix string
    
    resource virtualNetwork 'Microsoft.Network/virtualNetworks@2024-01-01' = {
      name: virtualNetworkName
      location: resourceGroup().location
      properties: {
        addressSpace: {
          addressPrefixes: [
            virtualNetworkAddressPrefix
          ]
        }
      }
    }
    

    請注意,您未針對此課程模組指定 targetScope。 當 Bicep 檔案以資源群組為目標時,您不需要指定目標範圍。

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

在訂用帳戶部署中使用模組

現在您已準備好告訴 Bicep 將模組部署到資源群組。

  1. 在 Visual Studio Code 的main.bicep 檔案中,於 targetScope 行底下新增下列參數定義:

    param virtualNetworkName string
    param virtualNetworkAddressPrefix string
    

    這些參數可讓範本重複使用。 每當 R&D 小組需要新的訂用帳戶時,您都可以建立具有唯一名稱和 IP 位址範圍的虛擬網路。

  2. 在檔案底端,新增下列模組定義:

    module virtualNetwork 'modules/virtualNetwork.bicep' = {
      scope: resourceGroup
      name: 'virtualNetwork'
      params: {
        virtualNetworkName: virtualNetworkName
        virtualNetworkAddressPrefix: virtualNetworkAddressPrefix
      }
    }
    

    請注意,您正要明確地指定模組的 scope。 Bicep 了解模組內的資源應該部署到您稍早在檔案中建立的資源群組。

驗證範本

您的 main.bicep 檔案看起來應該像下面這樣:

targetScope = 'subscription'

param virtualNetworkName string
param virtualNetworkAddressPrefix string

var policyDefinitionName = 'DenyFandGSeriesVMs'
var policyAssignmentName = 'DenyFandGSeriesVMs'
var resourceGroupName = 'ToyNetworking'

resource policyDefinition 'Microsoft.Authorization/policyDefinitions@2024-05-01' = {
  name: policyDefinitionName
  properties: {
    policyType: 'Custom'
    mode: 'All'
    parameters: {}
    policyRule: {
      if: {
        allOf: [
          {
            field: 'type'
            equals: 'Microsoft.Compute/virtualMachines'
          }
          {
            anyOf: [
              {
                field: 'Microsoft.Compute/virtualMachines/sku.name'
                like: 'Standard_F*'
              }
              {
                field: 'Microsoft.Compute/virtualMachines/sku.name'
                like: 'Standard_G*'
              }
            ]
          }
        ]
      }
      then: {
        effect: 'deny'
      }
    }
  }
}

resource policyAssignment 'Microsoft.Authorization/policyAssignments@2024-05-01' = {
  name: policyAssignmentName
  properties: {
    policyDefinitionId: policyDefinition.id
  }
}

resource resourceGroup 'Microsoft.Resources/resourceGroups@2024-07-01' = {
  name: resourceGroupName
  location: deployment().location
}

module virtualNetwork 'modules/virtualNetwork.bicep' = {
  scope: resourceGroup
  name: 'virtualNetwork'
  params: {
    virtualNetworkName: virtualNetworkName
    virtualNetworkAddressPrefix: virtualNetworkAddressPrefix
  }
}

您的 modules/virtualNetwork.bicep 檔案看起來應該像下面這樣:

param virtualNetworkName string
param virtualNetworkAddressPrefix string

resource virtualNetwork 'Microsoft.Network/virtualNetworks@2024-01-01' = {
  name: virtualNetworkName
  location: resourceGroup().location
  properties: {
    addressSpace: {
      addressPrefixes: [
        virtualNetworkAddressPrefix
      ]
    }
  }
}

如果任一檔案都未符合範例,請複製範例或是調整您的範本。

將範本部署至 Azure

在 Visual Studio Code 終端中,透過使用下列 Azure CLI 命令來部署範本:

templateFile="main.bicep"
today=$(date +"%d-%b-%Y")
deploymentName="sub-scope-"$today
virtualNetworkName="rnd-vnet-001"
virtualNetworkAddressPrefix="10.0.0.0/24"

az deployment sub create \
    --name $deploymentName \
    --location westus \
    --template-file $templateFile \
    --parameters virtualNetworkName=$virtualNetworkName \
                 virtualNetworkAddressPrefix=$virtualNetworkAddressPrefix

在 Visual Studio Code 終端機中,透過使用下列 Azure PowerShell 命令部署範本:

$templateFile = 'main.bicep'
$today = Get-Date -Format 'MM-dd-yyyy'
$deploymentName = "sub-scope-$today"
$virtualNetworkName = 'rnd-vnet-001'
$virtualNetworkAddressPrefix = '10.0.0.0/24'

New-AzSubscriptionDeployment `
  -Name $deploymentName `
  -Location westus `
  -TemplateFile $templateFile `
  -virtualNetworkName $virtualNetworkName `
  -virtualNetworkAddressPrefix $virtualNetworkAddressPrefix

請注意,您要傳入 virtualNetworkNamevirtualNetworkAddressPrefix 參數的值。 當另一個 R&D 小組要求您為他們準備訂用帳戶時,您將能夠變更這些值,為該小組提供自己的虛擬網路。

部署可能需要一到兩分鐘的時間才能完成,然後您會看到成功的部署。

檢查部署

現在您將檢查資源群組,以及模組所建立的部署。

  1. 前往 Azure 入口網站

  2. 在左窗格中,選取 [資源群組]。 請注意,已建立 ToyNetworking 資源群組。

  3. 選取 ToyNetworking 資源群組。 請注意,模組已成功部署至資源群組,且已建立虛擬網路:

    Screenshot of the Azure portal, showing the ToyNetworking resource group.

清除資源

您已成功部署訂用帳戶範圍資源,包括資源群組,且您已使用模組,將資源部署至您所建立的資源群組。 您可以移除您已建立的原則資源和資源群組。

警告

此命令會永久刪除名為 ToyNetworking 的資源群組及其所有資源。 如果您已將任何其他資源部署到此資源群組,您應該略過此步驟。

subscriptionId=$(az account show --query 'id' --output tsv)

az policy assignment delete --name 'DenyFandGSeriesVMs' --scope "/subscriptions/$subscriptionId"
az policy definition delete --name 'DenyFandGSeriesVMs' --subscription $subscriptionId
az group delete --name ToyNetworking
$subscriptionId = (Get-AzContext).Subscription.Id

Remove-AzPolicyAssignment -Name 'DenyFandGSeriesVMs' -Scope "/subscriptions/$subscriptionId"
Remove-AzPolicyDefinition -Name 'DenyFandGSeriesVMs' -SubscriptionId $subscriptionId
Remove-AzResourceGroup -Name ToyNetworking