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:

  1. Vytvoří ve vaší podsíti koncový bod virtuální služby Microsoft Azure.
  2. 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.

Zpropitné

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ě":

  1. New-AzVirtualNetworkSubnetConfig: Vytvoří objekt podsítě.
  2. New-AzVirtualNetwork: Vytvoří vaši virtuální síť a poskytne jí podsíť.
  3. Set-AzVirtualNetworkSubnetConfig: Přiřadí koncový bod virtuální služby k podsíti.
  4. Set-AzVirtualNetwork: Zachová aktualizace provedené ve vaší virtuální síti.
  5. 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:

  1. Zkontrolujte, jestli má vaše podsíť název typu Microsoft.Sql .
  2. 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:

  1. 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é.
  2. Vyhledejte virtuální síť a pak zadejte podsíť.
  3. Je vaše podsíť označená jako typ serveru koncového bodu Microsoft.Sql ?
  4. 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.
}