练习 - 部署订阅范围的资源

已完成

重要

需要自己的 Azure 订阅才能运行此练习,这可能会产生费用。 如果还没有 Azure 订阅,请在开始前创建一个免费帐户

Project Teddybear 正如火如荼地进行着,研发团队正在等待你授予它新的 Azure 订阅权限。 已创建订阅,但在授予团队访问权限之前,需要确保它仅部署符合团队策略的虚拟机。 团队已告知你,它不希望部署 F 或 G 系列虚拟机。

在本练习中,你将创建一个 Bicep 模板,该模板基于团队策略配置订阅。

在此过程中,你将:

  • 创建要在订阅范围部署的 Bicep 模板。
  • 添加 Azure Policy 定义和分配。
  • 部署模板并验证结果。

此练习要求你有权部署订阅范围的资源。 如果你当前的 Azure 帐户无法满足此要求,可以获取免费试用版并创建新的 Azure 订阅和租户。 或者,你也可以跳过此练习中的部署步骤。

本练习使用适用于 Visual Studio Code 的 Bicep 扩展。 请务必在 Visual Studio Code 中安装此扩展。

创建订阅范围模板

  1. 打开 Visual Studio Code。

  2. 新建一个名为 main.bicep 的文件。

  3. 保存空文件,以便 Visual Studio Code 加载 Bicep 工具。

    你可以选择“文件”>“另存为”,也可以在 Windows 中选择Ctrl+S(在 macOS 上选择 ⌘+S)。 请务必记住保存文件的位置。 例如,你可能希望创建脚本文件,并将其存储在其中。

  4. 将以下内容添加到 main.bicep 文件。 你很快就会部署模板。 最好手动键入此内容,而不是复制和粘贴,这样就可以了解工具如何帮助你编写 Bicep 文件。

    targetScope = 'subscription'
    

    此代码行告知 Bicep,模板将在订阅范围部署。

添加策略定义

  1. 在刚刚添加的代码行下,添加以下变量定义:

    var policyDefinitionName = 'DenyFandGSeriesVMs'
    
  2. 在文件底部,添加下列 Azure Policy 定义:

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

    请注意,策略定义仅适用于以下资源:

    • 资源类型等于 Microsoft.Compute/virtualMachines
    • sku.name 属性以 Standard_FStandard_G 开头。

    尝试创建与这些条件匹配的资源时,Azure 将拒绝创建资源。

    警告

    对策略定义使用拒绝策略效果时请小心,尤其是在订阅和管理组之类的广泛范围。 如果没有正确创建定义,可能会产生意外的影响,从而导致停机。 最好从“审核”策略效果开始,然后只有在一段时间内看到审核策略效果良好后才切换为“拒绝”效果。

    你要在订阅范围内创建策略定义。 这意味着,在部署定义后,它将在订阅的所有资源组中可用。

分配策略

策略定义在应用之前不起作用。 在此步骤中,你将部署第二个订阅范围资源,该资源将策略定义应用于该订阅。

  1. policyDefinitionName 变量定义下,添加以下变量定义:

    var policyAssignmentName = 'DenyFandGSeriesVMs'
    
  2. 在文件底部的策略定义资源下,添加以下策略分配:

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

    请注意,你没有显式配置策略分配来将其应用于整个订阅。 Bicep 理解这一点,因为模板将在订阅范围内部署。

  3. 保存对文件所做的更改。

验证模板

模板应如下所示:

targetScope = 'subscription'

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 帐户。 请确保已安装 Azure CLI 工具。

  1. 在“终端”菜单中,选择“新终端”。 终端窗口通常在屏幕的下半部分打开。

  2. 如果终端窗口右侧显示的 shell 为“bash”,则将打开正确的 shell,你可以跳到下一部分。

    Visual Studio Code 终端窗口的屏幕截图,其中显示了 bash 选项。

  3. 如果出现“bash”以外的 shell,请选择 shell 下拉箭头,然后选择“Azure Cloud Shell (Bash)”

    Visual Studio Code 终端窗口的屏幕截图,其中显示了终端 shell 下拉列表并选中了“Git Bash (默认)”。

  4. 在终端 shell 列表中,选择“bash”。

    Visual Studio Code 终端窗口的屏幕截图,其中选中了 bash 终端。

  5. 在终端中,转到保存模板的目录。 例如,如果将模板保存到 templates 文件夹,则可以使用以下命令:

    cd templates
    

安装 Bicep

运行以下命令以确保具有最新版本的 Bicep:

az bicep install && az bicep upgrade

