Creare risorse di rete virtuale con Bicep

Molte distribuzioni di Azure richiedono la distribuzione e la configurazione delle risorse di rete. È possibile usare Bicep per definire le risorse di rete di Azure.

Reti virtuali e subnet

Definire le reti virtuali creando una risorsa con il tipo Microsoft.Network/virtualNetworks.

Configurare le subnet usando la proprietà subnet

Le reti virtuali contengono subnet, ovvero gruppi logici di indirizzi IP all'interno della rete virtuale. Esistono due modi per definire le subnet in Bicep: usando la proprietà subnets nella risorsa di rete virtuale e creando un risorsa figlio con tipo Microsoft.Network/virtualNetworks/subnets.

Avviso

Evitare di definire subnet come risorse figlio. Questo approccio può comportare tempi di inattività per le risorse durante le distribuzioni successive o distribuzioni non riuscite.

È consigliabile definire le subnet all'interno della definizione della rete virtuale, come in questo esempio:

L'esempio seguente fa parte di un esempio più ampio. Per un file Bicep che è possibile distribuire, vedere il file completo.

param location string = resourceGroup().location

var virtualNetworkName = 'my-vnet'
var subnet1Name = 'Subnet-1'
var subnet2Name = 'Subnet-2'

resource virtualNetwork 'Microsoft.Network/virtualNetworks@2023-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

Anche se entrambi gli approcci consentono di definire e creare le subnet, esiste una differenza importante. Quando si definiscono le subnet usando le risorse figlio, la prima volta che viene distribuito il file Bicep, viene distribuita la rete virtuale. Quindi, al termine della distribuzione della rete virtuale, ogni subnet viene distribuita. Questa sequenziazione si verifica perché Azure Resource Manager distribuisce ogni singola risorsa separatamente.

Quando si ridistribuisce lo stesso file Bicep, si verifica la stessa sequenza di distribuzione. Tuttavia, la rete virtuale viene distribuita senza subnet configurate perché la proprietà subnets è effettivamente vuota. Quindi, dopo la riconfigurazione della rete virtuale, le risorse della subnet vengono ridistribuite, cosa che ripristina ogni subnet. In alcune situazioni, questo comportamento causa la perdita della connettività delle risorse all'interno della rete virtuale durante la distribuzione. In altre situazioni, Azure impedisce di modificare la rete virtuale e la distribuzione non riesce.

Accedere agli ID risorsa della subnet

Spesso è necessario fare riferimento all'ID risorsa di una subnet. Quando si usa la proprietà subnets per definire la subnet, è possibile usare la parola chiave existing anche per ottenere un riferimento fortemente tipizzato alla subnet e quindi accedere alla proprietà id della subnet:

L'esempio seguente fa parte di un esempio più ampio. Per un file Bicep che è possibile distribuire, vedere il file completo.

param location string = resourceGroup().location

var virtualNetworkName = 'my-vnet'
var subnet1Name = 'Subnet-1'
var subnet2Name = 'Subnet-2'

resource virtualNetwork 'Microsoft.Network/virtualNetworks@2023-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

Poiché questo esempio usa la parola chiave existing per accedere alla risorsa subnet, anziché definire la risorsa subnet completa, non presenta i rischi descritti nella sezione precedente.

È anche possibile combinare le parole chiave existing e scope per fare riferimento a una risorsa di rete virtuale o subnet in un altro gruppo di risorse.

Gruppi di sicurezza di rete

I gruppi di sicurezza di rete vengono spesso usati per applicare regole che controllano il flusso di traffico in ingresso e in uscita da una subnet o un'interfaccia di rete. Può diventare complesso definire un numero elevato di regole all'interno di un file Bicep e condividere regole tra più file Bicep. È consigliabile usare il modello di file della variabile condivisa quando si lavora con gruppi di sicurezza di rete complessi o di grandi dimensioni.

Endpoint privati

Gli endpoint privati devono essere approvati. In alcune situazioni, l'approvazione avviene automaticamente. In altri scenari, tuttavia, è necessario approvare l'endpoint prima che sia utilizzabile.

L'approvazione dell'endpoint privato è un'operazione, quindi non è possibile eseguirla direttamente all'interno del codice Bicep. Tuttavia, è possibile usare uno script di distribuzione per richiamare l'operazione. In alternativa, è possibile richiamare l'operazione all'esterno del file Bicep, ad esempio in uno script della pipeline.