Condividi tramite


Guida introduttiva: Creare un endpoint privato con Bicep

In questa guida introduttiva si userà Bicep per creare un endpoint privato.

Bicep è un linguaggio specifico di dominio (DSL) che usa la sintassi dichiarativa per distribuire le risorse di Azure. Offre sintassi concisa, indipendenza dai tipi affidabile e supporto per il riutilizzo del codice. Bicep offre la migliore esperienza di creazione per le soluzioni di infrastruttura come codice in Azure.

È anche possibile creare un endpoint privato usando il portale di Azure, Azure PowerShell, l'interfaccia della riga di comando di Azure o un modello di Azure Resource Manager.

Diagramma delle risorse create nella guida introduttiva all'endpoint privato.

Prerequisiti

È necessario un account Azure con una sottoscrizione attiva. Se non si ha già un account Azure, creare gratuitamente un account.

Esaminare il file Bicep

Questo file Bicep crea un endpoint privato per un'istanza di database SQL di Azure.

Il file Bicep usato da questa guida introduttiva proviene dai modelli di avvio rapido di Azure.

@description('The administrator username of the SQL logical server')
param sqlAdministratorLogin string

@description('The administrator password of the SQL logical server.')
@secure()
param sqlAdministratorLoginPassword string

@description('Username for the Virtual Machine.')
param vmAdminUsername string

@description('Password for the Virtual Machine. The password must be at least 12 characters long and have lower case, upper characters, digit and a special character (Regex match)')
@secure()
param vmAdminPassword string

@description('The size of the VM')
param VmSize string = 'Standard_D2_v3'

@description('Location for all resources.')
param location string = resourceGroup().location

var vnetName = 'myVirtualNetwork'
var vnetAddressPrefix = '10.0.0.0/16'
var subnet1Prefix = '10.0.0.0/24'
var subnet1Name = 'mySubnet'
var sqlServerName = 'sqlserver${uniqueString(resourceGroup().id)}'
var databaseName = '${sqlServerName}/sample-db'
var privateEndpointName = 'myPrivateEndpoint'
var privateDnsZoneName = 'privatelink${environment().suffixes.sqlServerHostname}'
var pvtEndpointDnsGroupName = '${privateEndpointName}/mydnsgroupname'
var vmName = take('myVm${uniqueString(resourceGroup().id)}', 15)
var publicIpAddressName = '${vmName}PublicIP'
var networkInterfaceName = '${vmName}NetInt'
var osDiskType = 'StandardSSD_LRS'

resource sqlServer 'Microsoft.Sql/servers@2021-11-01-preview' = {
  name: sqlServerName
  location: location
  tags: {
    displayName: sqlServerName
  }
  properties: {
    administratorLogin: sqlAdministratorLogin
    administratorLoginPassword: sqlAdministratorLoginPassword
    version: '12.0'
    publicNetworkAccess: 'Disabled'
  }
}

resource database 'Microsoft.Sql/servers/databases@2021-11-01-preview' = {
  name: databaseName
  location: location
  sku: {
    name: 'Basic'
    tier: 'Basic'
    capacity: 5
  }
  tags: {
    displayName: databaseName
  }
  properties: {
    collation: 'SQL_Latin1_General_CP1_CI_AS'
    maxSizeBytes: 104857600
    sampleName: 'AdventureWorksLT'
  }
  dependsOn: [
    sqlServer
  ]
}

resource vnet 'Microsoft.Network/virtualNetworks@2021-05-01' = {
  name: vnetName
  location: location
  properties: {
    addressSpace: {
      addressPrefixes: [
        vnetAddressPrefix
      ]
    }
  }
}

resource subnet 'Microsoft.Network/virtualNetworks/subnets@2021-05-01' = {
  parent: vnet
  name: subnet1Name
  properties: {
    addressPrefix: subnet1Prefix
    privateEndpointNetworkPolicies: 'Disabled'
  }
}

resource privateEndpoint 'Microsoft.Network/privateEndpoints@2021-05-01' = {
  name: privateEndpointName
  location: location
  properties: {
    subnet: {
      id: subnet.id
    }
    privateLinkServiceConnections: [
      {
        name: privateEndpointName
        properties: {
          privateLinkServiceId: sqlServer.id
          groupIds: [
            'sqlServer'
          ]
        }
      }
    ]
  }
  dependsOn: [
    vnet
  ]
}

resource privateDnsZone 'Microsoft.Network/privateDnsZones@2020-06-01' = {
  name: privateDnsZoneName
  location: 'global'
  properties: {}
  dependsOn: [
    vnet
  ]
}

resource privateDnsZoneLink 'Microsoft.Network/privateDnsZones/virtualNetworkLinks@2020-06-01' = {
  parent: privateDnsZone
  name: '${privateDnsZoneName}-link'
  location: 'global'
  properties: {
    registrationEnabled: false
    virtualNetwork: {
      id: vnet.id
    }
  }
}

resource pvtEndpointDnsGroup 'Microsoft.Network/privateEndpoints/privateDnsZoneGroups@2021-05-01' = {
  name: pvtEndpointDnsGroupName
  properties: {
    privateDnsZoneConfigs: [
      {
        name: 'config1'
        properties: {
          privateDnsZoneId: privateDnsZone.id
        }
      }
    ]
  }
  dependsOn: [
    privateEndpoint
  ]
}

resource publicIpAddress 'Microsoft.Network/publicIPAddresses@2021-05-01' = {
  name: publicIpAddressName
  location: location
  tags: {
    displayName: publicIpAddressName
  }
  properties: {
    publicIPAllocationMethod: 'Dynamic'
  }
}

