如何使用Azure Bicep将操作系统磁盘的网络设置为AllowPrivate的私有端点(通过磁盘访问)

niwlg2el  于 2023-04-22  发布在  其他
关注(0)|答案(2)|浏览(124)

我有一个使用Azure bicep创建虚拟机的需求,其中OS磁盘的联网需要设置为私有
在Bicep中:它在磁盘资源下定义,属性“networkAccessPolicy”设置为“AllowPrivate”
在portal中:在磁盘资源页面-〉网络-〉私有端点(通过磁盘访问)下定义
方法:
1.在虚拟机资源中创建操作系统磁盘,但没有选项可供我设置networkAccessiPolicy
1.在磁盘资源中创建操作系统磁盘,然后附加到虚拟机资源,但是这样我就不允许指定特定的“osProfile”,我需要指定它们osProfile:{计算机名称:'string' adminUsername:'string' adminPassword:'string' windowsConfiguration:{ provisionVMAgent:bool } }

slwdgvem

slwdgvem1#

这是可以实现的,但使用Bicep并不是一个好的解决方案,因为需要对OS磁盘进行修补以关联diskAccess资源,而这一关联目前在ARMBicep中作为单独的资源不可用。因此,需要一些“Bicep模块跳跃”方法来分阶段实现此修补。
我为虚拟机扩展了现有的vm.bicep模板,并为磁盘添加了子网:

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

vm.bicep的末尾,我添加了一个对这个子网的引用,这样我就可以将它作为参数传递给下一个阶段。修补需要分为2个阶段/模块:
1.再次作为对象获取/获取操作系统磁盘
1.使用现有对象数据修补/放置操作系统磁盘+引用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,只需检索当前操作系统磁盘作为对象并将其传递:

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,并将其修补到OS磁盘中,方法是从刚刚检索到的对象中传输所有给定的属性,并添加私有磁盘访问所需的属性。

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}"进行修补。

lvmkulzt

lvmkulzt2#

我也遇到了同样的情况,也调查了问题中提到的两种方法。再加上微软的支持,我们无法实现其中的任何一种方法。
我最终创建了一个deploymentScript,它运行一个简单的AzureCLI命令将osDisk的network-access-policy设置为DenyAll

resource identity 'Microsoft.ManagedIdentity/userAssignedIdentities@2023-01-31' = {
  name: identityName
  location: location
}

resource roleAssignmentId 'Microsoft.Authorization/roleAssignments@2022-04-01' = {
  name: roleAssignmentIdName
  scope: resourceGroup()
  properties: {
    roleDefinitionId: contributorRoleId
    description: 'Assign the user-managed identity the Contributor Role on the Resource Group'
    principalId: identity.properties.principalId
    principalType: 'ServicePrincipal'
  }
}

resource DenyAllNetworkForOSDiskResource 'Microsoft.Resources/deploymentScripts@2020-10-01' = {
  name: 'DenyAllNetworkOSDisk'
  location: location
  kind: 'AzureCLI'
  identity: {
    type: 'UserAssigned'
    userAssignedIdentities: {
      '${identity.id}': {}
    }
  }
  properties: {
    azCliVersion: '2.45.0'
    cleanupPreference: 'Always'
    retentionInterval: 'PT1H'
    scriptContent: 'az disk update -g my-resource-group -n ${vmOSDiskName} --network-access-policy DenyAll'
  }
  dependsOn: [
    vmResource
  ]
}

何处

  • vmOSDiskName是VM的资源定义中给定的osDisk的名称,以及
  • vmResource是Bicep文件中VM资源的符号名称

相关问题