【问题标题】:How to set OS disk's networking to AllowPrivate 'Private endpoint (through disk access) using Azure Bicep如何使用 Azure Bicep 将 OS 磁盘的网络设置为 AllowPrivate 'Private 端点(通过磁盘访问)
【发布时间】:2021-09-23 21:17:35
【问题描述】:

我需要使用 Azure bicep 创建一个虚拟机,其中 OS 磁盘的网络需要设置为私有

在 Bicep 中:它在磁盘资源下定义,属性“networkAccessPolicy”设置为“AllowPrivate”

在门户中:定义在磁盘资源页面 -> 网络 -> 私有端点(通过磁盘访问)

方法:

  1. 在虚拟机资源中创建 OS 磁盘,但是我没有设置 networkAccesPolicy 的选项

  2. 在磁盘资源中创建 OS 磁盘,然后附加到虚拟机资源,但是这样我不能指定需要指定它们的特定 'osProfile' 操作系统简介:{ 计算机名:'字符串' 管理员用户名:'字符串' 管理员密码:'字符串' 窗口配置:{ 提供VMAgent:布尔 } }

【问题讨论】:

标签: azure azure-bicep


【解决方案1】:

这可以实现,但对于 Bicep 来说这不是一个好的解决方案,因为需要修补 OS 磁盘以关联 diskAccess 资源,而目前还没有这种关联可用 - afaik - 作为 ARMBicep 中的单独资源。因此,需要一些“Bicep module hopping”方法来分阶段实现这种修补。

我为虚拟机扩展了现有的vm.bicep 模板并为磁盘添加了一个子网:

...
      {
        name: subnetDiskName
        properties: {
          addressPrefix: subnetDiskPrefix
          privateEndpointNetworkPolicies: 'Disabled'
        }
      }
...

vm.bicep 的末尾我添加了对这个子网的引用,这样我就可以将它作为参数传递给下一个阶段。修补需要分为 2 个阶段/模块:

  1. 再次获取/获取操作系统磁盘作为对象
  2. PATCH / PUT OS 磁盘与现有对象数据 + 引用 diskAccess 资源
...
resource subnetDisk 'Microsoft.Network/virtualNetworks/subnets@2021-02-01' existing = {
  name: subnetDiskName
  parent: vnet
}

module patchDisk 'get-patch-disk.bicep' = {
  name: 'getPatchDisk'
  params: {
    virtualMachineName: virtualMachineName
    diskName: vm.properties.storageProfile.osDisk.name
    location: location
    subnetId: subnetDisk.id
  }
}

对于第 1 阶段 get-patch-disk.bicep,只需将当前 OS 磁盘作为对象检索并传递:

param virtualMachineName string
param diskName string
param location string = resourceGroup().location
param subnetId string

resource vmDiskGet 'Microsoft.Compute/disks@2020-12-01' existing = {
  name: diskName
}

module vmDiskPatch 'patch-disk.bicep' = {
  name: 'patchDisk'
  params: {
    virtualMachineName: virtualMachineName
    diskName: diskName
    vmDiskGet: vmDiskGet
    location: location
    subnetId: subnetId
  }
}

然后在第 2 阶段 patch-disk.bicep 创建 diskAccess 资源以及 privateEndpoint 并将其修补到操作系统磁盘中,方法是从刚刚检索到的对象中传输所有给定属性并添加私有磁盘访问所需的属性。

param virtualMachineName string
param diskName string
param location string = resourceGroup().location
param vmDiskGet object
param subnetId string

var privateEndpointName = 'privateEndpoint${uniqueString(resourceGroup().name)}'
var privateLinkConnectionName = 'privateLink${uniqueString(resourceGroup().name)}'

var diskAccessName = 'diskAccess${uniqueString(resourceGroup().name)}'

resource diskAccess 'Microsoft.Compute/diskAccesses@2020-12-01' = {
  name: diskAccessName
  location: location
  tags: {
    vmName: virtualMachineName
  }
}

resource privateEndpoint 'Microsoft.Network/privateEndpoints@2020-06-01' = {
  name: privateEndpointName
  location: location
  tags: {
    vmName: virtualMachineName
  }
  properties: {
    subnet: {
      id: subnetId
    }
    privateLinkServiceConnections: [
      {
        name: privateLinkConnectionName
        properties: {
          privateLinkServiceId: diskAccess.id
          groupIds: [
            'disks'
          ]
        }
      }
    ]
  }
}

resource vmDiskPut 'Microsoft.Compute/disks@2020-12-01' = {
  name: diskName
  location: vmDiskGet.location
  properties: {
    diskAccessId: diskAccess.id
    networkAccessPolicy: 'AllowPrivate'
    creationData: vmDiskGet.properties.creationData
    diskSizeGB: vmDiskGet.properties.diskSizeGB
  }
}

免责声明

我想更聪明的解决方案是在一个 Bicep 模板中创建 diskAccess 资源以及 VM,然后返回 diskAccess.idvm.properties.storageProfile.osDisk.name 作为输出参数。使用这些输出参数,使用简单的az disk update -n "{diskName}" --network-access-policy AllowPrivate --disk-access "{diskAccessId}" 进行修补。

【讨论】:

猜你喜欢
  • 1970-01-01
  • 2019-01-05
  • 1970-01-01
  • 2022-01-16
  • 1970-01-01
  • 1970-01-01
  • 2017-01-15
  • 2020-03-31
  • 2019-02-02
相关资源
最近更新 更多