PowerShell: Een virtual service-eindpunt en VNet-regel maken voor Azure SQL Database
Van toepassing op: Azure SQL Database
Regels voor virtuele netwerken zijn één firewallbeveiligingsfunctie waarmee wordt bepaald of de logische SQL-server voor uw Azure SQL Database-databases , elastische pools of databases in Azure Synapse communicatie accepteert die vanuit bepaalde subnetten in virtuele netwerken worden verzonden.
Belangrijk
Dit artikel is van toepassing op Azure SQL Database, waaronder Azure Synapse (voorheen SQL DW). Ter vereenvoudiging is de term Azure SQL Database in dit artikel van toepassing op databases die behoren tot Azure SQL Database of Azure Synapse. Dit artikel is niet van toepassing op Azure SQL Managed Instance omdat er geen service-eindpunt aan is gekoppeld.
In dit artikel wordt een PowerShell-script gedemonstreert dat de volgende acties uitvoert:
- Hiermee maakt u een Microsoft Azure Virtual Service-eindpunt op uw subnet.
- Hiermee voegt u het eindpunt toe aan de firewall van uw server om een regel voor een virtueel netwerk te maken.
Zie Virtual Service-eindpunten voor Azure SQL Database voor meer achtergrondinformatie.
Fooi
Als u alleen de naam van het type virtual service-eindpunt voor Azure SQL Database wilt beoordelen of toevoegen aan uw subnet, kunt u verdergaan met ons directe PowerShell-script.
Notitie
In dit artikel wordt gebruikgemaakt van de Azure Az PowerShell-module. Dit is de aanbevolen PowerShell-module voor interactie met Azure. Raadpleeg Azure PowerShell installeren om aan de slag te gaan met de Az PowerShell-module. Raadpleeg Azure PowerShell migreren van AzureRM naar Az om te leren hoe u naar de Azure PowerShell-module migreert.
Belangrijk
De PowerShell Azure Resource Manager-module wordt nog steeds ondersteund door Azure SQL Database, maar alle toekomstige ontwikkeling is voor de Az.Sql
cmdlets. Zie AzureRM.Sql voor de oudere module. De argumenten voor de opdrachten in de Az-module en in de AzureRm-modules zijn vrijwel identiek.
Primaire cmdlets
In dit artikel wordt de cmdlet New-AzSqlServerVirtualNetworkRule benadrukt waarmee het subneteindpunt wordt toegevoegd aan de toegangsbeheerlijst (ACL) van uw server, waardoor er een regel wordt gemaakt.
In de volgende lijst ziet u de volgorde van andere belangrijke cmdlets die u moet uitvoeren om u voor te bereiden op uw aanroep naar New-AzSqlServerVirtualNetworkRule. In dit artikel vinden deze aanroepen plaats in script 3 'Regel voor virtueel netwerk':
- New-AzVirtualNetworkSubnetConfig: Hiermee maakt u een subnetobject.
- New-AzVirtualNetwork: Hiermee maakt u uw virtuele netwerk, waardoor het subnet wordt gegeven.
- Set-AzVirtualNetworkSubnetConfig: Wijst een virtueel service-eindpunt toe aan uw subnet.
- Set-AzVirtualNetwork: Bewaart updates die zijn aangebracht in uw virtuele netwerk.
- New-AzSqlServerVirtualNetworkRule: Nadat uw subnet een eindpunt is, voegt u uw subnet toe als een regel voor een virtueel netwerk in de ACL van uw server.
- Deze cmdlet biedt de parameter -IgnoreMissingVNetServiceEndpoint, te beginnen in Azure RM PowerShell Module versie 5.1.1.
Vereisten voor het uitvoeren van PowerShell
- U kunt zich al aanmelden bij Azure, bijvoorbeeld via Azure Portal.
- U kunt al PowerShell-scripts uitvoeren.
Notitie
Zorg ervoor dat service-eindpunten zijn ingeschakeld voor het VNet/subnet dat u wilt toevoegen aan uw server, anders mislukt het maken van de VNet-firewallregel.
Eén script onderverdeeld in vier segmenten
Ons PowerShell-demonstratiescript is onderverdeeld in een reeks kleinere scripts. De divisie vereenvoudigt het leren en biedt flexibiliteit. De scripts moeten in de aangegeven volgorde worden uitgevoerd. Als u nu geen tijd hebt om de scripts uit te voeren, wordt de werkelijke testuitvoer weergegeven na script 4.
Script 1: Variabelen
Met dit eerste PowerShell-script worden waarden toegewezen aan variabelen. De volgende scripts zijn afhankelijk van deze variabelen.
Belangrijk
Voordat u dit script uitvoert, kunt u de waarden desgewenst bewerken. Als u bijvoorbeeld al een resourcegroep hebt, kunt u de naam van de resourcegroep bewerken als de toegewezen waarde.
De naam van uw abonnement moet worden bewerkt in het script.
PowerShell-script 1 broncode
######### 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".'
Script 2: Vereisten
Dit script bereidt zich voor op het volgende script, waarbij de eindpuntactie zich bevindt. Dit script maakt voor u de volgende items in de lijst, maar alleen als deze nog niet bestaan. U kunt script 2 overslaan als u zeker weet dat deze items al bestaan:
- Azure-resourcegroep
- Logische SQL-server
PowerShell-script 2-broncode
######### 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".'
Script 3: Een eindpunt en een regel maken
Met dit script maakt u een virtueel netwerk met een subnet. Vervolgens wijst het script het microsoft.Sql-eindpunttype toe aan uw subnet. Ten slotte voegt het script uw subnet toe aan de toegangsbeheerlijst (ACL), waardoor er een regel wordt gemaakt.
PowerShell-script 3 broncode
######### 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".'
Script 4: Opschonen
Met dit laatste script worden de resources verwijderd die door de vorige scripts zijn gemaakt voor de demonstratie. Het script vraagt echter om bevestiging voordat het het volgende verwijdert:
- Logische SQL-server
- Azure-resourcegroep
U kunt script 4 op elk gewenst moment uitvoeren nadat script 1 is voltooid.
PowerShell-script 4-broncode
######### 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".'
Controleer of uw subnet een eindpunt is
Mogelijk hebt u een subnet waaraan de microsoft.Sql-typenaam al is toegewezen, wat betekent dat het al een virtueel service-eindpunt is. U kunt Azure Portal gebruiken om een regel voor een virtueel netwerk te maken vanaf het eindpunt.
Of misschien weet u niet zeker of uw subnet de naam van het Microsoft.Sql-type heeft. U kunt het volgende PowerShell-script uitvoeren om deze acties uit te voeren:
- Controleer of uw subnet de naam van het Microsoft.Sql-type heeft.
- Wijs desgewenst de typenaam toe als deze afwezig is.
- Het script vraagt u te bevestigen voordat de naam van het afwezige type wordt toegepast.
Fasen van het script
Dit zijn de fasen van het PowerShell-script:
- Meld u aan bij uw Azure-account, die slechts eenmaal per PS-sessie nodig is. Variabelen toewijzen.
- Zoek naar uw virtuele netwerk en vervolgens naar uw subnet.
- Is uw subnet gelabeld als servertype Microsoft.Sql-eindpunt ?
- Voeg een virtueel service-eindpunt van het type Microsoft.Sql toe aan uw subnet.
Belangrijk
Voordat u dit script uitvoert, moet u de waarden bewerken die zijn toegewezen aan de $-variables, boven aan het script.
Direct PowerShell-broncode
Dit PowerShell-script werkt niets bij, tenzij u ja reageert als u om bevestiging wordt gevraagd. Het script kan de typenaam Microsoft.Sql toevoegen aan uw subnet. Maar het script probeert de add alleen als uw subnet de naam van het type ontbreekt.
### 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.
}