Bagikan melalui


PowerShell: Membuat titik akhir Layanan Virtual dan aturan VNet untuk Azure SQL Database

Berlaku untuk: Azure SQL Database

Aturan jaringan virtual adalah salah satu fitur keamanan firewall yang mengontrol apakah server SQL logis untuk database Azure SQL Database Anda, kumpulan elastis, atau database di Azure Synapse menerima komunikasi yang dikirim dari subnet tertentu di jaringan virtual.

Penting

Artikel ini berlaku untuk Azure SQL Database, termasuk Azure Synapse (sebelumnya SQL DW). Untuk mempermudah, istilah Azure SQL Database dalam artikel ini berlaku untuk database milik Azure SQL Database atau Azure Synapse. Artikel ini tidak berlaku untuk Azure SQL Managed Instance karena tidak memiliki titik akhir layanan yang terkait dengannya.

Artikel ini menunjukkan skrip PowerShell yang mengambil tindakan berikut:

  1. Membuat titik akhir Layanan Virtual Microsoft Azure di subnet Anda.
  2. Menambahkan titik akhir ke firewall server Anda untuk membuat aturan jaringan virtual.

Untuk latar belakang lainnya, lihat Titik akhir Layanan Virtual untuk Azure SQL Database.

Tip

Jika yang Anda butuhkan hanyalah menilai atau menambahkan nama jenis titik akhir Layanan Virtual untuk Azure SQL Database ke subnet Anda, Anda dapat langsung melanjutkan ke skrip PowerShell kami yang lebih langsung.

Catatan

Artikel ini menggunakan modul Azure Az PowerShell, yang merupakan modul PowerShell yang direkomendasikan untuk berinteraksi dengan Azure. Untuk mulai menggunakan modul Az PowerShell, lihat Menginstal Azure PowerShell. Untuk mempelajari cara bermigrasi ke modul Az PowerShell, lihat Memigrasikan Azure PowerShell dari AzureRM ke Az.

Penting

Modul PowerShell Azure Resource Manager masih didukung oleh Azure SQL Database, tetapi semua pengembangan di masa depan adalah untuk modul Az.Sql Cmdlets. Untuk modul yang lebih lama, lihat AzureRM.Sql. Argumen untuk perintah dalam modul Az dan dalam modul AzureRm secara substansial identik.

Cmdlet utama

Artikel ini berfokus pada cmdlet New-AzSqlServerVirtualNetworkRule yang menambahkan titik akhir subnet ke daftar kontrol akses (ACL) server Anda, sehingga membuat aturan.

Daftar berikut menunjukkan urutan cmdlet utama lainnya yang harus Anda jalankan untuk mempersiapkan panggilan ke New-AzSqlServerVirtualNetworkRule. Dalam artikel ini, panggilan ini terjadi dalam skrip 3 "Aturan jaringan virtual":

  1. New-AzVirtualNetworkSubnetConfig: Membuat objek subnet.
  2. New-AzVirtualNetwork: Membuat jaringan virtual Anda, memberikannya subnet.
  3. Set-AzVirtualNetworkSubnetConfig: Menetapkan titik akhir Layanan Virtual ke subnet Anda.
  4. Set-AzVirtualNetwork: Mempertahankan pembaruan yang dibuat ke jaringan virtual Anda.
  5. New-AzSqlServerVirtualNetworkRule: Setelah subnet menjadi titik akhir, tambahkan subnet sebagai aturan jaringan virtual ke dalam ACL server Anda.
    • Cmdlet ini Menawarkan parameter -IgnoreMissingVNetServiceEndpoint, yang dimulai di Azure RM PowerShell Module versi 5.1.1.

Prasyarat untuk menjalankan PowerShell

  • Anda sudah bisa masuk ke Azure, misalnya melalui portal Microsoft Azure.
  • Anda sudah bisa menjalankan skrip PowerShell.

Catatan

Pastikan bahwa titik akhir layanan diaktifkan untuk VNet/Subnet yang ingin Anda tambahkan ke Server Anda. Jika tidak, pembuatan Aturan Firewall VNet akan gagal.

