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:
- Létrehoz egy Microsoft Azure Virtual Service-végpontot az alhálózaton.
- 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 fő 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ő:
- New-AzVirtualNetworkSubnetConfig: Létrehoz egy alhálózati objektumot.
- New-AzVirtualNetwork: Létrehozza a virtuális hálózatot, és megadja neki az alhálózatot.
- Set-AzVirtualNetworkSubnetConfig: Virtuális szolgáltatásvégpontot rendel az alhálózathoz.
- Set-AzVirtualNetwork: Megőrzi a virtuális hálózaton végrehajtott frissítéseket.
- 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:
- Ellenőrizze, hogy az alhálózat rendelkezik-e a Microsoft.Sql típusnévvel.
- 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:
- Jelentkezzen be az Azure-fiókjába, amire PS-munkamenetenként csak egyszer van szükség. Változók hozzárendelése.
- Keresse meg a virtuális hálózatot, majd az alhálózatot.
- Az alhálózat Microsoft.Sql-végpontkiszolgáló-típusként van megjelölve?
- 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.
}