Compartir a través de


PowerShell: Creación de una regla de red virtual y un punto de conexión de servicio virtual para Azure SQL Database

Se aplica a:Azure SQL Database

Las reglas de red virtual son una característica de firewall que controla si el servidor SQL lógico de las bases de datos de Azure SQL Database, así como los grupos elásticos o las bases de datos de Azure Synapse aceptan las comunicaciones que se envían desde subredes específicas de redes virtuales.

Importante

Este artículo se aplica a Azure SQL Database, incluido Azure Synapse (anteriormente SQL SW). En pocas palabras, el término Azure SQL Database en este artículo se aplica a las bases de datos que pertenecen a Azure SQL Database o a Azure Synapse. En cambio, este artículo no se aplica a la instancia administrada de Azure SQL, ya que no tiene un punto de conexión de servicio asociado a ella.

En este artículo se muestra un script de PowerShell que realiza las siguientes acciones:

  1. Crea un punto de conexión de servicio virtual de Microsoft Azure en la subred.
  2. Agrega el punto de conexión al firewall de su servidor para crear una regla de red virtual.

Para obtener más contexto, consulte Puntos de conexión de servicio de red virtual para Azure SQL Database.

Sugerencia

Si todo lo que necesita es evaluar o agregar nombre de tipo del punto de conexión del servicio virtual para Azure SQL Database a la subred, puede ir directamente a nuestro script de PowerShell más directo.

Nota

En este artículo se usa el módulo Az de PowerShell, que es el módulo de PowerShell que se recomienda para interactuar con Azure. Para empezar a trabajar con el módulo Az de PowerShell, consulte Instalación de Azure PowerShell. Para más información sobre cómo migrar al módulo Az de PowerShell, consulte Migración de Azure PowerShell de AzureRM a Az.

Importante

El módulo de Azure Resource Manager (AzureRM) de PowerShell ha quedado en desuso el 29 de febrero de 2024. Todo el desarrollo futuro debe usar el módulo Az.Sql. Se recomienda a los usuarios migrar de AzureRM al módulo Az PowerShell para seguir recibiendo soporte técnico y actualizaciones. El módulo AzureRM ya no cuenta con mantenimiento ni soporte. Los argumentos de los comandos del módulo Az PowerShell y en los módulos AzureRM son sustancialmente idénticos. Para obtener más información sobre su compatibilidad, consulte Introducción al nuevo módulo de Az PowerShell.

Cmdlets principales

En este artículo se resalta el cmdlet New-AzSqlServerVirtualNetworkRule, que agrega el punto de conexión de la subred a la lista de control de acceso (ACL) de su servidor, lo que crea una regla.

En la lista siguiente se muestra la secuencia de otros cmdlets principales que debe ejecutar para preparar la llamada a New-AzSqlServerVirtualNetworkRule. En este artículo, estas llamadas se producen en el script 3: "regla de red virtual":

  1. New-AzVirtualNetworkSubnetConfig: crea un objeto de subred.
  2. New-AzVirtualNetwork: crea su red virtual y le proporciona la subred.
  3. Set-AzVirtualNetworkSubnetConfig: asigna un punto de conexión de servicio de red virtual a la subred.
  4. Set-AzVirtualNetwork: conserva las actualizaciones realizadas en la red virtual.
  5. New-AzSqlServerVirtualNetworkRule: una vez que la subred sea un punto de conexión, agrega la subred como una regla de red virtual en la ACL de su servidor.
    • Este cmdlet ofrece el parámetro -IgnoreMissingVNetServiceEndpoint.

Requisitos previos para ejecutar PowerShell

  • Ya puede iniciar sesión en Azure, por ejemplo, en Azure Portal.
  • Ya puede ejecutar scripts de PowerShell.

Nota

Asegúrese de que los puntos de conexión de servicio están activados para la red virtual o subred que quiere agregar al servidor. De lo contrario, se producirá un error al crear la regla de firewall de red virtual del servidor.

Un script dividido en cuatro fragmentos

Nuestro script de PowerShell de demostración se divide en una secuencia de scripts más pequeños. La división simplifica el aprendizaje y proporciona flexibilidad. Los scripts se deben ejecutar en su secuencia indicada. Si ahora no tiene tiempo de ejecutar los scripts, se muestra el resultado de la prueba real después del script 4.

Script 1: variables

Este primer script de PowerShell asigna valores a variables. Los scripts posteriores dependen de estas variables.

Importante

Antes de ejecutar este script, puede editar los valores, si quiere. Por ejemplo, si ya tiene un grupo de recursos, le recomendamos que edite el nombre del grupo de recursos como el valor asignado.

El nombre de la suscripción debe editarse en el script.

Código fuente del script 1 de PowerShell

######### 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: Requisitos previos

Este script se prepara para el siguiente script, donde se encuentra la acción del punto de conexión. Este script crea automáticamente los siguientes elementos de lista, pero solo si aún no existen. Puede omitir el script 2 si está seguro de que estos elementos ya existen:

  • Grupo de recursos de Azure
  • Servidor SQL lógico

Código fuente del script 2 de PowerShell

######### 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: Creación de un punto de conexión y una regla

Este script crea una red virtual con una subred. A continuación, el script asigna el tipo de extremo Microsoft.Sql a su subred. Por último, el script agrega su subred a la lista de control de acceso (ACL), de modo que crea una regla.

Código fuente del script 3 de PowerShell

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

Este script final elimina los recursos que crearon los scripts anteriores para la demostración. Sin embargo, el script pide confirmación antes de eliminar lo siguiente:

  • Servidor lógico de Azure SQL
  • Grupo de recursos de Azure

Puede ejecutar el script 4 en cualquier momento una vez se complete el script 1.

Código fuente del script 4 de PowerShell

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

Compruebe que la subred es un punto de conexión

Es posible que tenga una subred que ya se le haya asignado el nombre de Microsoft.Sql tipo, lo que significa que ya es un punto de conexión de servicio virtual. Puede usar Azure Portal para crear una regla de red virtual desde el punto de conexión.

O quizás no esté seguro de si su subred tiene el tipo de nombre Microsoft.Sql. Puede ejecutar el siguiente script de PowerShell para realizar estas acciones:

  1. Compruebe si su subred tiene el tipo de nombre Microsoft.Sql.
  2. En caso de que falte, puede asignar el nombre de tipo.
    • El script le pedirá su confirmación antes de aplicar el nombre de tipo que falta.

Fases del script

A continuación, se muestran las fases del script de PowerShell:

  1. Inicie sesión en su cuenta de Azure, solo necesaria una vez por sesión de PowerShell. Asigne las variables.
  2. Busque la red virtual y, a continuación, su subred.
  3. ¿La subred está etiquetada como Microsoft.Sql tipo de servidor de punto de conexión?
  4. Agregue un punto de conexión de servicio virtual de tipo nombre Microsoft.Sql en su subred.

Importante

Antes de ejecutar este script, debe editar los valores asignados a las variables de $, cerca de la parte superior del script.

Código fuente directo de PowerShell

Este script de PowerShell no actualiza nada, a menos que responda Sí si le pide confirmación. El script puede agregar el tipo de nombre Microsoft.Sql a su subred. No obstante, el script solo intenta la adición si falta el nombre de tipo a la subred.

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