Satu skrip dibagi menjadi empat gugus

Skrip PowerShell demonstrasi kami dibagi menjadi urutan skrip yang lebih kecil. Pembagian ini memudahkan pembelajaran dan memberikan fleksibilitas. Skrip harus dijalankan dalam urutan yang ditunjukkan. Jika Anda tidak punya waktu sekarang untuk menjalankan skrip, output pengujian aktual kami ditampilkan setelah skrip 4.

Skrip 1: Variabel

Skrip PowerShell pertama ini menetapkan nilai ke variabel. Skrip berikutnya tergantung pada variabel ini.

Penting

Sebelum menjalankan skrip ini, jika ingin, Anda dapat mengedit nilai. Misalnya, jika sudah memiliki grup sumber daya, Anda mungkin ingin mengedit nama grup sumber daya sebagai nilai yang ditetapkan.

Nama langganan Anda harus diedit ke dalam skrip.

Kode sumber skrip 1 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".'

Skrip 2: Prasyarat

Skrip ini bersiap untuk skrip berikutnya, tempat tindakan titik akhir berada. Skrip ini membuat item yang tercantum berikut ini untuk Anda, tetapi hanya jika belum ada. Anda dapat melewati skrip 2 jika Anda yakin item ini sudah ada:

  • Grup sumber daya Azure
  • Server SQL logis

Kode sumber skrip 2 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".'

Skrip 3: Membuat titik akhir dan aturan

Skrip ini membuat jaringan virtual dengan subnet. Lalu skrip menetapkan jenis titik akhir Microsoft.Sql ke subnet Anda. Akhirnya skrip menambahkan subnet Anda ke daftar kontrol akses (ACL), sehingga membuat aturan.

Kode sumber skrip 3 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".'

Skrip 4: Pembersihan

Skrip akhir ini menghapus sumber daya yang dibuat skrip sebelumnya untuk demonstrasi. Namun, skrip meminta konfirmasi sebelum menghapus hal berikut:

  • Server SQL logis
  • Grup sumber daya Azure

Anda dapat menjalankan skrip 4 kapan saja setelah skrip 1 selesai.

Kode sumber skrip 4 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".'

Memverifikasi subnet sebagai titik akhir

Anda mungkin memiliki subnet yang sudah diberi nama jenis Microsoft.Sql, yang berarti sudah menjadi titik akhir Layanan Virtual. Anda dapat menggunakan portal Microsoft Azure untuk membuat aturan jaringan virtual dari titik akhir.

Selain itu, Anda mungkin tidak yakin apakah subnet Anda memiliki nama jenis Microsoft.Sql. Anda bisa menjalankan skrip PowerShell berikut ini untuk melakukan tindakan ini:

  1. Pastikan apakah subnet Anda memiliki nama jenis Microsoft.Sql.
  2. Secara opsional, tetapkan nama jenis jika belum ada.
    • Skrip meminta Anda untuk mengonfirmasi, sebelum menerapkan nama jenis yang tidak ada.

Fase skrip

Berikut adalah fase skrip PowerShell:

  1. LOG ke akun Azure Anda, hanya perlu sekali per sesi PS. Menetapkan variabel.
  2. Cari jaringan virtual Anda, lalu subnet Anda.
  3. Apakah subnet Anda ditandai sebagai jenis server titik akhir Microsoft.Sql?
  4. Tambahkan titik akhir Layanan Virtual nama jenis Microsoft.Sql, pada subnet Anda.

Penting

Sebelum Anda menjalankan skrip ini, Anda harus mengedit nilai yang ditetapkan ke $-variabel, di dekat bagian atas skrip.

Kode sumber PowerShell langsung

Skrip PowerShell ini tidak memperbarui apa pun, kecuali Jika Anda memberikan respons "ya" saat dimintai konfirmasi. Skrip dapat menambahkan nama jenis Microsoft.Sql ke subnet Anda. Namun, skrip mencoba menambahkan hanya jika subnet Anda tidak memiliki nama jenis.

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