練習 - 將資源部署至管理群組

已完成

Project Teddybear 成功,而且現在在您的玩具公司進行的秘密 R&D 開發準備好研究更多新的玩具。 該小組開始近乎每天都會像您要求新訂用帳戶,且需要在所有訂用帳戶上套用他們的原則。

您已決定將該小組所有的訂用帳戶放在管理群組內,而不是在每個訂用帳戶中複製原則定義和指派。 然後,您便可以將原則套用至整個管理群組,而不是個別套用至每個訂用帳戶。

在此練習中,您將建立新的 Bicep 範本,以將原則定義和指派套用至管理群組。

在此過程中,您將會:

  • 建立新的管理群組。
  • 建立以管理群組作為範圍的新 Bicep 檔案。
  • 將 Azure 原則資源新增至該檔案。
  • 手動建構資源識別碼,來將原則指派連結至原則定義。
  • 部署範本並驗證結果。

此練習需要下列先決條件:

  • 必須在您的 Azure 租用戶上啟用管理群組
  • 您需要在階層內建立新管理群組的權限。
  • 您需要將 Azure 原則資源部署到管理群組的權限。

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

建立管理群組

在此練習中,您將建立新的管理群組,如此就不會意外影響 Azure 環境另一個部分中的任何資源。

在 Visual Studio Code 終端中,執行下列 Azure CLI 命令:

az account management-group create \
  --name SecretRND \
  --display-name "Secret R&D Projects"

根據預設,新的管理群組會建立為租用戶根管理群組的直接子系。 如果您需要將管理群組放置在現有管理群組階層中的特定位置,請使用 --parent-id 參數,並指定要用作父代的管理群組名稱。

在 Visual Studio Code 終端中,執行下列 Azure PowerShell 命令:

New-AzManagementGroup `
  -GroupId 'SecretRND' `
  -DisplayName 'Secret R&D Projects'

根據預設,新的管理群組會建立為租用戶根管理群組的子系。 如果您需要將管理群組放置在現有管理群組階層中的特定位置,請使用 -ParentId 參數,並指定要用作父代的管理群組名稱。

在實際的部署中,您會 將 R&D 小組的訂用帳戶移至管理群組。 對於此練習,您將部署原則,即使管理群組沒有包含任何訂用帳戶也一樣。 無論管理群組是空的還是包含訂用帳戶,都適用相同的部署程序。

建立 Bicep 檔案以部署至管理群組

  1. 打開 Visual Studio Code。

  2. 刪除您的 main.bicep 檔案,然後使用相同的名稱建立新的空白檔案。

  3. 儲存空白檔案。

  4. 將下列內容新增至該檔案。

    targetScope = 'managementGroup'
    

    請注意,這行程式碼會告訴 Bicep,您的範本將會部署在管理群組範圍中。

新增原則定義

如同您先前所做的,請在 Bicep 檔案中建立原則定義。

  1. 在您剛才新增的行下方,新增下列變數定義:

    var policyDefinitionName = 'DenyFandGSeriesVMs'
    
  2. 在檔案底部,新增下列 Azure 原則定義:

    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'
          }
        }
      }
    }
    

    此原則定義與您先前套用至訂用帳戶的原則定義相同。 不過,這次您要將其部署到管理群組。

移除原則指派

您現在會將原則套用至管理群組。 這表示原則會套用至屬於此管理群組子系的所有訂用帳戶。

  1. policyDefinitionName 變數定義下方,新增下列變數:

    var policyAssignmentName = 'DenyFandGSeriesVMs'
    
  2. 在檔案底部的原則定義資源下方,新增下列原則指派:

    resource policyAssignment 'Microsoft.Authorization/policyAssignments@2024-05-01' = {
      name: policyAssignmentName
      properties: {
        policyDefinitionId: policyDefinition.id
      }
    }
    
  3. 儲存對檔案所做的變更。

驗證範本

您的範本看起來應該如下所示:

targetScope = 'managementGroup'

var policyDefinitionName = 'DenyFandGSeriesVMs'
var policyAssignmentName = 'DenyFandGSeriesVMs'

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
  }
}

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

將範本部署至 Azure

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

managementGroupId="SecretRND"
templateFile="main.bicep"
today=$(date +"%d-%b-%Y")
deploymentName="mg-scope-"$today

az deployment mg create \
  --management-group-id $managementGroupId \
  --name $deploymentName \
  --location westus \
  --template-file $templateFile

在終端中使用 Azure PowerShell 命令來部署範本。

$managementGroupId = 'SecretRND'
$templateFile = 'main.bicep'
$today = Get-Date -Format 'MM-dd-yyyy'
$deploymentName = "mg-scope-$today"

New-AzManagementGroupDeployment `
  -ManagementGroupId $managementGroupId `
  -Name $deploymentName `
  -Location westus `
  -TemplateFile $templateFile

請注意,如同訂用帳戶部署,您會明確指定部署中繼資料的名稱和位置。 然後,您會使用今天的日期,來降低使用現有部署名稱的機會。

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

檢查部署

如同訂用帳戶範圍部署,您可以在 Azure 入口網站中檢視管理群組範圍部署。

  1. 前往 Azure 入口網站

  2. 在左窗格中,選取 [所有服務]

  3. 在 [ 搜尋 ] 方塊中,輸入 管理群組,然後在結果清單中選取 [管理群組 ]。

    Screenshot of the Azure portal interface showing the service list with 'Management groups' highlighted.

  4. 選取 [ 秘密 R&D 專案 ] 管理群組。

    Screenshot of the Azure portal interface, highlighting 'Secret R&D Projects' in the list of management groups.

  5. 在左窗格的 [搜尋] 方塊中,輸入 [部署],然後選取 [治理] 下的 [部署]。

    Screenshot of the Azure portal interface, showing the management group details.

  6. 選取以 [mg-scope] 開頭的部署,來查看已部署哪些資源。

    Screenshot of the Azure portal Deployments pane, highlighting the 'mg-scope-*' deployment in the list of deployments.

  7. 在所選部署的 [概觀] 窗格上,選取 [部署詳細資料] 以將其展開。 即會列出兩個 Azure 原則資源。

    Screenshot of the Azure portal 'Overview' pane for the selected deployment.

清除資源

您已成功部署管理群組範圍資源。 您可以移除您已建立的原則資源和管理群組。

az account management-group delete --name SecretRND
Remove-AzManagementGroup -GroupId SecretRND