PowerShell: Virtuális szolgáltatásvégpont és virtuális hálózati szabály létrehozása az Azure SQL Database-hez

A következőre vonatkozik: Azure SQL Database

A virtuális hálózati szabályok egy tűzfalbiztonsági funkció, amely azt szabályozza, hogy az Azure SQL Database-adatbázisok, rugalmas készletek vagy azure Synapse-adatbázisok logikai SQL-kiszolgálója fogadja-e a virtuális hálózatok bizonyos alhálózataiból küldött kommunikációt.

Fontos

Ez a cikk az Azure SQL Database-re vonatkozik, beleértve az Azure Synapse-t (korábban SQL DW). Az egyszerűség kedvéért a jelen cikkben szereplő Azure SQL Database kifejezés az Azure SQL Database-hez vagy az Azure Synapse-hoz tartozó adatbázisokra vonatkozik. Ez a cikk nem vonatkozik a felügyelt Azure SQL-példányra, mert nincs hozzá társított szolgáltatásvégpont.

Ez a cikk egy PowerShell-szkriptet mutat be, amely a következő műveleteket hajtja végre:

  1. Létrehoz egy Microsoft Azure Virtual Service-végpontot az alhálózaton.
  2. Hozzáadja a végpontot a kiszolgáló tűzfalához egy virtuális hálózati szabály létrehozásához.

További háttérért tekintse meg az Azure SQL Database virtuális szolgáltatásvégpontjait.

Tipp

Ha csak az Azure SQL Database virtuális szolgáltatásvégponttípus-nevének felmérésére vagy hozzáadására van szüksége az alhálózathoz, ugorjon tovább a közvetlenebb PowerShell-szkriptre.

Megjegyzés:

Ez a cikk az Azure Az PowerShell-modult használja, amely az Azure-ral való interakcióhoz ajánlott PowerShell-modul. Az Az PowerShell-modul használatának megkezdéséhez lásd az Azure PowerShell telepítését ismertető szakaszt. Az Az PowerShell-modulra történő migrálás részleteiről lásd: Az Azure PowerShell migrálása az AzureRM modulból az Az modulba.

Fontos

A PowerShell Azure Resource Manager modult továbbra is támogatja az Azure SQL Database, de minden jövőbeli fejlesztés a Az.Sql parancsmagok számára történik. A régebbi modulhoz lásd az AzureRM.Sql-t. Az Az modulban és az AzureRm-modulokban található parancsok argumentumai lényegében azonosak.

Fő parancsmagok

Ez a cikk kiemeli a New-AzSqlServerVirtualNetworkRule parancsmagot , amely hozzáadja az alhálózati végpontot a kiszolgáló hozzáférés-vezérlési listájához (ACL), ezáltal létrehoz egy szabályt.

Az alábbi lista a New-AzSqlServerVirtualNetworkRule hívásának előkészítéséhez futtatandó egyéb parancsmagok sorrendjét mutatja. Ebben a cikkben ezek a hívások a 3. szkript "Virtuális hálózati szabály" parancsprogramjában fordulnak elő:

  1. New-AzVirtualNetworkSubnetConfig: Létrehoz egy alhálózati objektumot.
  2. New-AzVirtualNetwork: Létrehozza a virtuális hálózatot, és megadja neki az alhálózatot.
  3. Set-AzVirtualNetworkSubnetConfig: Virtuális szolgáltatásvégpontot rendel az alhálózathoz.
  4. Set-AzVirtualNetwork: Megőrzi a virtuális hálózaton végrehajtott frissítéseket.
  5. New-AzSqlServerVirtualNetworkRule: Miután az alhálózat végponttá vált, virtuális hálózati szabályként hozzáadja az alhálózatot a kiszolgáló ACL-jéhez.
    • Ez a parancsmag az -IgnoreMissingVNetServiceEndpoint paramétert kínálja az Azure RM PowerShell-modul 5.1.1-es verziójától kezdve.

A PowerShell futtatásának előfeltételei

  • Már bejelentkezhet az Azure-ba, például az Azure Portalon keresztül.
  • Már futtathat PowerShell-szkripteket.

Megjegyzés:

Győződjön meg arról, hogy a kiszolgálóhoz hozzáadni kívánt virtuális hálózat/alhálózat szolgáltatásvégpontjai be vannak kapcsolva, ellenkező esetben a virtuális hálózati tűzfalszabály létrehozása sikertelen lesz.

