Guida introduttiva: Creare un endpoint privato usando un modello di Resource Manager
In questa guida introduttiva si userà un modello di Azure Resource Manager per creare un endpoint privato.
Un modello di Azure Resource Manager è un file JSON (JavaScript Object Notation) che definisce l'infrastruttura e la configurazione del progetto. Il modello utilizza la sintassi dichiarativa. Si descrive la distribuzione prevista senza scrivere la sequenza di comandi di programmazione necessari per creare la distribuzione.
È anche possibile creare un endpoint privato usando il portale di Azure, Azure PowerShell o l'interfaccia della riga di comando di Azure.
Se l'ambiente soddisfa i prerequisiti e si ha familiarità con l'uso dei modelli di Resource Manager, selezionare il pulsante Distribuisci in Azure qui. Il modello di Resource Manager verrà aperto nel portale di Azure.
Prerequisiti
È necessario un account Azure con una sottoscrizione attiva. Se non si ha già un account Azure, è possibile crearne uno gratuitamente.
Rivedere il modello
Questo modello crea un endpoint privato per un'istanza del database SQL di Azure.
Il modello usato da questa guida introduttiva proviene dai modelli di avvio rapido di Azure.
{
"$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
"contentVersion": "1.0.0.0",
"metadata": {
"_generator": {
"name": "bicep",
"version": "0.5.6.12127",
"templateHash": "14846974543330599630"
}
},
"parameters": {
"sqlAdministratorLogin": {
"type": "string",
"metadata": {
"description": "The administrator username of the SQL logical server"
}
},
"sqlAdministratorLoginPassword": {
"type": "secureString",
"metadata": {
"description": "The administrator password of the SQL logical server."
}
},
"vmAdminUsername": {
"type": "string",
"metadata": {
"description": "Username for the Virtual Machine."
}
},
"vmAdminPassword": {
"type": "secureString",
"metadata": {
"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)"
}
},
"VmSize": {
"type": "string",
"defaultValue": "Standard_D2_v3",
"metadata": {
"description": "The size of the VM"
}
},
"location": {
"type": "string",
"defaultValue": "[resourceGroup().location]",
"metadata": {
"description": "Location for all resources."
}
}
},
"variables": {
"vnetName": "myVirtualNetwork",
"vnetAddressPrefix": "10.0.0.0/16",
"subnet1Prefix": "10.0.0.0/24",
"subnet1Name": "mySubnet",
"sqlServerName": "[format('sqlserver{0}', uniqueString(resourceGroup().id))]",
"databaseName": "[format('{0}/sample-db', variables('sqlServerName'))]",
"privateEndpointName": "myPrivateEndpoint",
"privateDnsZoneName": "[format('privatelink{0}', environment().suffixes.sqlServerHostname)]",
"pvtEndpointDnsGroupName": "[format('{0}/mydnsgroupname', variables('privateEndpointName'))]",
"vmName": "[take(format('myVm{0}', uniqueString(resourceGroup().id)), 15)]",
"publicIpAddressName": "[format('{0}PublicIP', variables('vmName'))]",
"networkInterfaceName": "[format('{0}NetInt', variables('vmName'))]",
"osDiskType": "StandardSSD_LRS"
},
"resources": [
{
"type": "Microsoft.Sql/servers",
"apiVersion": "2021-11-01-preview",
"name": "[variables('sqlServerName')]",
"location": "[parameters('location')]",
"tags": {
"displayName": "[variables('sqlServerName')]"
},
"properties": {
"administratorLogin": "[parameters('sqlAdministratorLogin')]",
"administratorLoginPassword": "[parameters('sqlAdministratorLoginPassword')]",
"version": "12.0",
"publicNetworkAccess": "Disabled"
}
},
{
"type": "Microsoft.Sql/servers/databases",
"apiVersion": "2021-11-01-preview",
"name": "[variables('databaseName')]",
"location": "[parameters('location')]",
"sku": {
"name": "Basic",
"tier": "Basic",
"capacity": 5
},
"tags": {
"displayName": "[variables('databaseName')]"
},
"properties": {
"collation": "SQL_Latin1_General_CP1_CI_AS",
"maxSizeBytes": 104857600,
"sampleName": "AdventureWorksLT"
},
"dependsOn": [
"[resourceId('Microsoft.Sql/servers', variables('sqlServerName'))]"
]
},
{
"type": "Microsoft.Network/virtualNetworks",
"apiVersion": "2021-05-01",
"name": "[variables('vnetName')]",
"location": "[parameters('location')]",
"properties": {
"addressSpace": {
"addressPrefixes": [
"[variables('vnetAddressPrefix')]"
]
}
}
},
{
"type": "Microsoft.Network/virtualNetworks/subnets",
"apiVersion": "2021-05-01",
"name": "[format('{0}/{1}', variables('vnetName'), variables('subnet1Name'))]",
"properties": {
"addressPrefix": "[variables('subnet1Prefix')]",
"privateEndpointNetworkPolicies": "Disabled"
},
"dependsOn": [
"[resourceId('Microsoft.Network/virtualNetworks', variables('vnetName'))]"
]
},
{
"type": "Microsoft.Network/privateEndpoints",
"apiVersion": "2021-05-01",
"name": "[variables('privateEndpointName')]",
"location": "[parameters('location')]",
"properties": {
"subnet": {
"id": "[resourceId('Microsoft.Network/virtualNetworks/subnets', variables('vnetName'), variables('subnet1Name'))]"
},
"privateLinkServiceConnections": [
{
"name": "[variables('privateEndpointName')]",
"properties": {
"privateLinkServiceId": "[resourceId('Microsoft.Sql/servers', variables('sqlServerName'))]",
"groupIds": [
"sqlServer"
]
}
}
]
},
"dependsOn": [
"[resourceId('Microsoft.Sql/servers', variables('sqlServerName'))]",
"[resourceId('Microsoft.Network/virtualNetworks/subnets', variables('vnetName'), variables('subnet1Name'))]",
"[resourceId('Microsoft.Network/virtualNetworks', variables('vnetName'))]"
]
},
{
"type": "Microsoft.Network/privateDnsZones",
"apiVersion": "2020-06-01",
"name": "[variables('privateDnsZoneName')]",
"location": "global",
"properties": {},
"dependsOn": [
"[resourceId('Microsoft.Network/virtualNetworks', variables('vnetName'))]"
]
},
{
"type": "Microsoft.Network/privateDnsZones/virtualNetworkLinks",
"apiVersion": "2020-06-01",
"name": "[format('{0}/{1}', variables('privateDnsZoneName'), format('{0}-link', variables('privateDnsZoneName')))]",
"location": "global",
"properties": {
"registrationEnabled": false,
"virtualNetwork": {
"id": "[resourceId('Microsoft.Network/virtualNetworks', variables('vnetName'))]"
}
},
"dependsOn": [
"[resourceId('Microsoft.Network/privateDnsZones', variables('privateDnsZoneName'))]",
"[resourceId('Microsoft.Network/virtualNetworks', variables('vnetName'))]"
]
},
{
"type": "Microsoft.Network/privateEndpoints/privateDnsZoneGroups",
"apiVersion": "2021-05-01",
"name": "[variables('pvtEndpointDnsGroupName')]",
"properties": {
"privateDnsZoneConfigs": [
{
"name": "config1",
"properties": {
"privateDnsZoneId": "[resourceId('Microsoft.Network/privateDnsZones', variables('privateDnsZoneName'))]"
}
}
]
},
"dependsOn": [
"[resourceId('Microsoft.Network/privateDnsZones', variables('privateDnsZoneName'))]",
"[resourceId('Microsoft.Network/privateEndpoints', variables('privateEndpointName'))]"
]
},
{
"type": "Microsoft.Network/publicIPAddresses",
"apiVersion": "2021-05-01",
"name": "[variables('publicIpAddressName')]",
"location": "[parameters('location')]",
"tags": {
"displayName": "[variables('publicIpAddressName')]"
},
"properties": {
"publicIPAllocationMethod": "Dynamic"
}
},
{
"type": "Microsoft.Network/networkInterfaces",
"apiVersion": "2021-05-01",
"name": "[variables('networkInterfaceName')]",
"location": "[parameters('location')]",
"tags": {
"displayName": "[variables('networkInterfaceName')]"
},
"properties": {
"ipConfigurations": [
{
"name": "ipConfig1",
"properties": {
"privateIPAllocationMethod": "Dynamic",
"publicIPAddress": {
"id": "[resourceId('Microsoft.Network/publicIPAddresses', variables('publicIpAddressName'))]"
},
"subnet": {
"id": "[resourceId('Microsoft.Network/virtualNetworks/subnets', variables('vnetName'), variables('subnet1Name'))]"
}
}
}
]
},
"dependsOn": [
"[resourceId('Microsoft.Network/publicIPAddresses', variables('publicIpAddressName'))]",
"[resourceId('Microsoft.Network/virtualNetworks/subnets', variables('vnetName'), variables('subnet1Name'))]",
"[resourceId('Microsoft.Network/virtualNetworks', variables('vnetName'))]"
]
},
{
"type": "Microsoft.Compute/virtualMachines",
"apiVersion": "2021-11-01",
"name": "[variables('vmName')]",
"location": "[parameters('location')]",
"tags": {
"displayName": "[variables('vmName')]"
},
"properties": {
"hardwareProfile": {
"vmSize": "[parameters('VmSize')]"
},
"osProfile": {
"computerName": "[variables('vmName')]",
"adminUsername": "[parameters('vmAdminUsername')]",
"adminPassword": "[parameters('vmAdminPassword')]"
},
"storageProfile": {
"imageReference": {
"publisher": "MicrosoftWindowsServer",
"offer": "WindowsServer",
"sku": "2019-Datacenter",
"version": "latest"
},
"osDisk": {
"name": "[format('{0}OsDisk', variables('vmName'))]",
"caching": "ReadWrite",
"createOption": "FromImage",
"managedDisk": {
"storageAccountType": "[variables('osDiskType')]"
},
"diskSizeGB": 128
}
},
"networkProfile": {
"networkInterfaces": [
{
"id": "[resourceId('Microsoft.Network/networkInterfaces', variables('networkInterfaceName'))]"
}
]
}
},
"dependsOn": [
"[resourceId('Microsoft.Network/networkInterfaces', variables('networkInterfaceName'))]"
]
}
]
}
Il modello definisce più risorse di Azure:
- Microsoft.Sql/servers: istanza di database SQL con il database di esempio.
- Microsoft.Sql/servers/databases: database di esempio.
- Microsoft.Network/virtualNetworks: rete virtuale in cui viene distribuito l'endpoint privato.
- Microsoft.Network/privateEndpoints: endpoint privato usato per accedere all'istanza di database SQL.
- Microsoft.Network/privateDnsZones: zona usata per risolvere l'indirizzo IP dell'endpoint privato.
- Microsoft.Network/privateDnsZones/virtualNetworkLinks
- Microsoft.Network/privateEndpoints/privateDnsZoneGroups: gruppo di zone usato per associare l'endpoint privato a una zona DNS privata.
- Microsoft.Network/publicIpAddresses: indirizzo IP pubblico usato per accedere alla macchina virtuale.
- Microsoft.Network/networkInterfaces: interfaccia di rete per la macchina virtuale.
- Microsoft.Compute/virtualMachines: macchina virtuale usata per testare la connessione dell'endpoint privato all'istanza di database SQL.
Distribuire il modello
Distribuire il modello di Resource Manager in Azure eseguendo le operazioni seguenti:
Accedere ad Azure e aprire il modello di Resource Manager selezionando il pulsante Distribuisci in Azure qui. Il modello crea l'endpoint privato, l'istanza di database SQL, l'infrastruttura di rete e una macchina virtuale da convalidare.
Selezionare il gruppo di risorse o crearne uno nuovo.
Immettere il nome e la password di accesso dell'amministratore SQL.
Immettere il nome utente e la password dell'amministratore della macchina virtuale.
Esaminare le condizioni per l'utilizzo del servizio. Se si accetta, selezionare Accetto le condizioni indicate in precedenza e quindi selezionare Acquista. Il completamento della distribuzione può richiedere più di 20 minuti.
Convalidare la distribuzione
Nota
Il modello di Azure Resource Manager genera un nome univoco per la risorsa macchina virtuale myVm{UniqueId} 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:
Nella barra di ricerca del portale immettere myVm{uniqueid}.
Selezionare Connetti. Verrà visualizzata la finestra Connetti alla macchina virtuale.
Selezionare Scarica file RDP. Azure crea un file RDP (Remote Desktop Protocol) e lo scarica nel computer.
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.
Seleziona OK.
Durante il processo di accesso potrebbe essere visualizzato un avviso relativo al certificato. Se sì, selezionare Sì oppure Continua.
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:
Nel Desktop remoto di myVM{uniqueid}aprire PowerShell.
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
Installare SQL Server Management Studio.
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 Sì.
Selezionare Connetti.
Nel riquadro sinistro selezionare Database. Facoltativamente, è possibile creare o eseguire query sulle informazioni di sample-db.
Chiudere la connessione Desktop remoto a myVm{uniqueid}.
Pulire le risorse
Quando le risorse create con l'endpoint privato non sono più necessarie, eliminare il gruppo di risorse. In questo modo viene rimosso l'endpoint privato e tutte le risorse correlate.
Per eliminare il gruppo di risorse, eseguire il Remove-AzResourceGroup
cmdlet :
Remove-AzResourceGroup -Name <your resource group name>
Passaggi successivi
Per altre informazioni sui servizi che supportano endpoint privati, vedere: