PowerShell: Skapa en virtuell tjänstslutpunkt och en VNet-regel för Azure SQL Database

Gäller för:Azure SQL Database

Regler för virtuella nätverk är en brandväggssäkerhetsfunktion som styr om den logiska SQL-servern för dina Azure SQL Database-databaser , elastiska pooler eller databaser i Azure Synapse accepterar kommunikation som skickas från vissa undernät i virtuella nätverk.

Viktigt!

Den här artikeln gäller för Azure SQL Database, inklusive Azure Synapse (tidigare SQL DW). För enkelhetens skull gäller termen Azure SQL Database i den här artikeln för databaser som tillhör antingen Azure SQL Database eller Azure Synapse. Den här artikeln gäller inte för Azure SQL Managed Instance eftersom den inte har någon associerad tjänstslutpunkt.

Den här artikeln visar ett PowerShell-skript som utför följande åtgärder:

  1. Skapar en Microsoft Azure Virtual Service-slutpunkt i undernätet.
  2. Lägger till slutpunkten i serverns brandvägg för att skapa en regel för virtuellt nätverk.

Mer bakgrund finns i Virtual Service-slutpunkter för Azure SQL Database.

Dricks

Om allt du behöver är att utvärdera eller lägga till namnet på den virtuella tjänstens slutpunktstyp för Azure SQL Database i undernätet kan du gå vidare till vårt mer direkta PowerShell-skript.

Kommentar

Den här artikeln använder Azure Az PowerShell-modulen, som är den rekommenderade PowerShell-modulen för interaktion med Azure. För att komma igång med Az PowerShell kan du läsa artikeln om att installera Azure PowerShell. Information om hur du migrerar till Az PowerShell-modulen finns i artikeln om att migrera Azure PowerShell från AzureRM till Az.

Viktigt!

PowerShell Azure Resource Manager-modulen stöds fortfarande av Azure SQL Database, men all framtida utveckling gäller för Az.Sql cmdletarna. Den äldre modulen finns i AzureRM.Sql. Argumenten för kommandona i Az-modulen och i AzureRm-modulerna är väsentligen identiska.

Större cmdletar

I den här artikeln betonas cmdleten New-AzSqlServerVirtualNetworkRule som lägger till undernätsslutpunkten i åtkomstkontrollistan (ACL) på servern, vilket skapar en regel.

I följande lista visas sekvensen med andra större cmdletar som du måste köra för att förbereda för ditt anrop till New-AzSqlServerVirtualNetworkRule. I den här artikeln sker dessa anrop i skript 3 "Regel för virtuellt nätverk":

  1. New-AzVirtualNetworkSubnetConfig: Skapar ett undernätsobjekt.
  2. New-AzVirtualNetwork: Skapar ditt virtuella nätverk, vilket ger det undernätet.
  3. Set-AzVirtualNetworkSubnetConfig: Tilldelar en virtuell tjänstslutpunkt till ditt undernät.
  4. Set-AzVirtualNetwork: Bevarar uppdateringar som gjorts i ditt virtuella nätverk.
  5. New-AzSqlServerVirtualNetworkRule: När ditt undernät är en slutpunkt lägger du till ditt undernät som en regel för virtuellt nätverk i serverns ACL.
    • Den här cmdleten Erbjuder parametern -IgnoreMissingVNetServiceEndpoint, med början i Azure RM PowerShell-modul version 5.1.1.

Förutsättningar för att köra PowerShell

  • Du kan redan logga in på Azure, till exempel via Azure-portalen.
  • Du kan redan köra PowerShell-skript.

Kommentar

Kontrollera att tjänstslutpunkterna är aktiverade för det virtuella nätverk/undernät som du vill lägga till på servern, annars misslyckas skapande av brandväggsregeln för virtuella nätverk.

Ett skript indelat i fyra segment

Vårt PowerShell-demonstrationsskript är indelat i en sekvens med mindre skript. Divisionen underlättar inlärningen och ger flexibilitet. Skripten måste köras i sin angivna sekvens. Om du inte har tid att köra skripten nu visas våra faktiska testutdata efter skript 4.

Skript 1: Variabler

Det första PowerShell-skriptet tilldelar värden till variabler. De efterföljande skripten beror på dessa variabler.

Viktigt!

Innan du kör det här skriptet kan du redigera värdena om du vill. Om du till exempel redan har en resursgrupp kanske du vill redigera resursgruppens namn som det tilldelade värdet.

Ditt prenumerationsnamn ska redigeras i skriptet.

PowerShell-skript 1-källkod

######### 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: Förutsättningar

Det här skriptet förbereder för nästa skript, där slutpunktsåtgärden är. Det här skriptet skapar följande objekt i listan, men bara om de inte redan finns. Du kan hoppa över skript 2 om du är säker på att dessa objekt redan finns:

  • Azure-resursgrupp
  • Logisk SQL Server

PowerShell-skript 2-källkod

######### 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: Skapa en slutpunkt och en regel

Det här skriptet skapar ett virtuellt nätverk med ett undernät. Sedan tilldelar skriptet slutpunktstypen Microsoft.Sql till undernätet. Slutligen lägger skriptet till ditt undernät i åtkomstkontrollistan (ACL) och skapar därmed en regel.

PowerShell-skript 3-källkod

######### 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: Rensa

Det här sista skriptet tar bort de resurser som tidigare skript skapade för demonstrationen. Skriptet ber dock om bekräftelse innan det tar bort följande:

  • Logisk SQL Server
  • Azure-resursgrupp

Du kan köra skript 4 när som helst när skript 1 har slutförts.

PowerShell-skript 4-källkod

######### 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".'

Kontrollera att ditt undernät är en slutpunkt

Du kan ha ett undernät som redan har tilldelats namnet på typen Microsoft.Sql , vilket innebär att det redan är en virtuell tjänstslutpunkt. Du kan använda Azure-portalen för att skapa en regel för virtuellt nätverk från slutpunkten.

Eller så kan du vara osäker på om ditt undernät har namnet på Typen Microsoft.Sql . Du kan köra följande PowerShell-skript för att utföra dessa åtgärder:

  1. Kontrollera om undernätet har namnet på Microsoft.Sql-typen .
  2. Du kan också tilldela typnamnet om det saknas.
    • Skriptet ber dig att bekräfta innan det tillämpar namnet på den frånvarande typen.

Faser i skriptet

Här är faserna i PowerShell-skriptet:

  1. Logga in på ditt Azure-konto, som bara behövs en gång per PS-session. Tilldela variabler.
  2. Sök efter ditt virtuella nätverk och leta sedan efter ditt undernät.
  3. Är ditt undernät taggat som Microsoft.Sql-slutpunktsservertyp ?
  4. Lägg till en virtuell tjänstslutpunkt med typnamnet Microsoft.Sql i undernätet.

Viktigt!

Innan du kör det här skriptet måste du redigera de värden som tilldelats till $-variablerna, längst upp i skriptet.

Direct PowerShell-källkod

Det här PowerShell-skriptet uppdaterar ingenting, såvida du inte svarar ja om du uppmanas att bekräfta det. Skriptet kan lägga till typnamnet Microsoft.Sql i undernätet. Men skriptet försöker bara lägga till om undernätet saknar typnamnet.

### 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.
}