Egy szkript négy darabból áll

Bemutató PowerShell-szkriptünk kisebb szkriptek sorozatára oszlik. Az osztás megkönnyíti a tanulást és rugalmasságot biztosít. A szkripteket a megadott sorrendben kell futtatni. Ha nincs ideje a szkriptek futtatására, a tényleges tesztkimenet a 4. szkript után jelenik meg.

1. szkript: Változók

Ez az első PowerShell-szkript értékeket rendel a változókhoz. A későbbi szkriptek ezektől a változóktól függnek.

Fontos

A szkript futtatása előtt tetszés szerint szerkesztheti az értékeket. Ha például már rendelkezik erőforráscsoporttal, érdemes lehet az erőforráscsoport nevét hozzárendelt értékként szerkeszteni.

Az előfizetés nevét a szkriptbe kell szerkeszteni.

1. PowerShell-szkript forráskódja

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

2. szkript: Előfeltételek

Ez a szkript előkészíti a következő szkriptet, amelyben a végpontművelet található. Ez a szkript a következő felsorolt elemeket hozza létre Önnek, de csak akkor, ha még nem léteznek. Kihagyhatja a 2. szkriptet, ha biztos benne, hogy ezek az elemek már léteznek:

  • Azure-erőforráscsoport
  • Logikai SQL-kiszolgáló

PowerShell-szkript 2. forráskódja

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

3. szkript: Végpont és szabály létrehozása

Ez a szkript létrehoz egy virtuális hálózatot egy alhálózattal. Ezután a szkript hozzárendeli a Microsoft.Sql végponttípust az alhálózathoz. Végül a szkript hozzáadja az alhálózatot a hozzáférés-vezérlési listához (ACL), ezzel létrehozva egy szabályt.

PowerShell-szkript 3-as forráskódja

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

4. szkript: Törlés

Ez az utolsó szkript törli azokat az erőforrásokat, amelyeket az előző szkriptek hoztak létre a bemutatóhoz. A szkript azonban megerősítést kér, mielőtt törli a következőket:

  • Logikai SQL-kiszolgáló
  • Azure-erőforráscsoport

Az 1. szkript befejezése után bármikor futtathatja a 4. szkriptet.

PowerShell-szkript 4 forráskódja

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

Annak ellenőrzése, hogy az alhálózat végpont-e

Lehet, hogy rendelkezik egy alhálózattal, amely már hozzárendelte a Microsoft.Sql típusnevet, ami azt jelenti, hogy már virtuális szolgáltatásvégpont. Az Azure Portal használatával létrehozhat egy virtuális hálózati szabályt a végpontról.

Vagy lehet, hogy nem biztos abban, hogy az alhálózat microsoft.sql típusnévvel rendelkezik-e. A következő PowerShell-szkript futtatásával hajthatja végre ezeket a műveleteket:

  1. Ellenőrizze, hogy az alhálózat rendelkezik-e a Microsoft.Sql típusnévvel.
  2. Ha hiányzik, rendelje hozzá a típusnevet.
    • A szkript kéri, hogy erősítse meg, mielőtt alkalmazza a hiányzó típusnevet.

A szkript fázisai

A PowerShell-szkript fázisai a következők:

  1. Jelentkezzen be az Azure-fiókjába, amire PS-munkamenetenként csak egyszer van szükség. Változók hozzárendelése.
  2. Keresse meg a virtuális hálózatot, majd az alhálózatot.
  3. Az alhálózat Microsoft.Sql-végpontkiszolgáló-típusként van megjelölve?
  4. Adjon hozzá egy Microsoft.Sql nevű virtuálisszolgáltatás-végpontot az alhálózaton.

Fontos

A szkript futtatása előtt szerkesztenie kell a $-változókhoz rendelt értékeket a szkript tetején.

Közvetlen PowerShell-forráskód

Ez a PowerShell-szkript nem frissít semmit, hacsak nem válaszol igennel, ha megerősítést kér. A szkript hozzáadhatja a Microsoft.Sql típusnevet az alhálózathoz. A szkript azonban csak akkor próbálja meg a hozzáadást, ha az alhálózat nem rendelkezik a típusnévvel.

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