Delen via


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:

  1. Hiermee maakt u een Microsoft Azure Virtual Service-eindpunt op uw subnet.
  2. 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':

  1. New-AzVirtualNetworkSubnetConfig: Hiermee maakt u een subnetobject.
  2. New-AzVirtualNetwork: Hiermee maakt u uw virtuele netwerk, waardoor het subnet wordt gegeven.
  3. Set-AzVirtualNetworkSubnetConfig: Wijst een virtueel service-eindpunt toe aan uw subnet.
  4. Set-AzVirtualNetwork: Bewaart updates die zijn aangebracht in uw virtuele netwerk.
  5. 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:

  1. Controleer of uw subnet de naam van het Microsoft.Sql-type heeft.
  2. 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:

  1. Meld u aan bij uw Azure-account, die slechts eenmaal per PS-sessie nodig is. Variabelen toewijzen.
  2. Zoek naar uw virtuele netwerk en vervolgens naar uw subnet.
  3. Is uw subnet gelabeld als servertype Microsoft.Sql-eindpunt ?
  4. 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.
}