Mit PowerShell: Erstellen eines virtuellen Dienstendpunkts und einer VNet-Regel für Azure SQL-Datenbank
Gilt für: Azure SQL-Datenbank
VNET-Regeln sind ein Firewallsicherheitsfeature, das steuert, ob der logische SQL-Server für Ihre Datenbanken und Pool für elastische Datenbanken von Azure SQL-Datenbank oder Datenbanken in Azure Synapse Nachrichten akzeptieren, die von bestimmten Subnetzen in virtuellen Netzwerken gesendet werden.
Wichtig
Dieser Artikel gilt für Azure SQL-Datenbank und Azure Synapse (zuvor SQL Data Warehouse). Der Einfachheit halber bezieht sich der Begriff Azure SQL-Datenbank in diesem Artikel auf Datenbanken, die entweder zu Azure SQL-Datenbank oder Azure Synapse gehören. Dieser Artikel gilt nicht für Azure SQL Managed Instance, da kein zugeordneter Dienstendpunkt vorliegt.
In diesem Artikel wird ein PowerShell-Skript veranschaulicht, das die folgenden Aktionen ausführt:
- Erstellt einen virtuellen Dienstendpunkt von Microsoft Azure in Ihrem Subnetz.
- Es fügt den Endpunkt zur Firewall Ihres Servers hinzu, um eine VNET-Regel zu erstellen.
Weitere Informationen finden Sie unter Virtuelle Dienstendpunkte für Azure SQL-Datenbank.
Tipp
Wenn Sie nur den Typnamen des virtuellen Dienstendpunkts für Azure SQL-Datenbank bewerten oder zu Ihrem Subnetz hinzufügen müssen, fahren Sie mit dem direkten PowerShell-Skript fort.
Hinweis
In diesem Artikel wird das Azure Az PowerShell-Modul verwendet. Dieses PowerShell-Modul wird für die Interaktion mit Azure empfohlen. Informationen zu den ersten Schritten mit dem Az PowerShell-Modul finden Sie unter Installieren von Azure PowerShell. Informationen zum Migrieren zum Az PowerShell-Modul finden Sie unter Migrieren von Azure PowerShell von AzureRM zum Az-Modul.
Wichtig
Das Azure Resource Manager-Modul von PowerShell wird von Azure SQL-Datenbank weiterhin unterstützt, aber alle zukünftigen Entwicklungen erfolgen für die Az.Sql
-Cmdlets. Informationen zum älteren Modul finden Sie unter AzureRM.Sql. Die Argumente für die Befehle im Az-Modul und den AzureRm-Modulen sind im Wesentlichen identisch.
Wichtige Cmdlets
Dieser Artikel befasst sich überwiegend mit dem New-AzSqlServerVirtualNetworkRule-Cmdlet, das den Subnetzendpunkt zu Zugriffssteuerungsliste Ihres Servers hinzufügt und dadurch eine Regel erstellt.
Die folgende Liste zeigt die Abfolge von anderen wichtigen Cmdlets, die Sie ausführen müssen, um den Aufruf von New-AzSqlServerVirtualNetworkRule vorzubereiten. In diesem Artikel werden diese Aufrufe in script 3 "Virtual network rule" (Skript 3: VNET-Regel) ausgeführt.
- New-AzVirtualNetworkSubnetConfig: Erstellt ein Subnetzobjekt.
- New-AzVirtualNetwork: Erstellt Ihr virtuelles Netzwerk und weist diesem das Subnetz zu.
- Set-AzVirtualNetworkSubnetConfig: Weist Ihrem Subnetz einen virtuellen Dienstendpunkt zu.
- Set-AzVirtualNetwork: Behält Updates bei, die für Ihr virtuelles Netzwerk vorgenommen wurden.
- New-AzSqlServerVirtualNetworkRule: Sobald Ihr Subnetz ein Endpunkt ist, wird dieses als VNET-Regel zur Zugriffssteuerungsliste Ihres Servers hinzugefügt.
- Dieses Cmdlet bietet den Parameter -IgnoreMissingVNetServiceEndpoint ab Azure RM PowerShell-Modul Version 5.1.1.
Voraussetzungen für das Ausführen von PowerShell
- Sie können sich bereits bei Azure anmelden, z. B. über das Azure-Portal.
- Sie können bereits PowerShell-Skripts ausführen.
Hinweis
Vergewissern Sie sich, dass Dienstendpunkte für das VNet/Subnetz aktiviert sind, das Sie dem Server hinzufügen möchten, da andernfalls die VNet-Firewallregel nicht erstellt werden kann.
Ein in vier Blöcke unterteiltes Skript
Das PowerShell-Beispielskript ist in eine Abfolge von kleineren Skripts unterteilt. Die Aufteilung erleichtert das Lernen und bietet Flexibilität. Die Skripts müssen in ihrer angegebenen Reihenfolge ausgeführt werden. Wenn Sie keine Zeit für das Ausführen der Skripts haben: Die tatsächliche Testausgabe wird nach Skript 4 angezeigt.
Skript 1: Variables
Dieses erste PowerShell-Skript weist Variablen Werte zu. Die nachfolgenden Skripts hängen von diesen Variablen ab.
Wichtig
Bevor Sie dieses Skript ausführen, können Sie die Werte bei Bedarf bearbeiten. Wenn Sie beispielsweise bereits über eine Ressourcengruppe verfügen, sollten Sie den Namen Ihrer Ressourcengruppe dem zugewiesenen Wert entsprechend bearbeiten.
Ihr Abonnementname sollte in das Skript eingefügt werden.
Quellcode von PowerShell-Skript 1
######### Script 1 ########################################
## LOG into to your Azure account. ##
## (Needed only one time per powershell.exe session.) ##
###########################################################
$yesno = Read-Host 'Do you need to log into Azure (only one time per powershell.exe session)? [yes/no]'
if ('yes' -eq $yesno) { Connect-AzAccount }
###########################################################
## Assignments to variables used by the later scripts. ##
###########################################################
# You can edit these values, if necessary.
$SubscriptionName = 'yourSubscriptionName'
Select-AzSubscription -SubscriptionName $SubscriptionName
$ResourceGroupName = 'RG-YourNameHere'
$Region = 'westcentralus'
$VNetName = 'myVNet'
$SubnetName = 'mySubnet'
$VNetAddressPrefix = '10.1.0.0/16'
$SubnetAddressPrefix = '10.1.1.0/24'
$VNetRuleName = 'myFirstVNetRule-ForAcl'
$SqlDbServerName = 'mysqldbserver-forvnet'
$SqlDbAdminLoginName = 'ServerAdmin'
$SqlDbAdminLoginPassword = 'ChangeYourAdminPassword1'
$ServiceEndpointTypeName_SqlDb = 'Microsoft.Sql' # Official type name.
Write-Host 'Completed script 1, the "Variables".'
Skript 2: Voraussetzungen
Dieses Skript bereitet Sie auf den nächsten Schritt vor, in dem die Endpunktaktion stattfindet. Dieses Skript erstellt die im Folgenden aufgelisteten Elemente für Sie, jedoch nur, wenn diese nicht bereits vorhanden sind. Sie können Skript 2 überspringen, wenn Sie sicher sind, dass diese Elemente bereits vorhanden sind:
- Azure-Ressourcengruppe
- Logischer SQL-Server
Quellcode von PowerShell-Skript 2
######### Script 2 ########################################
## Ensure your Resource Group already exists. ##
###########################################################
Write-Host "Check whether your Resource Group already exists."
$gottenResourceGroup = $null
$gottenResourceGroup = Get-AzResourceGroup -Name $ResourceGroupName -ErrorAction SilentlyContinue
if ($null -eq $gottenResourceGroup) {
Write-Host "Creating your missing Resource Group - $ResourceGroupName."
New-AzResourceGroup -Name $ResourceGroupName -Location $Region
} else {
Write-Host "Good, your Resource Group already exists - $ResourceGroupName."
}
$gottenResourceGroup = $null
###########################################################
## Ensure your server already exists. ##
###########################################################
Write-Host "Check whether your server already exists."
$sqlDbServer = $null
$azSqlParams = @{
ResourceGroupName = $ResourceGroupName
ServerName = $SqlDbServerName
ErrorAction = 'SilentlyContinue'
}
$sqlDbServer = Get-AzSqlServer @azSqlParams
if ($null -eq $sqlDbServer) {
Write-Host "Creating the missing server - $SqlDbServerName."
Write-Host "Gather the credentials necessary to next create a server."
$sqlAdministratorCredentials = [pscredential]::new($SqlDbAdminLoginName,(ConvertTo-SecureString -String $SqlDbAdminLoginPassword -AsPlainText -Force))
if ($null -eq $sqlAdministratorCredentials) {
Write-Host "ERROR, unable to create SQL administrator credentials. Now ending."
return
}
Write-Host "Create your server."
$sqlSrvParams = @{
ResourceGroupName = $ResourceGroupName
ServerName = $SqlDbServerName
Location = $Region
SqlAdministratorCredentials = $sqlAdministratorCredentials
}
New-AzSqlServer @sqlSrvParams
} else {
Write-Host "Good, your server already exists - $SqlDbServerName."
}
$sqlAdministratorCredentials = $null
$sqlDbServer = $null
Write-Host 'Completed script 2, the "Prerequisites".'
Skript 3: Erstellen eines Endpunkts und einer Regel
Dieses Skript erstellt ein virtuelles Netzwerk mit einem Subnetz. Das Skript weist Ihrem Subnetz dann den Endpunkttyp Microsoft.Sql zu. Schließlich fügt das Skript Ihr Subnetz zur Zugriffssteuerungsliste hinzu, wodurch eine Regel erstellt wird.
Quellcode von PowerShell-Skript 3
######### Script 3 ########################################
## Create your virtual network, and give it a subnet. ##
###########################################################
Write-Host "Define a subnet '$SubnetName', to be given soon to a virtual network."
$subnetParams = @{
Name = $SubnetName
AddressPrefix = $SubnetAddressPrefix
ServiceEndpoint = $ServiceEndpointTypeName_SqlDb
}
$subnet = New-AzVirtualNetworkSubnetConfig @subnetParams
Write-Host "Create a virtual network '$VNetName'.`nGive the subnet to the virtual network that we created."
$vnetParams = @{
Name = $VNetName
AddressPrefix = $VNetAddressPrefix
Subnet = $subnet
ResourceGroupName = $ResourceGroupName
Location = $Region
}
$vnet = New-AzVirtualNetwork @vnetParams
###########################################################
## Create a Virtual Service endpoint on the subnet. ##
###########################################################
Write-Host "Assign a Virtual Service endpoint 'Microsoft.Sql' to the subnet."
$vnetSubParams = @{
Name = $SubnetName
AddressPrefix = $SubnetAddressPrefix
VirtualNetwork = $vnet
ServiceEndpoint = $ServiceEndpointTypeName_SqlDb
}
$vnet = Set-AzVirtualNetworkSubnetConfig @vnetSubParams
Write-Host "Persist the updates made to the virtual network > subnet."
$vnet = Set-AzVirtualNetwork -VirtualNetwork $vnet
$vnet.Subnets[0].ServiceEndpoints # Display the first endpoint.
###########################################################
## Add the Virtual Service endpoint Id as a rule, ##
## into SQL Database ACLs. ##
###########################################################
Write-Host "Get the subnet object."
$vnet = Get-AzVirtualNetwork -ResourceGroupName $ResourceGroupName -Name $VNetName
$subnet = Get-AzVirtualNetworkSubnetConfig -Name $SubnetName -VirtualNetwork $vnet
Write-Host "Add the subnet .Id as a rule, into the ACLs for your server."
$ruleParams = @{
ResourceGroupName = $ResourceGroupName
ServerName = $SqlDbServerName
VirtualNetworkRuleName = $VNetRuleName
VirtualNetworkSubnetId = $subnet.Id
}
New-AzSqlServerVirtualNetworkRule @ruleParams
Write-Host "Verify that the rule is in the SQL Database ACL."
$rule2Params = @{
ResourceGroupName = $ResourceGroupName
ServerName = $SqlDbServerName
VirtualNetworkRuleName = $VNetRuleName
}
Get-AzSqlServerVirtualNetworkRule @rule2Params
Write-Host 'Completed script 3, the "Virtual-Network-Rule".'
Skript 4: Bereinigung
Dieses abschließende Skript löscht die Ressourcen, die das vorherige Skript zur Veranschaulichung erstellt hat. Das Skript fordert Sie jedoch zur Bestätigung auf, bevor Folgendes gelöscht wird:
- Logischer SQL-Server
- Azure-Ressourcengruppe
Sie können Skript 4 jederzeit nach dem Abschluss von Skript 1 ausführen.
Quellcode von PowerShell-Skript 4
######### Script 4 ########################################
## Clean-up phase A: Unconditional deletes. ##
## ##
## 1. The test rule is deleted from SQL Database ACL. ##
## 2. The test endpoint is deleted from the subnet. ##
## 3. The test virtual network is deleted. ##
###########################################################
Write-Host "Delete the rule from the SQL Database ACL."
$removeParams = @{
ResourceGroupName = $ResourceGroupName
ServerName = $SqlDbServerName
VirtualNetworkRuleName = $VNetRuleName
ErrorAction = 'SilentlyContinue'
}
Remove-AzSqlServerVirtualNetworkRule @removeParams
Write-Host "Delete the endpoint from the subnet."
$vnet = Get-AzVirtualNetwork -ResourceGroupName $ResourceGroupName -Name $VNetName
Remove-AzVirtualNetworkSubnetConfig -Name $SubnetName -VirtualNetwork $vnet
Write-Host "Delete the virtual network (thus also deletes the subnet)."
$removeParams = @{
Name = $VNetName
ResourceGroupName = $ResourceGroupName
ErrorAction = 'SilentlyContinue'
}
Remove-AzVirtualNetwork @removeParams
###########################################################
## Clean-up phase B: Conditional deletes. ##
## ##
## These might have already existed, so user might ##
## want to keep. ##
## ##
## 1. Logical SQL server ##
## 2. Azure resource group ##
###########################################################
$yesno = Read-Host 'CAUTION !: Do you want to DELETE your server AND your resource group? [yes/no]'
if ('yes' -eq $yesno) {
Write-Host "Remove the server."
$removeParams = @{
ServerName = $SqlDbServerName
ResourceGroupName = $ResourceGroupName
ErrorAction = 'SilentlyContinue'
}
Remove-AzSqlServer @removeParams
Write-Host "Remove the Azure Resource Group."
Remove-AzResourceGroup -Name $ResourceGroupName -ErrorAction SilentlyContinue
} else {
Write-Host "Skipped over the DELETE of SQL Database and resource group."
}
Write-Host 'Completed script 4, the "Clean-Up".'
Überprüfen, dass Ihr Subnetz ein Endpunkt ist
Wenn Ihr Subnetz bereits zum Typnamen Microsoft.Sql zugewiesen wurde, ist dieses bereits ein virtueller Dienstendpunkt. Sie können das Azure-Portal verwenden, um eine VNET-Regel für den Endpunkt zu erstellen.
Falls Sie nicht sicher sind, ob Ihr Subnetz über den Typnamen Microsoft.Sql verfügt, führen Sie folgendes PowerShell-Skript aus, um diese Aktionen durchzuführen:
- Ermitteln, ob das Subnetz über den Typnamen Microsoft.Sql verfügt.
- Zuweisen des Typnamens, wenn dieser nicht vorhanden ist (optional).
- Das Skript fordert Sie zur Bestätigung auf, bevor der fehlende Typname angewendet wird.
Phasen des Skripts
Im Folgenden finden Sie die Phasen des PowerShell-Skripts:
- Melden Sie sich bei Ihrem Azure-Konto an. Dies ist nur einmal pro PowerShell-Sitzung nötig. Weisen Sie die Variablen zu.
- Suchen Sie Ihr virtuelles Netzwerk und dann Ihr Subnetz.
- Ist Ihr Subnetz als Microsoft.Sql-Endpunktservertyp markiert?
- Fügen Sie Ihrem Subnetz einen virtuellen Dienstendpunkt des Typnamens Microsoft.Sql zu.
Wichtig
Bevor Sie dieses Skript ausführen, müssen Sie die Werte bearbeiten, die den $-Variablen am Anfang des Skripts zugewiesen sind.
Direkter PowerShell-Quellcode
In diesem PowerShell-Skript werden keine Aktualisierungen vorgenommen, es sei denn, Sie antworten mit „Ja“, wenn Sie zur Bestätigung aufgefordert werden. Das Skript kann den Typnamen Microsoft.Sql zu Ihrem Subnetz hinzufügen. Das Skript versucht dies jedoch nur, wenn das Subnetz keinen Typnamen besitzt.
### 1. LOG into to your Azure account, needed only once per PS session. Assign variables.
$yesno = Read-Host 'Do you need to log into Azure (only one time per powershell.exe session)? [yes/no]'
if ('yes' -eq $yesno) { Connect-AzAccount }
# Assignments to variables used by the later scripts.
# You can EDIT these values, if necessary.
$SubscriptionName = 'yourSubscriptionName'
Select-AzSubscription -SubscriptionName "$SubscriptionName"
$ResourceGroupName = 'yourRGName'
$VNetName = 'yourVNetName'
$SubnetName = 'yourSubnetName'
$SubnetAddressPrefix = 'Obtain this value from the Azure portal.' # Looks roughly like: '10.0.0.0/24'
$ServiceEndpointTypeName_SqlDb = 'Microsoft.Sql' # Do NOT edit. Is official value.
### 2. Search for your virtual network, and then for your subnet.
# Search for the virtual network.
$vnet = $null
$vnet = Get-AzVirtualNetwork -ResourceGroupName $ResourceGroupName -Name $VNetName
if ($vnet -eq $null) {
Write-Host "Caution: No virtual network found by the name '$VNetName'."
return
}
$subnet = $null
for ($nn = 0; $nn -lt $vnet.Subnets.Count; $nn++) {
$subnet = $vnet.Subnets[$nn]
if ($subnet.Name -eq $SubnetName) { break }
$subnet = $null
}
if ($null -eq $subnet) {
Write-Host "Caution: No subnet found by the name '$SubnetName'"
Return
}
### 3. Is your subnet tagged as 'Microsoft.Sql' endpoint server type?
$endpointMsSql = $null
for ($nn = 0; $nn -lt $subnet.ServiceEndpoints.Count; $nn++) {
$endpointMsSql = $subnet.ServiceEndpoints[$nn]
if ($endpointMsSql.Service -eq $ServiceEndpointTypeName_SqlDb) {
$endpointMsSql
break
}
$endpointMsSql = $null
}
if ($null -eq $endpointMsSql) {
Write-Host "Good: Subnet found, and is already tagged as an endpoint of type '$ServiceEndpointTypeName_SqlDb'."
return
} else {
Write-Host "Caution: Subnet found, but not yet tagged as an endpoint of type '$ServiceEndpointTypeName_SqlDb'."
# Ask the user for confirmation.
$yesno = Read-Host 'Do you want the PS script to apply the endpoint type name to your subnet? [yes/no]'
if ('no' -eq $yesno) { return }
}
### 4. Add a Virtual Service endpoint of type name 'Microsoft.Sql', on your subnet.
$setParams = @{
Name = $SubnetName
AddressPrefix = $SubnetAddressPrefix
VirtualNetwork = $vnet
ServiceEndpoint = $ServiceEndpointTypeName_SqlDb
}
$vnet = Set-AzVirtualNetworkSubnetConfig @setParams
# Persist the subnet update.
$vnet = Set-AzVirtualNetwork -VirtualNetwork $vnet
for ($nn = 0; $nn -lt $vnet.Subnets.Count; $nn++) {
$vnet.Subnets[0].ServiceEndpoints # Display.
}