使用 Bicep 创建虚拟网络资源

许多 Azure 部署要求部署和配置网络资源。 可以使用 Bicep 定义 Azure 网络资源。

虚拟网络和子网

通过创建类型为 Microsoft.Network/virtualNetworks 的资源来定义虚拟网络。

使用 subnets 属性配置子网

虚拟网络包含子网,子网是虚拟网络中的 IP 地址的逻辑组。 在 Bicep 中定义子网有两种方法,一是使用虚拟网络资源上的 subnets 属性,二是创建类型为 Microsoft.Network/virtualNetworks/subnets子资源

警告

避免将子网定义为子资源。 此方法可能导致资源在后续部署期间停机,或者导致部署失败。

最好在虚拟网络定义中定义子网,如以下示例所示:

以下示例是较大示例的一部分。 有关可以部署的 Bicep 文件,请参阅完整文件

resource virtualNetwork 'Microsoft.Network/virtualNetworks@2019-11-01' = {
  name: virtualNetworkName
  location: location
  properties: {
    addressSpace: {
      addressPrefixes: [
        '10.0.0.0/16'
      ]
    }
    subnets: [
      {
        name: subnet1Name
        properties: {
          addressPrefix: '10.0.0.0/24'
        }
      }
      {
        name: subnet2Name
        properties: {
          addressPrefix: '10.0.1.0/24'
        }
      }
    ]
  }
}

尽管这两种方法都能让你定义和创建子网,但有一个重要区别。 使用子资源定义子网时,需在首次部署 Bicep 文件时部署虚拟网络。 接着,在虚拟网络部署完成后部署每个子网。 之所以采用此顺序,是因为 Azure 资源管理器分别部署每个单独的资源。

重新部署同一 Bicep 文件时,采用相同的部署顺序。 但是,部署虚拟网络时未在其上配置任何子网,因为 subnets 属性实际上为空。 接着,在重新配置虚拟网络后重新部署子网资源,重新建立每个子网。 某些情况下,此行为会导致虚拟网络中的资源在部署时失去连接。 另外一些情况下,Azure 会阻止你修改虚拟网络,部署会失败。

访问子网资源 ID

通常需要引用子网的资源 ID。 使用 subnets 属性定义子网时,可以使用 existing 关键字(这样就还可以获取对子网的强类型引用),然后访问子网的 id 属性:

以下示例是较大示例的一部分。 有关可以部署的 Bicep 文件,请参阅完整文件

resource virtualNetwork 'Microsoft.Network/virtualNetworks@2019-11-01' = {
  name: virtualNetworkName
  location: location
  properties: {
    addressSpace: {
      addressPrefixes: [
        '10.0.0.0/16'
      ]
    }
    subnets: [
      {
        name: subnet1Name
        properties: {
          addressPrefix: '10.0.0.0/24'
        }
      }
      {
        name: subnet2Name
        properties: {
          addressPrefix: '10.0.1.0/24'
        }
      }
    ]
  }

  resource subnet1 'subnets' existing = {
    name: subnet1Name
  }

  resource subnet2 'subnets' existing = {
    name: subnet2Name
  }
}

output subnet1ResourceId string = virtualNetwork::subnet1.id
output subnet2ResourceId string = virtualNetwork::subnet2.id

由于此示例使用 existing 关键字访问子网资源,而不是定义完整的子网资源,因此它没有上一部分所述的风险。

还可以组合使用 existingscope 关键字,以引用另一资源组中的虚拟网络或子网资源。

网络安全组

网络安全组通常用于应用规则来控制子网或网络接口的入站和出站流量。 在 Bicep 文件中定义大量规则以及跨多个 Bicep 文件共享规则可能会变得非常麻烦。 使用复杂的或大型的网络安全组时,请考虑使用共享变量文件模式

专用终结点

专用终结点必须获得批准。 某些情况下,批准会自动进行。 但另外一些情况下,你需要手动批准终结点,然后才能使用它。

专用终结点批准是一种操作,因此不能直接在 Bicep 代码中执行它。 但是,你可以使用部署脚本来调用该操作。 也可在 Bicep 文件之外调用该操作,例如在管道脚本中这样做。