resource networkInterface 'Microsoft.Network/networkInterfaces@2021-05-01' = {
  name: networkInterfaceName
  location: location
  tags: {
    displayName: networkInterfaceName
  }
  properties: {
    ipConfigurations: [
      {
        name: 'ipConfig1'
        properties: {
          privateIPAllocationMethod: 'Dynamic'
          publicIPAddress: {
            id: publicIpAddress.id
          }
          subnet: {
            id: subnet.id
          }
        }
      }
    ]
  }
  dependsOn: [
    vnet
  ]
}

resource vm 'Microsoft.Compute/virtualMachines@2021-11-01' = {
  name: vmName
  location: location
  tags: {
    displayName: vmName
  }
  properties: {
    hardwareProfile: {
      vmSize: VmSize
    }
    osProfile: {
      computerName: vmName
      adminUsername: vmAdminUsername
      adminPassword: vmAdminPassword
    }
    storageProfile: {
      imageReference: {
        publisher: 'MicrosoftWindowsServer'
        offer: 'WindowsServer'
        sku: '2019-Datacenter'
        version: 'latest'
      }
      osDisk: {
        name: '${vmName}OsDisk'
        caching: 'ReadWrite'
        createOption: 'FromImage'
        managedDisk: {
          storageAccountType: osDiskType
        }
        diskSizeGB: 128
      }
    }
    networkProfile: {
      networkInterfaces: [
        {
          id: networkInterface.id
        }
      ]
    }
  }
}

Il file Bicep definisce più risorse di Azure:

Distribuire il file Bicep

  1. Salvare il file Bicep come main.bicep nel computer locale.

  2. Distribuisci il file Bicep usando l'interfaccia della riga di comando di Azure o Azure PowerShell.

    az group create --name exampleRG --location eastus
    az deployment group create --resource-group exampleRG --template-file main.bicep --parameters sqlAdministratorLogin=<admin-login> vmAdminUsername=<vm-login>
    

    Nota

    Sostituire <admin-login> con il nome utente per il server logico SQL. Sostituire <vm-login> con il nome utente per la macchina virtuale. Verrà richiesto di immettere sqlAdministratorLoginPassword. Verrà inoltre richiesto di immettere vmAdminPassword, che deve avere una lunghezza di almeno 12 caratteri e contenere almeno un carattere minuscolo e maiuscolo e un carattere speciale.

    Al termine della distribuzione verrà visualizzato un messaggio che indica che la distribuzione è stata completata.

Convalidare la distribuzione

Nota

Il file Bicep genera un nome univoco per la risorsa myVm{uniqueid} della macchina virtuale e per la risorsa database SQL sqlserver{uniqueid}. Sostituire il valore generato per {UniqueId}.

Connettersi a una VM da Internet

Connettersi alla macchina virtuale myVm{uniqueid} da Internet eseguendo le operazioni seguenti:

  1. Nella barra di ricerca portale di Azure immettere myVm{uniqueid}.

  2. Selezionare Connetti. Verrà visualizzata la finestra Connetti alla macchina virtuale.

  3. Selezionare Scarica file RDP. Azure crea un file RDP (Remote Desktop Protocol) e lo scarica nel computer.

  4. Aprire il file RDP scaricato.

    a. Quando richiesto, selezionare Connetti.
    b. Immettere il nome utente e la password specificati al momento della creazione della macchina virtuale.

    Nota

    Potrebbe essere necessario selezionare Altre opzioni>Usare un account diverso per specificare le credenziali immesse al momento della creazione della macchina virtuale.

  5. Seleziona OK.

    Durante il processo di accesso potrebbe essere visualizzato un avviso relativo al certificato. Se sì, selezionare oppure Continua.

  6. Quando viene visualizzato il desktop della macchina virtuale, ridurlo a icona per tornare al desktop locale.

Accedere al server di database SQL privatamente dalla macchina virtuale

Per connettersi al server database SQL dalla macchina virtuale usando l'endpoint privato, eseguire le operazioni seguenti:

  1. Nel Desktop remoto di myVM{uniqueid}aprire PowerShell.

  2. Esegui questo comando:

    nslookup sqlserver{uniqueid}.database.windows.net

    Verrà visualizzato un messaggio simile al seguente:

      Server:  UnKnown
      Address:  168.63.129.16
      Non-authoritative answer:
      Name:    sqlserver.privatelink.database.windows.net
      Address:  10.0.0.5
      Aliases:  sqlserver.database.windows.net
    
  3. Installare SQL Server Management Studio.

  4. Nel riquadro Connetti al server eseguire le operazioni seguenti:

    • In Tipo di server selezionare motore di database.
    • In Nome server selezionare sqlserver{uniqueid}.database.windows.net.
    • Per Nome utente immettere il nome utente specificato in precedenza.
    • Per Password immettere la password specificata in precedenza.
    • Per Memorizza password selezionare .
  5. Selezionare Connetti.

  6. Nel riquadro sinistro selezionare Database. Facoltativamente, è possibile creare o eseguire query sulle informazioni di sample-db.

  7. Chiudere la connessione Desktop remoto a myVm{uniqueid}.

Pulire le risorse

Quando le risorse create con il servizio Collegamento privato non sono più necessarie, eliminare il gruppo di risorse. Oltre al servizio Collegamento privato verranno rimosse tutte le risorse correlate.

az group delete --name exampleRG

Passaggi successivi

Per altre informazioni sui servizi che supportano endpoint privati, vedere: