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:
- Cria um ponto de extremidade do Serviço Virtual do Microsoft Azure em sua sub-rede.
- 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":
- New-AzVirtualNetworkSubnetConfig: Cria um objeto de sub-rede.
- New-AzVirtualNetwork: Cria a sua rede virtual, dando-lhe a sub-rede.
- Set-AzVirtualNetworkSubnetConfig: atribui um ponto de extremidade de Serviço Virtual à sua sub-rede.
- Set-AzVirtualNetwork: Persiste as atualizações feitas na sua rede virtual.
- 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:
- Verifique se a sua sub-rede tem o nome do tipo Microsoft.Sql .
- 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:
- INICIE sessão na sua conta do Azure, necessária apenas uma vez por sessão PS. Atribua variáveis.
- Procure a sua rede virtual e, em seguida, a sua sub-rede.
- Sua sub-rede está marcada como tipo de servidor de ponto de extremidade Microsoft.Sql ?
- 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.
}