PowerShell: Vytvoření koncového bodu virtuální služby a pravidla virtuální sítě pro Azure SQL Database
Platí pro: Azure SQL Database
Pravidla virtuální sítě jsou jednou funkcí zabezpečení brány firewall, která řídí, jestli logický SQL server pro databáze Azure SQL Database , elastické fondy nebo databáze v Azure Synapse přijímají komunikaci odesílanou z konkrétních podsítí ve virtuálních sítích.
Důležité
Tento článek se týká služby Azure SQL Database, včetně Azure Synapse (dříve SQL DW). Pro zjednodušení se termín Azure SQL Database v tomto článku týká databází patřících do Azure SQL Database nebo Azure Synapse. Tento článek se nevztahuje na spravovanou instanci Azure SQL, protože k ní není přidružený koncový bod služby.
Tento článek ukazuje skript PowerShellu, který provádí následující akce:
- Vytvoří ve vaší podsíti koncový bod virtuální služby Microsoft Azure.
- Přidá koncový bod do brány firewall vašeho serveru a vytvoří pravidlo virtuální sítě.
Další informace najdete v tématu Koncové body virtuální služby pro Azure SQL Database.
Tip
Pokud potřebujete jen posoudit nebo přidat název typu koncového bodu virtuální služby pro Azure SQL Database do vaší podsítě, můžete přeskočit k našemu přímějšímu skriptu PowerShellu.
Poznámka:
Tento článek používá modul Azure Az PowerShell, což je doporučený modul PowerShellu pro interakci s Azure. Pokud chcete začít s modulem Az PowerShell, projděte si téma věnované instalaci Azure PowerShellu. Informace o tom, jak migrovat na modul Az PowerShell, najdete v tématu Migrace Azure PowerShellu z AzureRM na Az.
Důležité
Modul Azure Resource Manager v PowerShellu je stále podporovaný službou Azure SQL Database, ale veškerý budoucí vývoj je určený pro Az.Sql
rutiny. Starší modul najdete v tématu AzureRM.Sql. Argumenty pro příkazy v modulu Az a v modulech AzureRm jsou podstatně identické.
Hlavní rutiny
Tento článek zdůrazňuje rutinu New-AzSqlServerVirtualNetworkRule, která přidá koncový bod podsítě do seznamu řízení přístupu (ACL) vašeho serveru, čímž se vytvoří pravidlo.
Následující seznam ukazuje posloupnost dalších hlavních rutin, které musíte spustit, abyste se připravili na volání Rutiny New-AzSqlServerVirtualNetworkRule. V tomto článku se tato volání vyskytují ve skriptu 3 "Pravidlo virtuální sítě":
- New-AzVirtualNetworkSubnetConfig: Vytvoří objekt podsítě.
- New-AzVirtualNetwork: Vytvoří vaši virtuální síť a poskytne jí podsíť.
- Set-AzVirtualNetworkSubnetConfig: Přiřadí koncový bod virtuální služby k podsíti.
- Set-AzVirtualNetwork: Zachová aktualizace provedené ve vaší virtuální síti.
- New-AzSqlServerVirtualNetworkRule: Jakmile je podsíť koncovým bodem, přidá podsíť jako pravidlo virtuální sítě do seznamu ACL vašeho serveru.
- Tato rutina nabízí parametr -IgnoreMissingVNetServiceEndpoint počínaje modulem Azure RM PowerShell verze 5.1.1.
Předpoklady pro spuštění PowerShellu
- K Azure se už můžete přihlásit, například prostřednictvím webu Azure Portal.
- Skripty PowerShellu už můžete spustit.
Poznámka:
Ujistěte se, že jsou pro virtuální síť nebo podsíť, kterou chcete přidat na server, zapnuté koncové body služby, jinak se vytvoření pravidla brány firewall virtuální sítě nezdaří.
Jeden skript rozdělený na čtyři bloky dat
Náš ukázkový skript PowerShellu je rozdělený do posloupnosti menších skriptů. Dělení usnadňuje učení a poskytuje flexibilitu. Skripty musí být spuštěny v jejich označené sekvenci. Pokud teď nemáte čas spustit skripty, zobrazí se náš skutečný výstup testu za skriptem 4.
Skript 1: Proměnné
Tento první skript PowerShellu přiřadí hodnoty proměnným. Následující skripty závisí na těchto proměnných.
Důležité
Před spuštěním tohoto skriptu můžete hodnoty upravit, pokud chcete. Pokud už například máte skupinu prostředků, můžete upravit název skupiny prostředků jako přiřazenou hodnotu.
Název vašeho předplatného by se měl upravit do skriptu.
Zdrojový kód skriptu PowerShellu 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: Požadavky
Tento skript se připraví na další skript, kde je akce koncového bodu. Tento skript vytvoří pro vás následující uvedené položky, ale pouze pokud ještě neexistují. Skript 2 můžete přeskočit, pokud jste si jistí, že tyto položky už existují:
- Skupina zdrojů Azure
- Logický SQL server
Zdrojový kód powershellového skriptu 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: Vytvoření koncového bodu a pravidla
Tento skript vytvoří virtuální síť s podsítí. Pak skript přiřadí typ koncového bodu Microsoft.Sql k vaší podsíti. Nakonec skript přidá vaši podsíť do seznamu řízení přístupu (ACL), čímž se vytvoří pravidlo.
Zdrojový kód powershellového skriptu 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: Vyčištění
Tento konečný skript odstraní prostředky, které předchozí skripty vytvořily pro ukázku. Skript však před odstraněním požádá o potvrzení:
- Logický SQL server
- Skupina prostředků Azure
Skript můžete spustit 4 kdykoli po dokončení skriptu 1.
Zdrojový kód powershellového skriptu 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".'
Ověření, že je vaše podsíť koncový bod
Možná máte podsíť, která už má přiřazený název typu Microsoft.Sql , což znamená, že už je to koncový bod virtuální služby. Pomocí webu Azure Portal můžete vytvořit pravidlo virtuální sítě z koncového bodu.
Nebo si nejste jistí, jestli má vaše podsíť název typu Microsoft.Sql . Spuštěním následujícího skriptu PowerShellu můžete provést tyto akce:
- Zkontrolujte, jestli má vaše podsíť název typu Microsoft.Sql .
- Volitelně můžete přiřadit název typu, pokud chybí.
- Skript vás požádá o potvrzení, než použije chybějící název typu.
Fáze skriptu
Tady jsou fáze skriptu PowerShellu:
- Přihlaste se ke svému účtu Azure, který je potřeba jenom jednou pro každou relaci PS. Přiřaďte proměnné.
- Vyhledejte virtuální síť a pak zadejte podsíť.
- Je vaše podsíť označená jako typ serveru koncového bodu Microsoft.Sql ?
- Přidejte do podsítě koncový bod virtuální služby s názvem typu Microsoft.Sql.
Důležité
Před spuštěním tohoto skriptu musíte upravit hodnoty přiřazené proměnné $-variables v horní části skriptu.
Přímý zdrojový kód PowerShellu
Tento skript PowerShellu nic neaktualizuje, pokud neodpovíte ano, pokud vás požádá o potvrzení. Skript může do podsítě přidat název typu Microsoft.Sql . Skript se ale pokusí přidat jenom v případě, že podsíť nemá název typu.
### 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.
}