使用 Azure CLI 登录到 Azure

  1. 在 Visual Studio Code 终端中,运行以下命令登录到 Azure:

    az login
    
  2. 在打开的浏览器中,登录到 Azure 帐户。

    Visual Studio Code 终端显示与此帐户关联的订阅列表。

  3. 在列表中,找到要用于本次练习的订阅。

    如果你在登录时错过了列表,则可以使用以下代码片段再次列出订阅。

    az account list --output table
    
  4. 为在此会话中运行的所有 Azure CLI 命令设置默认订阅。

    az account set --subscription "Your Subscription Name or ID"
    

若要将此模板部署到 Azure,需要从 Visual Studio Code 终端登录到 Azure 帐户。 确保已安装 Azure PowerShell

  1. 在“终端”菜单中,选择“新终端”。 终端窗口通常在屏幕的下半部分打开。

  2. 如果终端窗口右侧显示的 shell 为“powershell”或“pwsh”,则会打开正确的 shell,你可以跳到下一部分。

    Visual Studio Code 终端窗口的屏幕截图,其中在 shell 下拉列表中显示了 pwsh 选项。

  3. 如果出现“powershell”或“pwsh”以外的 shell,请选择 shell 下拉箭头,然后选择“PowerShell”

    Visual Studio Code 终端窗口的屏幕截图,其中显示了终端 shell 下拉列表并选中了 PowerShell。

  4. 在终端 shell 列表中,选择“powershell”或“pwsh”。

    Visual Studio Code 终端窗口的屏幕截图,其中选择了 PowerShell 终端。

  5. 在终端中,转到保存模板的目录。 例如,如果将模板保存到 templates 文件夹,则可以使用以下命令:

    Set-Location -Path templates
    

安装 Bicep CLI

若要从 Azure PowerShell 中使用 Bicep,请安装 Bicep CLI

使用 Azure PowerShell 登录到 Azure

  1. 在 Visual Studio Code 终端中,运行以下命令登录到 Azure:

    Connect-AzAccount
    
  2. 在打开的浏览器中,登录到 Azure 帐户。

  3. 通过运行以下命令获取要用于此练习的订阅的 ID:

    Get-AzSubscription
    

    订阅 ID 位于第二列。 复制第二列。 它类似于 cf49fbbc-217c-4eb6-9eb5-a6a6c68295a0。

  4. 为在此会话中运行的所有 Azure PowerShell 命令设置默认订阅。

    Set-AzContext -SubscriptionId {Your subscription ID}
    

将模板部署到 Azure

在 Visual Studio Code 终端中,使用以下 Azure CLI 命令部署模板:

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

az deployment sub create \
    --name $deploymentName \
    --location westus \
    --template-file $templateFile

请注意,你将使用 az deployment sub create 命令(而不是常用的 az deployment group create 命令)创建订阅范围部署。

在 Visual Studio Code 终端中,使用以下 Azure PowerShell 命令部署模板:

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

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

请注意,你将使用 New-AzSubscriptionDeployment cmdlet(而不是常用的 New-AzResourceGroupDeployment cmdlet)来创建订阅范围部署。

另请注意,要显式指定部署的名称和位置。 Azure 使用此信息来存储部署元数据。

提示

部署名称包括当天日期。 这样,就不太可能意外地使用与另一个部署相同的名称。

此部署可能需要一两分钟才能完成,然后你会看到部署成功。

注意

如果你收到一条包含代码 AuthorizationFailed 的错误消息,则表示你可能无权部署订阅范围的资源。 让 Azure 管理员为你授予权限。 或者,如果你当前的 Azure 帐户无法满足此要求,可以获取免费试用版并创建新的 Azure 订阅和租户。

验证部署

可以在 Azure 门户中查看订阅范围的部署。 这可能有助于验证部署是否成功完成并检查结果。

  1. 转到 Azure 门户

  2. 在左侧窗格,选择“订阅”。

  3. 选择订阅。

  4. 在“搜索”框中,输入“部署”,然后选择“部署”菜单项。

    Azure 门户“搜索”框和“部署”菜单项屏幕截图。

  5. 在“部署名称”列中,选择以“sub-scope”开头的部署,以查看已部署的资源。

    显示部署列表的 Azure 门户接口的屏幕截图。

  6. 选择“部署详细信息”将其展开。 在这种情况下,将列出两个 Azure Policy 资源。

    所选部署的 Azure 门户概述窗格的屏幕截图。

清理资源

已成功部署订阅范围资源。 可以通过运行以下命令删除已创建的策略资源:

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
$subscriptionId = (Get-AzContext).Subscription.Id

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

下一练习单元将重新部署相同的策略资源。 将重新创建这些资源,但之后可以再次清理它们。