PowerShell: Criar um ponto de extremidade de Serviço Virtual e uma regra de VNet para o Banco de Dados SQL do Azure

Aplica-se a:Banco de Dados SQL do Azure

As regras de rede virtual são um recurso de segurança de firewall que controla se o servidor SQL lógico para seus bancos de dados do Banco de Dados SQL do Azure, pools elásticos ou bancos de dados no Azure Synapse aceita comunicações enviadas de sub-redes específicas em redes virtuais.

Importante

Este artigo aplica-se à Base de Dados SQL do Azure, incluindo o Azure Synapse (anteriormente SQL DW). Para simplificar, o termo Banco de Dados SQL do Azure neste artigo se aplica a bancos de dados pertencentes ao Banco de Dados SQL do Azure ou ao Azure Synapse. Este artigo não se aplica à Instância Gerenciada SQL do Azure porque não tem um ponto de extremidade de serviço associado a ela.

Este artigo demonstra um script do PowerShell que executa as seguintes ações:

  1. Cria um ponto de extremidade do Serviço Virtual do Microsoft Azure em sua sub-rede.
  2. Adiciona o ponto de extremidade ao firewall do seu servidor, para criar uma regra de rede virtual.

Para obter mais informações, consulte Pontos de extremidade do Serviço Virtual para o Banco de Dados SQL do Azure.

Gorjeta

Se tudo o que você precisa é avaliar ou adicionar o nome do tipo de ponto de extremidade do Serviço Virtual para o Banco de Dados SQL do Azure à sua sub-rede, você pode pular para nosso script PowerShell mais direto.

Nota

Este artigo usa o módulo Azure Az PowerShell, que é o módulo PowerShell recomendado para interagir com o Azure. Para começar a utilizar o módulo Azure PowerShell, veja Instalar o Azure PowerShell. Para saber como migrar para o módulo do Az PowerShell, veja Migrar o Azure PowerShell do AzureRM para o Az.

Importante

O módulo PowerShell Azure Resource Manager ainda é suportado pelo Banco de Dados SQL do Azure, mas todo o desenvolvimento futuro é para os Az.Sql cmdlets. Para o módulo mais antigo, consulte AzureRM.Sql. Os argumentos para os comandos no módulo Az e nos módulos AzureRm são substancialmente idênticos.

Principais cmdlets

Este artigo enfatiza o cmdlet New-AzSqlServerVirtualNetworkRule que adiciona o ponto de extremidade da sub-rede à lista de controle de acesso (ACL) do servidor, criando assim uma regra.

A lista a seguir mostra a sequência de outros cmdlets principais que você deve executar para preparar sua chamada para New-AzSqlServerVirtualNetworkRule. Neste artigo, essas chamadas ocorrem no script 3 "Regra de rede virtual":

  1. New-AzVirtualNetworkSubnetConfig: Cria um objeto de sub-rede.
  2. New-AzVirtualNetwork: Cria a sua rede virtual, dando-lhe a sub-rede.
  3. Set-AzVirtualNetworkSubnetConfig: atribui um ponto de extremidade de Serviço Virtual à sua sub-rede.
  4. Set-AzVirtualNetwork: Persiste as atualizações feitas na sua rede virtual.
  5. New-AzSqlServerVirtualNetworkRule: Depois que sua sub-rede for um ponto de extremidade, adicionará sua sub-rede como uma regra de rede virtual à ACL do seu servidor.
    • Este cmdlet oferece o parâmetro -IgnoreMissingVNetServiceEndpoint, a partir do Azure RM PowerShell Module versão 5.1.1.

Pré-requisitos para executar o PowerShell

  • Você já pode fazer logon no Azure, como por meio do portal do Azure.
  • Você já pode executar scripts do PowerShell.

Nota

Certifique-se de que os pontos de extremidade de serviço estão ativados para a rede virtual/sub-rede que você deseja adicionar ao servidor, caso contrário, a criação da regra de firewall de rede virtual falhará.

Um roteiro dividido em quatro partes

Nosso script PowerShell de demonstração é dividido em uma sequência de scripts menores. A divisão facilita a aprendizagem e proporciona flexibilidade. Os scripts devem ser executados em sua sequência indicada. Se você não tiver tempo agora para executar os scripts, nossa saída de teste real será exibida após o script 4.

Script 1: Variáveis

Este primeiro script do PowerShell atribui valores a variáveis. Os scripts subsequentes dependem dessas variáveis.

Importante

Antes de executar esse script, você pode editar os valores, se desejar. Por exemplo, se você já tiver um grupo de recursos, convém editar o nome do grupo de recursos como o valor atribuído.

O nome da sua subscrição deve ser editado no script.

Código-fonte do 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é-requisitos

Esse script se prepara para o próximo script, onde está a ação do ponto final. Esse script cria para você os seguintes itens listados, mas somente se eles ainda não existirem. Você pode pular o script 2 se tiver certeza de que esses itens já existem:

  • Grupo de recursos do Azure
  • Servidor SQL Lógico

Código-fonte do 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: Criar um ponto de extremidade e uma regra

Este script cria uma rede virtual com uma sub-rede. Em seguida, o script atribui o tipo de ponto de extremidade Microsoft.Sql à sua sub-rede. Finalmente, o script adiciona sua sub-rede à lista de controle de acesso (ACL), criando assim uma regra.

Código-fonte do 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: Limpeza

Este script final exclui os recursos que os scripts anteriores criaram para a demonstração. No entanto, o script pede confirmação antes de excluir o seguinte:

  • Servidor SQL Lógico
  • Grupo de Recursos do Azure

Você pode executar o script 4 a qualquer momento após a conclusão do script 1.

Código-fonte do 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".'

Verifique se sua sub-rede é um ponto de extremidade

Você pode ter uma sub-rede que já recebeu o nome do tipo Microsoft.Sql, o que significa que já é um ponto de extremidade do Serviço Virtual. Você pode usar o portal do Azure para criar uma regra de rede virtual a partir do ponto de extremidade.

Ou, você pode não ter certeza se sua sub-rede tem o nome do tipo Microsoft.Sql . Você pode executar o seguinte script do PowerShell para executar estas ações:

  1. Verifique se a sua sub-rede tem o nome do tipo Microsoft.Sql .
  2. Opcionalmente, atribua o nome do tipo se ele estiver ausente.
    • O script pede que você confirme, antes de aplicar o nome do tipo ausente.

Fases do script

Aqui estão as fases do script do PowerShell:

  1. INICIE sessão na sua conta do Azure, necessária apenas uma vez por sessão PS. Atribua variáveis.
  2. Procure a sua rede virtual e, em seguida, a sua sub-rede.
  3. Sua sub-rede está marcada como tipo de servidor de ponto de extremidade Microsoft.Sql ?
  4. Adicione um ponto de extremidade de Serviço Virtual com o nome do tipo Microsoft.SQL em sua sub-rede.

Importante

Antes de executar esse script, você deve editar os valores atribuídos às variáveis $, perto da parte superior do script.

Código-fonte do Direct PowerShell

Este script do PowerShell não atualiza nada, a menos que você responda sim se for solicitado a confirmação. O script pode adicionar o nome do tipo Microsoft.Sql à sua sub-rede. Mas o script tenta adicionar somente se sua sub-rede não tiver o nome do tipo.

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