Compartir a través de


Acceda a una red virtual privada desde un script de implementación de Bicep

Con Microsoft.Resources/deploymentScripts versión 2023-08-01, es posible ejecutar scripts de implementación en redes privadas con algunas configuraciones adicionales:

  • Cree una identidad administrada asignada por el usuario y especifíquela en la propiedad identity. Para asignar la identidad, consulte Identidad.

  • Cree una cuenta de almacenamiento en la red privada y especifique el script de implementación para usar la cuenta de almacenamiento existente. Para obtener más información, consulte Uso de una cuenta de almacenamiento existente. Se requiere alguna configuración adicional para la cuenta de almacenamiento:

    1. Abra la cuenta de almacenamiento en Azure Portal.
    2. En el menú de la izquierda, seleccione Control de acceso (IAM) y, después, la pestaña Asignaciones de roles.
    3. Agregue el rol Colaborador con privilegios de datos de archivos de almacenamiento a la identidad administrada asignada por el usuario.
    4. En el menú de la izquierda, en Seguridad y redes, seleccione Redes y, después, Firewalls y redes virtuales.
    5. Seleccione Habilitado desde redes virtuales y direcciones IP seleccionadas.
    6. En Redes virtuales, agregue una subred. En la captura de pantalla siguiente, la subred se denomina dspvnVnet.
    7. En Excepciones, seleccione Allow Azure services on the trusted services list to access this storage account (Permitir que los servicios de Azure de la lista de servicios de confianza accedan a esta cuenta de almacenamiento).

    Captura de pantalla de las selecciones para configurar una cuenta de almacenamiento para acceder a una red privada.

El siguiente archivo de Bicep muestra cómo configurar el entorno para ejecutar un script de implementación:

@maxLength(10) // Required maximum length, because the storage account has a maximum of 26 characters
param prefix string
param location string = resourceGroup().location
param userAssignedIdentityName string = '${prefix}Identity'
param storageAccountName string = '${prefix}stg${uniqueString(resourceGroup().id)}'
param vnetName string = '${prefix}Vnet'
param subnetName string = '${prefix}Subnet'

resource vnet 'Microsoft.Network/virtualNetworks@2023-05-01' = {
  name: vnetName
  location: location
  properties: {
    addressSpace: {
      addressPrefixes: [
        '10.0.0.0/16'
      ]
    }
    enableDdosProtection: false
    subnets: [
      {
        name: subnetName
        properties: {
          addressPrefix: '10.0.0.0/24'
          serviceEndpoints: [
            {
              service: 'Microsoft.Storage'
            }
          ]
          delegations: [
            {
              name: 'Microsoft.ContainerInstance.containerGroups'
              properties: {
                serviceName: 'Microsoft.ContainerInstance/containerGroups'
              }
            }
          ]
        }
      }
    ]
  }
}

resource subnet 'Microsoft.Network/virtualNetworks/subnets@2023-05-01' existing = {
  parent: vnet
  name: subnetName
}
resource storageAccount 'Microsoft.Storage/storageAccounts@2023-01-01' = {
  name: storageAccountName
  location: location
  sku: {
    name: 'Standard_LRS'
  }
  kind: 'StorageV2'
  properties: {
    networkAcls: {
      bypass: 'AzureServices'
      virtualNetworkRules: [
        {
          id: subnet.id
          action: 'Allow'
          state: 'Succeeded'
        }
      ]
      defaultAction: 'Deny'
    }
  }
}

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

resource storageFileDataPrivilegedContributor 'Microsoft.Authorization/roleDefinitions@2022-04-01' existing = {
  name: '69566ab7-960f-475b-8e7c-b3118f30c6bd' // Storage File Data Privileged Contributor
  scope: tenant()
}

resource roleAssignment 'Microsoft.Authorization/roleAssignments@2022-04-01' = {
  scope: storageAccount

  name: guid(storageFileDataPrivilegedContributor.id, userAssignedIdentity.id, storageAccount.id)
  properties: {
    principalId: userAssignedIdentity.properties.principalId
    roleDefinitionId: storageFileDataPrivilegedContributor.id
    principalType: 'ServicePrincipal'
  }
}

Puede usar el siguiente archivo de Bicep para probar la implementación:

param prefix string

param location string  = resourceGroup().location
param utcValue string = utcNow()

param storageAccountName string
param vnetName string
param subnetName string
param userAssignedIdentityName string

resource vnet 'Microsoft.Network/virtualNetworks@2023-05-01' existing = {
  name: vnetName

  resource subnet 'subnets' existing = {
    name: subnetName
  }
}

resource userAssignedIdentity 'Microsoft.ManagedIdentity/userAssignedIdentities@2023-01-31' existing = {
  name: userAssignedIdentityName
}

resource dsTest 'Microsoft.Resources/deploymentScripts@2023-08-01' = {
  name: '${prefix}DS'
  location: location
  identity: {
    type: 'userAssigned'
    userAssignedIdentities: {
      '${userAssignedIdentity.id}': {}
    }
  }
  kind: 'AzureCLI'
  properties: {
    forceUpdateTag: utcValue
    azCliVersion: '2.52.0'
    storageAccountSettings: {
      storageAccountName: storageAccountName
    }
    containerSettings: {
      subnetIds: [
        {
          id: vnet::subnet.id
        }
      ]
    }
    scriptContent: 'echo "Hello world!"'
    retentionInterval: 'P1D'
    cleanupPreference: 'OnExpiration'
  }
}

Pasos siguientes

En este artículo, aprendió a acceder a una red virtual privada. Para obtener más información: