PowerShell: إنشاء نقطة تقديم خدمة الويب وقاعدة الشبكة الظاهرية لقاعدة بيانات Azure SQL.

ينطبق على: قاعدة بيانات Azure SQL

قواعد الشبكة الظاهرية هي ميزة أمان جدار حماية واحدة تتحكم في ما إذا كان خادم SQL المنطقي لقواعد بيانات Azure SQL أو التجمعات المرنة، أو قواعد البيانات في Azure Synapse يقبل الاتصالات التي يتم إرسالها من شبكات فرعية معينة في الشبكات الظاهرية.

هام

تنطبق هذه المقالة على قاعدة بيانات Azure SQL، بما في ذلك Azure Synapse (سابقًا SQL DW). للتبسيط، ينطبق المصطلح قاعدة بيانات Azure SQL في هذه المقالة على قواعد البيانات التي تنتمي إلى قاعدة بيانات Azure SQL أو Azure Synapse. لا تنطبق هذه المقالة عل المثيل المُدار لـ Azure SQL لأنه لا يملك نقطة تقديم خدمة مرنة ملحقة به.

توضح هذه المقالة البرنامج النصي لـ PowerShell الذي يتخذ الإجراءات التالية:

  1. إنشاء نقطة تقديم الخدمة ظاهرية لـ Microsoft Azure على الشبكة الفرعية.
  2. إضافة نقطة النهاية إلى جدار الحماية الخاص بالخادم لإنشاء قاعدة شبكة ظاهرية.

لمزيد من المعلومات الأساسية، راجع نقاط تقديم الخدمة الظاهرية لقاعدة بيانات Azure SQL.

تلميح

إذا كان كل ما تحتاجه هو تقييم أو إضافة اسم نوع نقطة تقديم خدمة الويب الظاهرية لقاعدة بيانات Azure SQL إلى الشبكة الفرعية الخاصة بك، فيمكنك التخطي إلى الأمام إلى البرنامج النصي لـ PowerShell المباشر.

ملاحظة

تستخدم هذه المقالة الوحدة النمطية Azure Az PowerShell، وهي الوحدة النمطية PowerShell الموصى بها للتفاعل مع Azure. لبدء استخدام الوحدة النمطية Az PowerShell، راجع تثبيت Azure PowerShell. لمعرفة كيفية الترحيل إلى الوحدة النمطية Az PowerShell، راجع ترحيل Azure PowerShell من AzureRM إلى Az.

هام

لا تزال الوحدة النمطية Azure Resource Manager لـ PowerShell مدعومة بواسطة قاعدة بيانات Azure SQL، ولكن جميع التطويرات المستقبلية تكون لـ Az.Sql Cmdlets. للاطلاع على الوحدة النمطية الأقدم، راجع AzureRM.Sql. تتطابق وسائط الأوامر في الوحدة النمطية Az وفي الوحدات النمطية AzureRm بشكل كبير.

cmdlets الرئيسية

تؤكد هذه المقالة على New-AzSqlServerVirtualNetworkRule cmdlet الذي يضيف نقطة نهاية الشبكة الفرعية إلى قائمة التحكم بالوصول (ACL) للخادم الخاص بك، وبالتالي إنشاء قاعدة.

تظهر القائمة التالية تسلسل cmdlets الرئيسية الأخرى التي يجب تشغيلها للتحضير للاستدعاء الخاص بك إلى New-AzSqlServerVirtualNetworkRule. في هذه المقالة، تحدث هذه الاستدعاءات في البرنامج النصي 3 "قاعدة الشبكة الظاهرية":

  1. New-AzVirtualNetworkSubnetConfig: إنشاء عنصر شبكة فرعية.
  2. New-AzVirtualNetwork: إنشاء الشبكة الظاهرية الخاصة بك، وإعطائها الشبكة الفرعية.
  3. Set-AzVirtualNetworkSubnetConfig: تعيين نقطة تقديم خدمة ظاهرية إلى الشبكة الفرعية الخاصة بك.
  4. Set-AzVirtualNetwork: تحديثات مستمرة إلى الشبكة الظاهرية الخاصة بك.
  5. New-AzSqlServerVirtualNetworkRule: بعد أن تتحول الشبكة الفرعية الخاصة بك إلى نقطة نهاية، يضيف الشبكة الفرعية الخاصة بك كقاعدة شبكة ظاهرية، في قائمة التحكم بالوصول بالخادم الخاص بك.
    • هذا cmdlet يعرض المعلمة -IgnoreMissingVNetServiceEndpoint، بدءًا من الإصدار 5.1.1 للوحدة النمطية PowerShell في Azure RM.

المتطلبات الأساسية لتشغيل PowerShell

  • يمكنك تسجيل الدخول إلى Azure، مثل من خلال مدخل Microsoft Azure.
  • يمكنك بالفعل تشغيل البرامج النصية لـ PowerShell.

ملاحظة

يُرجى التأكد من تشغيل نقاط تقديم الخدمة للشبكة الظاهرية / الشبكة الفرعية التي تريد إضافتها إلى الخادم وإلا سيفشل إنشاء قاعدة جدار حماية الشبكة الظاهرية.

نص واحد مقسم إلى أربع مجموعات.

وينقسم عرضنا للبرنامج النصي لـ PowerShell إلى تسلسل من البرامج النصية الصغيرة. يسهل القسم عملية التعلم ويوفر المرونة. يجب تشغيل البرامج النصية في تسلسلها المشار إليه. إذا لم يكن لديك الوقت الآن لتشغيل البرامج النصية، يتم عرض إخراج الاختبار الفعلي بعد البرنامج النصي 4.

البرنامج النصي 1: المتغيرات

يقوم هذا البرنامج النصي الأول لـ PowerShell بتعيين قيم للمتغيرات. تعتمد البرامج النصية اللاحقة على هذه المتغيرات.

هام

قبل تشغيل هذا البرنامج النصي، يمكنك تحرير القيم، إذا أردت. على سبيل المثال، إذا كان لديك بالفعل مجموعة موارد، فقد ترغب في تحرير اسم مجموعة الموارد الخاص بك كقيمة معينة.

ينبغي تحرير اسم الاشتراك في البرنامج النصي.

مصدر التعليمة البرمجية للبرنامج النصي 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".'

البرنامج النصي 2: المتطلبات الأساسية

يعمل هذا البرنامج النصي على تحضير البرنامج النصي التالي الذي يوجد فيه إجراء نقطة النهاية. ينشئ هذا البرنامج النصي العناصر المذكورة التالية، ولكن فقط إذا كانت غير موجودة بالفعل. يمكنك تخطي البرنامج النصي 2 إذا كنت متأكدًا من وجود هذه العناصر مسبقا:

  • مجموعة موارد Azure
  • خادم SQL المنطقي

مصدر التعليمة البرمجية للبرنامج النصي 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".'

البرنامج النصي 3: إنشاء نقطة نهاية وقاعدة

ينشئ هذا البرنامج النصي شبكة اتصال ظاهرية مع شبكة فرعية. ثم يعيّن البرنامج النصي نوع نقطة النهاية Microsoft.Sql إلى الشبكة الفرعية الخاصة بك. أخيرًا، يضيف البرنامج النصي الشبكة الفرعية إلى قائمة التحكم بالوصول (ACL)، وبالتالي إنشاء قاعدة.

مصدر التعليمة البرمجية للبرنامج النصي 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".'

البرنامج النصي 4: التنظيف

يعمل هذا البرنامج النصي النهائي على حذف الموارد التي تم إنشاؤها البرامج النصية السابقة للعرض. ومع ذلك، يطلب البرنامج النصي التأكيد قبل أن يحذف ما يلي:

  • خادم SQL المنطقي
  • مجموعة موارد Azure

يمكنك تشغيل البرنامج النصي 4 في أي وقت بعد اكتمال البرنامج النصي 1.

مصدر التعليمة البرمجية للبرنامج النصي 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".'

تحقق من أن الشبكة الفرعية عبارة عن نقطة نهاية.

قد يكون لديك شبكة فرعية تم تعيين اسم نوع Microsoft.Sql لها بالفعل، مما يعني أنها بالفعل عبارة عن نقطة تقديم خدمة ظاهرية. يمكنك استخدام مدخل Microsoft Azure لإنشاء قاعدة شبكة ظاهرية من نقطة النهاية.

وإلا، فقد تكون غير متأكد ما إذا كانت الشبكة الفرعية الخاصة بك اسم نوع Microsoft.Sql. يمكنك تشغيل البرنامج النصي لـ PowerShell التالي لاتخاذ هذه الإجراءات:

  1. يجب تأكيد ما إذا كانت الشبكة الفرعية الخاصة بك اسم نوع Microsoft.Sql.
  2. اختياريًا، يمكنك تعيين اسم النوع إذا كان غير موجود.
    • يطلب منك البرنامج النصي التأكيد، قبل أن يطبق اسم النوع الغائب.

مراحل البرنامج النصي

فيما يلي مراحل البرنامج النصي لـ PowerShell:

  1. سجل الدخول إلى حساب Azure الخاص بك، الذي تحتاجه مرة واحدة فقط لكل جلسة PS. عيّن المتغيرات.
  2. ابحث عن الشبكة الظاهرية، ثمّ عن الشبكة الفرعية.
  3. هل الشبكة الفرعية الخاصة بك تحمل علامة كنوع خادم نقطة نهاية Microsoft.Sql؟
  4. أضف نقطة تقديم خدمة ظاهرية من اسم نوع Microsoft.Sql، على الشبكة الفرعية الخاصة بك.

هام

قبل تشغيل هذا البرنامج النصي، يجب تحرير القيم المعينة إلى المتغيرات $، بالقرب من أعلى البرنامج النصي.

التعليمة البرمجية لمصدر PowerShell المباشر

هذا البرنامج النصي PowerShell لا يعمل على تحديث أي شيء، إلا إذا أجبت بنعم في حال طلب منك تأكيدًا. يمكن للبرنامج النصي إضافة اسم النوع Microsoft.Sql إلى الشبكة الفرعية الخاصة بك. ولكن يحاول البرنامج النصي الإضافة فقط إذا الشبكة الفرعية لا تتضمن اسم النوع.

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