PowerShell : Créer un point de terminaison de service virtuel et une règle de réseau virtuel pour Azure SQL Database
S’applique à :Azure SQL Database
Les règles de réseau virtuel constituent une fonctionnalité de sécurité du pare-feu. Elles permettent de déterminer si le serveur SQL logique de vos bases de données Azure SQL Database, de vos pools élastiques ou de vos bases de données Azure Synapse doit accepter les communications provenant de sous-réseaux spécifiques de réseaux virtuels.
Important
Cet article s’applique à Azure SQL Database ainsi qu’à Azure Synapse (anciennement SQL DW). Par souci de simplicité, le terme Azure SQL Database dans cet article s’applique aux bases de données appartenant à Azure SQL Database ou Azure Synapse. Cet article ne s’applique pas à Azure SQL Managed Instance, car aucun point de terminaison de service ne lui est associé.
Cet article présente un script PowerShell qui effectue les actions suivantes :
- Crée un point de terminaison de service virtuel Microsoft Azure sur votre sous-réseau.
- Ajoute le point de terminaison au pare-feu de votre serveur afin de créer une règle de réseau virtuel.
Pour plus d’informations, consultez Points de terminaison de service virtuel pour Azure SQL Database.
Conseil
Si vous devez uniquement évaluer ou ajouter le point de terminaison de service virtuel nom de type pour Azure SQL Database à votre sous-réseau, vous pouvez passer directement à notre script PowerShell plus direct.
Notes
Cet article utilise le module Azure Az PowerShell, qui est le module PowerShell recommandé pour interagir avec Azure. Pour démarrer avec le module Az PowerShell, consulter Installer Azure PowerShell. Pour savoir comment migrer vers le module Az PowerShell, consultez Migrer Azure PowerShell depuis AzureRM vers Az.
Important
Le module PowerShell Azure Resource Manager (AzureRM) a été déconseillé le 29 février 2024. Tout le développement futur doit utiliser le module Az.Sql. Les utilisateurs sont invités à migrer d’AzureRM vers le module Az PowerShell pour garantir une prise en charge et des mises à jour continues. Le module AzureRM n’est plus géré ou pris en charge. Les arguments des commandes dans le module Az PowerShell et dans les modules AzureRM sont sensiblement identiques. Pour plus d’informations sur leur compatibilité, consultez Présentation du nouveau module Az PowerShell.
Principales applets de commande
Cet article se concentre sur la cmdlet New-AzSqlServerVirtualNetworkRule qui ajoute le point de terminaison de sous-réseau à la liste de contrôle d’accès (ACL, access-control list) de votre serveur, créant ainsi une règle.
La liste suivante montre la séquence des autres principales applets de commande que vous devez exécuter pour préparer votre appel à New-AzSqlServerVirtualNetworkRule
Dans cet article, ces appels se produisent dans le script 3 « Règle de réseau virtuel » :
- New-AzVirtualNetworkSubnetConfig : crée un objet sous-réseau.
- New-AzVirtualNetwork : crée votre réseau virtuel et lui attribue le sous-réseau.
- Set-AzVirtualNetworkSubnetConfig : assigne un point de terminaison de service virtuel à votre sous-réseau.
- Set-AzVirtualNetwork : permet de conserver les mises à jour apportées à votre réseau virtuel.
- New-AzSqlServerVirtualNetworkRule : lorsque votre sous-réseau devient un point de terminaison, il est ajouté en tant que règle de réseau virtuel à l’ACL de votre serveur.
- Cette applet de commande offre le paramètre
-IgnoreMissingVNetServiceEndpoint
.
- Cette applet de commande offre le paramètre
Prérequis pour l’exécution de PowerShell
- Vous pouvez déjà vous connecter à Azure, par exemple par le biais du Portail Azure.
- Vous pouvez déjà exécuter des scripts PowerShell.
Notes
Assurez-vous que les points de terminaison de service sont activés pour le réseau virtuel/sous-réseau que vous voulez ajouter à votre serveur, sans quoi la création de la règle de pare-feu de réseau virtuel échoue.
Un script est divisé en quatre parties
Notre script PowerShell de démonstration est divisé en une séquence de scripts plus petits. La division facilite l’apprentissage et offre plus de souplesse. Les scripts doivent être exécutés dans la séquence indiquée. Si vous n’avez pas le temps d’exécuter les scripts maintenant, nos résultats de test réels sont affichés après le script 4.
Script 1 : Variables
Ce premier script PowerShell attribue des valeurs aux variables. Les scripts suivants dépendent de ces variables.
Important
Avant d’exécuter ce script, vous pouvez modifier les valeurs, si vous le souhaitez. Par exemple, si vous disposez déjà d’un groupe de ressources, vous pouvez remplacer le nom de votre groupe de ressources par la valeur attribuée.
Le nom de votre abonnement doit être modifié dans le script.
Code source du script PowerShell 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".'
Script 2 : Prérequis
Ce script prépare le script suivant, où se déroule l’action du point de terminaison. Ce script crée pour vous les éléments suivants, mais uniquement s’ils n’existent pas déjà. Vous pouvez ignorer le script 2 si vous êtes sûr que ces éléments existent déjà :
- Groupe de ressources Azure
- Serveur SQL logique
Code source du script PowerShell 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".'
Script 3 : Créer un point de terminaison et une règle
Ce script crée un réseau virtuel avec un sous-réseau. Ensuite, le script affecte le type de point de terminaison Microsoft.Sql
à votre sous-réseau. Enfin, le script ajoute votre sous-réseau à l’ACL, créant ainsi une règle.
Code source du script PowerShell 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".'
Script 4 : Nettoyage
Ce dernier script supprime les ressources que les scripts précédents ont créées pour la démonstration. Toutefois, le script vous demande de confirmer la suppression des éléments suivants :
- Serveur logique Azure SQL
- Groupe de ressources Azure
Une fois le script 1 terminé, vous pouvez exécuter le script 4 à tout moment.
Code source du script PowerShell 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".'
Vérifiez que votre sous-réseau est un point de terminaison
Vous disposez peut-être d’un sous-réseau qui a déjà reçu le nom de type Microsoft.Sql
, ce qui signifie qu’il s’agit déjà d’un point de terminaison de service virtuel. Vous pouvez utiliser le Portail Azure pour créer une règle de réseau virtuel à partir du point de terminaison.
Ou bien, vous ne savez peut-être pas si votre sous-réseau a le nom de type Microsoft.Sql
. Vous pouvez exécuter le script PowerShell suivant pour effectuer ces actions :
- Vérifiez si votre sous-réseau a le nom de type
Microsoft.Sql
. - Attribuez éventuellement le nom de type s’il est absent.
- Le script vous invite à confirmer que le nom de type est absent.
Phases du script
Voici les phases du script PowerShell :
- Connectez-vous à votre compte Azure, nécessaire une seule fois par session PowerShell. Attribuez les variables.
- Recherchez votre réseau virtuel, puis votre sous-réseau.
- Votre sous-réseau est-il marqué comme
Microsoft.Sql
type de serveur de point de terminaison ? - Ajoutez un point de terminaison de service virtuel de type
Microsoft.Sql
, sur votre sous-réseau.
Important
Avant d’exécuter ce script, vous devez modifier les valeurs affectées aux variables $, au début du script.
Code de source PowerShell direct
Ce script PowerShell ne met rien à jour, sauf si vous répondez Oui lorsque PowerShell vous demande confirmation. Le script peut ajouter le nom de type Microsoft.Sql
à votre sous-réseau. Mais le script essaie d’ajouter ce nom de type uniquement si votre sous-réseau n’en dispose pas.
### 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.
}