تمرين - نشر الموارد بشكل مشروط

مكتمل

إشعار

عند تنشيط بيئة الاختبار المعزولة لأول مرة والموافقة على الشروط، يرتبط حسابك في Microsoft بدليل جديد في Azure يسمى Microsoft Learn Sandbox. كما تتم إضافتك إلى اشتراك خاص يسمى اشتراك Concierge.

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

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

أثناء العملية، ستقوم بما يلي:

  • إنشاء ملف Bicep الذي يقوم بتعريف خادم منطقي مع قاعدة بيانات.
  • إضافة حساب تخزين وإعدادات تدقيق SQL، يتم نشر كل منها بشرط.
  • إعداد بنية أساسية لبيئة التطوير الخاصة بك، ثم التحقق من النتيجة.
  • إعادة نشر البنية الأساسية الخاصة بك مقابل بيئة الإنتاج الخاصة بك، ومن ثم النظر إلى التغييرات.

يستخدم هذا التمرين ملحق Bicep لـ Visual Studio Code. تأكد من تثبيت هذا الملحق في التعليمة البرمجية لـ Visual Studio.

إنشاء قالب Bicep مع خادم منطقي وقاعدة بيانات

  1. فتح Visual Studio Code.

  2. قم بإنشاء ملف جديد يسمى main.bicep.

  3. احفظ الملف الفارغ بحيث يقوم Visual Studio Code بتحميل أدوات Bicep.

    يمكنك إما تحديد File>Save As، أو تحديد Ctrl+S في Windows (⌘+S في macOS). تأكد من تذكر المكان الذي حفظت فيه الملف. على سبيل المثال، قد ترغب في إنشاء مجلد قوالب لحفظ الملف به.

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

    @description('The Azure region into which the resources should be deployed.')
    param location string
    
    @secure()
    @description('The administrator login username for the SQL server.')
    param sqlServerAdministratorLogin string
    
    @secure()
    @description('The administrator login password for the SQL server.')
    param sqlServerAdministratorLoginPassword string
    
    @description('The name and tier of the SQL database SKU.')
    param sqlDatabaseSku object = {
      name: 'Standard'
      tier: 'Standard'
    }
    
    var sqlServerName = 'teddy${location}${uniqueString(resourceGroup().id)}'
    var sqlDatabaseName = 'TeddyBear'
    
    resource sqlServer 'Microsoft.Sql/servers@2021-11-01-preview' = {
      name: sqlServerName
      location: location
      properties: {
        administratorLogin: sqlServerAdministratorLogin
        administratorLoginPassword: sqlServerAdministratorLoginPassword
      }
    }
    
    resource sqlDatabase 'Microsoft.Sql/servers/databases@2021-11-01-preview' = {
      parent: sqlServer
      name: sqlDatabaseName
      location: location
      sku: sqlDatabaseSku
    }
    

    لاحظ أن جميع المعلمات تتضمن @description مصممي الديكور، ما يساعد على تسهيل العمل معهم. لاحظ أيضًا أن المعلمات sqlServerAdministratorLogin وsqlServerAdministratorLoginPassword لديها مصممة @secure مُطبقة عليها. وهذا يخبر Bicep أن قيم المعلمات هذه حساسة. لا يقوم Azure بطباعة القيم الحساسة إلى السجلات.

إضافة حساب تخزين

في إعدادات التدقيق للخوادم المنطقية، تحتاج إلى تحديد حساب تخزين لاحتواء بيانات التدقيق. ستقوم بتحديث ملف Bicep الخاص بك لإنشاء حساب التخزين هذا، ولكن فقط عند تمكين التدقيق.

  1. أسفل الإعلانات عن المعلمة، أضِف المعلمات التالية:

    @description('The name of the environment. This must be Development or Production.')
    @allowed([
      'Development'
      'Production'
    ])
    param environmentName string = 'Development'
    
    @description('The name of the audit storage account SKU.')
    param auditStorageAccountSkuName string = 'Standard_LRS'
    
  2. أسفل الإعلانات عن المتغيّر، أضِف المتغيّرات التالية:

    var auditingEnabled = environmentName == 'Production'
    var auditStorageAccountName = take('bearaudit${location}${uniqueString(resourceGroup().id)}', 24)
    

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

    لاحظ أيضًا أن المتغيّر auditStorageAccountName يستخدم دالة تسمى take(). أسماء حسابات التخزين لها طول محدد 24 حرفًا، ولذلك تقوم هذه الدالة بتقليم نهاية السلسلة للتأكد من أن الاسم صالح.

  3. في أسفل الملف، تحت الموارد، أضِف تعريف المورد التالي لحساب التخزين:

    resource auditStorageAccount 'Microsoft.Storage/storageAccounts@2021-09-01' = if (auditingEnabled) {
      name: auditStorageAccountName
      location: location
      sku: {
        name: auditStorageAccountSkuName
      }
      kind: 'StorageV2'  
    }
    

    لاحظ أن التعريفات لحساب التخزين تتضمن الكلمة الأساسية if التي تحدد شرط نشر.

إضافة إعدادات التدقيق

  1. تحت مورد حساب التخزين الذي قمت بإضافته، أضِف التالي:

    resource sqlServerAudit 'Microsoft.Sql/servers/auditingSettings@2021-11-01-preview' = if (auditingEnabled) {
      parent: sqlServer
      name: 'default'
      properties: {
        state: 'Enabled'
        storageEndpoint: environmentName == 'Production' ? auditStorageAccount.properties.primaryEndpoints.blob : ''
        storageAccountAccessKey: environmentName == 'Production' ? listKeys(auditStorageAccount.id, auditStorageAccount.apiVersion).keys[0].value : ''
      }
    }
    

    لاحظ أن التعريف يتضمن نفس الشرط if مثل حساب التخزين. أيضًا، تستخدم الخصائص storageEndpoint وstorageAccountAccessKey عامل تشغيل علامة الاستفهام (?) الثلاثي لضمان أن قيمها صالحة دائمًا. إذا لم تقم بذلك، يقوم Azure Resource Manager بتقييم قيم التعبير قبل تقييم شرط نشر الموارد وإرجاع خطأ، لتعذر العثور على حساب التخزين.

  2. حفظ التغييرات على الملف.

تحقق من ملف Bicep الخاص بك

بعد إكمال كافة التغييرات السابقة، يجب أن يبدو ملف Bicep مثل هذا المثال:

@description('The Azure region into which the resources should be deployed.')
param location string

@secure()
@description('The administrator login username for the SQL server.')
param sqlServerAdministratorLogin string

@secure()
@description('The administrator login password for the SQL server.')
param sqlServerAdministratorLoginPassword string

@description('The name and tier of the SQL database SKU.')
param sqlDatabaseSku object = {
  name: 'Standard'
  tier: 'Standard'
}

@description('The name of the environment. This must be Development or Production.')
@allowed([
  'Development'
  'Production'
])
param environmentName string = 'Development'

@description('The name of the audit storage account SKU.')
param auditStorageAccountSkuName string = 'Standard_LRS'

var sqlServerName = 'teddy${location}${uniqueString(resourceGroup().id)}'
var sqlDatabaseName = 'TeddyBear'
var auditingEnabled = environmentName == 'Production'
var auditStorageAccountName = take('bearaudit${location}${uniqueString(resourceGroup().id)}', 24)

resource sqlServer 'Microsoft.Sql/servers@2021-11-01-preview' = {
  name: sqlServerName
  location: location
  properties: {
    administratorLogin: sqlServerAdministratorLogin
    administratorLoginPassword: sqlServerAdministratorLoginPassword
  }
}

resource sqlDatabase 'Microsoft.Sql/servers/databases@2021-11-01-preview' = {
  parent: sqlServer
  name: sqlDatabaseName
  location: location
  sku: sqlDatabaseSku
}

resource auditStorageAccount 'Microsoft.Storage/storageAccounts@2021-09-01' = if (auditingEnabled) {
  name: auditStorageAccountName
  location: location
  sku: {
    name: auditStorageAccountSkuName
  }
  kind: 'StorageV2'  
}

resource sqlServerAudit 'Microsoft.Sql/servers/auditingSettings@2021-11-01-preview' = if (auditingEnabled) {
  parent: sqlServer
  name: 'default'
  properties: {
    state: 'Enabled'
    storageEndpoint: environmentName == 'Production' ? auditStorageAccount.properties.primaryEndpoints.blob : ''
    storageAccountAccessKey: environmentName == 'Production' ? listKeys(auditStorageAccount.id, auditStorageAccount.apiVersion).keys[0].value : ''
  }
}

إذا لم يحدث ذلك، إما أن تنسخ المثال أو تضبط القالب لمطابقة المثال.

نشر قالب Bicep إلى Azure

لنشر هذا القالب إلى Azure، تحتاج إلى تسجيل الدخول إلى حساب Azure الخاص بك من محطة Visual Studio Code. تأكد من تثبيت Azure CLI، وتذكر أن تسجل الدخول بالحساب نفسه الذي استخدمته لتنشيط بيئة الاختبار المعزولة.

  1. في القائمة المحطة الطرفية، حدد محطة طرفية جديدة. عادة ما تفتح نافذة المحطة الطرفية في النصف السفلي من الشاشة.

  2. إذا كانت القشرة الموضحة على الجانب الأيمن من نافذة المحطة الطرفية هي bash، فإن shell الصحيح مفتوح ويمكنك التخطي إلى القسم التالي.

    Screenshot of the Visual Studio Code terminal window, with the bash option shown.

  3. إذا ظهرت shell بخلاف bash ، فحدد سهم القائمة المنسدلة shell، ثم حدد Git Bash.

    Screenshot of the Visual Studio Code terminal window, with the terminal shell dropdown shown and Git Bash Default selected.

  4. في قائمة الأصداف الطرفية، حدد bash.

    Screenshot of the Visual Studio Code terminal window, with the bash terminal selected.

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

    cd templates
    

تثبيت Bicep

قم بتشغيل الأمر التالي للتأكد من أن لديك أحدث إصدار من Bicep:

az bicep install && az bicep upgrade

تسجيل الدخول إلى Azure

  1. في محطة Visual Studio Code الطرفية، قم بتسجيل الدخول إلى Azure عن طريق تشغيل الأمر التالي:

    az login
    
  2. في المتصفح الذي يفتح، سجل الدخول إلى حسابك في Azure.

    تعرض المحطة الطرفية لـ Visual Studio Code قائمة الاشتراكات المقترنة بهذا الحساب.

  3. عيِّن الاشتراك الافتراضي لجميع أوامر Azure CLI التي تشغِّلها في هذه الجلسة.

    az account set --subscription "Concierge Subscription"
    

    إشعار

    إذا كنت قد استخدمت أكثر من بيئة اختبار معزولة واحدة مؤخرًا، فقد تعرض المحطة الطرفية أكثر من مثيل واحد لـ Concierge Subscription. في هذه الحالة، استخدم الخطوتين التاليتين لتعيين الاشتراك الافتراضي. إذا نجح الأمر السابق، وتم سرد Concierge Subscription واحد فقط، فتخطَّ الخطوتين التاليتين.

  4. احصل على معرفات "Concierge Subscription".

     az account list \
       --refresh \
       --query "[?contains(name, 'Concierge Subscription')].id" \
       --output table
    
  5. تعيين الاشتراك الافتراضي باستخدام معرّف الاشتراك. استبدل {معرّف الاشتراك الخاص بك} بأحدث معرّف اشتراك Concierge.

    az account set --subscription {your subscription ID}
    

تعيين مجموعة الموارد الافتراضية

عند استخدام Azure CLI، يمكنك تعيين مجموعة الموارد الافتراضية وحذف المعلمة من بقية أوامر Azure CLI في هذا التدريب. عيِّن الإعداد الافتراضي لمجموعة الموارد المنشأة لك في بيئة الاختبار المعزولة.

az configure --defaults group="<rgn>[sandbox resource group name]</rgn>"

انشر القالب إلى Azure باستخدام Azure CLI

في محطة Visual Studio Code الطرفية، انشر قالب Bicep إلى Azure عن طريق تشغيل التعليمات البرمجية التالية. لاحظ أنك تقوم بتعيين المعلمة location بشكل صريح إلى westus3.

az deployment group create --template-file main.bicep --parameters location=westus3

لتوزيع هذا القالب إلى Azure، قم بتسجيل الدخول إلى حساب Azure الخاص بك من المحطة الطرفية لـ Visual Studio Code. تأكد من تثبيت Azure PowerShell، وسجّل الدخول إلى الحساب نفسه الذي قام بتنشيط بيئة الاختبار المعزولة.

  1. في القائمة المحطة الطرفية، حدد محطة طرفية جديدة. عادة ما تفتح نافذة المحطة الطرفية في النصف السفلي من الشاشة.

  2. إذا كانت shell المعروضة على الجانب الأيمن من نافذة المحطة الطرفية powershell أو pwsh، فإن shell الصحيح مفتوح، ويمكنك التخطي إلى القسم التالي.

    Screenshot of the Visual Studio Code terminal window, with the pwsh option displayed in the shell dropdown list.

  3. إذا ظهرت shell بخلاف powershell أو pwsh ، فحدد سهم shell المنسدلة، ثم حدد PowerShell.

    Screenshot of the Visual Studio Code terminal window, with the terminal shell dropdown list shown and PowerShell selected.

  4. في قائمة shell الطرفية، حدد powershell أو pwsh.

    Screenshot of the Visual Studio Code terminal window, with the PowerShell terminal selected.

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

    Set-Location -Path templates
    

تثبيت Bicep CLI

لاستخدام Bicep من Azure PowerShell، ثبّت Bicep CLI.

تسجيل الدخول إلى Azure باستخدام Azure PowerShell

  1. في المحطة الطرفية لتعليمة Visual Studio البرمجية، شغِّل الأمر التالي:

    Connect-AzAccount
    

    يفتح متصفح بحيث يمكنك تسجيل الدخول إلى حسابك في Azure.

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

    إذا قمت بتنشيط بيئة الاختبار المعزولة، يتم عرض اشتراك باسم Concierge Subscription. استخدمه في باقي التدريب.

  3. عيِّن الاشتراك الافتراضي لجميع أوامر Azure PowerShell التي تشغِّلها في هذه الجلسة.

    $context = Get-AzSubscription -SubscriptionName 'Concierge Subscription'
    Set-AzContext $context
    

    إشعار

    إذا كنت قد استخدمت أكثر من بيئة اختبار معزولة واحدة مؤخرًا، فقد تعرض المحطة الطرفية أكثر من مثيل واحد لـ Concierge Subscription. في هذه الحالة، استخدم الخطوتين التاليتين لتعيين الاشتراك الافتراضي. إذا نجح الأمر السابق، وتم سرد Concierge Subscription واحد فقط، فتخطَّ الخطوتين التاليتين.

  4. احصل على معرّف الاشتراك. يسرد تشغيل الأمر التالي الاشتراكات ومعرفاتها. ابحث عن Concierge Subscription، ثم انسخ المعرّف من العمود الثاني. وسيبدو على هذا النحو cf49fbbc-217c-4eb6-9eb5-a6a6c68295a0.

    Get-AzSubscription
    
  5. غيِّر اشتراكك النشط إلى Concierge Subscription. تأكد من استبدال {Your subscription ID} بالمعرّف الذي قمت بنسخه.

    $context = Get-AzSubscription -SubscriptionId {Your subscription ID}
    Set-AzContext $context
    

تعيين مجموعة الموارد الافتراضية

يمكنك تعيين مجموعة الموارد الافتراضية وحذف المعلمة من بقية أوامر Azure PowerShell في هذا التمرين. عيِّن هذا الإعداد الافتراضي إلى مجموعة الموارد المنشأة لك في بيئة الاختبار المعزولة.

Set-AzDefault -ResourceGroupName <rgn>[sandbox resource group name]</rgn>

نشر القالب إلى Azure باستخدام Azure PowerShell

في محطة Visual Studio Code الطرفية، انشر القالب إلى Azure عن طريق تشغيل أمر Azure PowerShell التالي. قد تستغرق هذه العملية بضع دقائق لإكمالها، ثم سيكون لديك نشر ناجح.

New-AzResourceGroupDeployment -TemplateFile main.bicep -location westus3

تتم مطالبتك بإدخال قيم لمعلمات sqlServerAdministratorLogin وsqlServerAdministratorLoginPassword عند تنفيذ النشر.

تلميح

عند إدخال المعلمات الآمنة، يجب أن تتبع القيم التي تختارها قواعد معينة:

  • sqlServerAdministratorLogin يجب ألا تكون معرف تسجيل دخول يمكن تخمينه بسهولة مثل admin أو root. يمكن أن تحتوي على أحرف أبجدية رقمية فقط ويجب أن تبدأ بحرف.
  • sqlServerAdministratorLoginPassword يجب أن يكون طولها ثمانية أحرف على الأقل وأن تتضمن أحرفًا صغيرة وأحرفًا كبيرة وأرقامًا ورموزًا. لمزيد من المعلومات حول تعقيد كلمة المرور، راجع نهج كلمة مرور Azure SQL.

إذا لم تتوافق قيم المعلمات مع المتطلبات، فلن يقوم Azure SQL بنشر الخادم المنطقي.

أيضًا، تأكد من تدوين معرف تسجيل الدخول وكلمة المرور التي تقوم بإدخالها. سوف تستخدمها مرة أخرى قريبًا.

نظرًا إلى عدم تحديد قيمة للمعلمة environmentName، يتم استخدام القيمة الافتراضية Development.

انتظر حتى انتهاء عملية التشغيل. إذا فشل النشر مع رسالة تفيد بأن الموقع لا يقبل إنشاء خوادم قاعدة بيانات Windows Azure SQL جديدة، فحدد منطقة مختلفة مثل eastus أو eastus2.

تحقق من التوزيع

استخدم مدخل Microsoft Azure لفحص الموارد التي تقوم بنشرها ولتفقد نتائج كل عملية نشر.

  1. انتقل إلى مدخل Microsoft Azure وتأكد من أنك مشترك في بيئة الاختبار المعزولة عن طريق أداء ما يلي:

    أ. حدد الصورة الرمزية الخاصة بك في أعلى اليمين.
    ب. حدد تبديل الدليل. في القائمة، حدد دليل Microsoft Learn Sandbox.

  2. في الجزء الأيسر، حدد Resource groups.

  3. حدد [sandbox resource group name].

  4. في القسم Overview ستتمكن من رؤية نجاح نشر واحد. يمكنك أيضًا رؤية نشر خادم منطقي وقاعدة بيانات SQL، ولكن لا يتم نشر حساب التخزين للتدقيق.

    إشعار

    حساب التخزين باسم يبدأ بـ cloudshell لا علاقة له بالنشر الخاص بك وتم إنشاؤه بواسطة بيئة الاختبار المعزولة التعلم.

    Screenshot of the Azure portal resource group overview pane, with a section displaying a successful deployment.

  5. بجوار Deployments، حدد 1 Succeeded لمشاهدة تفاصيل التوزيع.

    Screenshot of the Azure portal resource group overview pane, displaying additional details of the successful deployment.

  6. حدد عملية النشر التي تُسمى main لمعرفة الموارد التي تم نشرها، ثم حدد Deployment details لتوسيعها.

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

    Screenshot of the Azure portal resource group overview pane for the specific deployment, with a logical server and database resource listed.

  7. اترك الصفحة مفتوحة في المتصفح. سوف تتحقق من عمليات النشر مرة أخرى لاحقاً.

إعادة النشر لبيئة الإنتاج

في النشر السابق، تم استخدام القيمة الافتراضية للمعلمة environmentName، ما يعني أنه تم تعيينها إلى Development.

الآن عليك تعيين قيمة المعلمة بشكل صريح إلى Production. توقع أنه، بإجراء هذا التغيير، سيتم نشر حساب التخزين لأغراض التدقيق، وسيتم تمكين التدقيق على الخادم المنطقي.

نشر القالب لبيئة الإنتاج

في محطة Visual Studio Code الطرفية، انشر قالب Bicep إلى Azure عن طريق تشغيل التعليمات البرمجية التالية:

az deployment group create --template-file main.bicep --parameters environmentName=Production location=westus3

في محطة Visual Studio Code الطرفية، انشر القالب إلى Azure عن طريق تشغيل أمر Azure PowerShell التالي:

New-AzResourceGroupDeployment -TemplateFile main.bicep -environmentName Production -location westus3

تنبيه

تأكد من استخدام نفس تسجيل الدخول وكلمة المرور التي استخدمتها سابقا، أو لن ينتهي النشر بنجاح.

بعد دقيقة أو دقيقتين، يجب أن ينتهي النشر بنجاح.

التحقق من إعادة النشر

لإكمال هذا التمرين، تحقق من أن عملية إعادة النشر قد انتهت بنجاح وأن عملية التدقيق قد تم تمكينها.

  1. ارجع إلى مدخل Microsoft Azure وانتقل إلى مجموعة الموارد الخاصة بك. إذا كانت لديك مجموعة موارد مفتوحة بالفعل، فحدد Refresh.

    يجب أن ترى أنه تم نشر حساب تخزين إضافي لأغراض التدقيق.

    Screenshot of the Azure portal resource group overview pane, showing that a storage account is deployed for auditing.

  2. حدد الخادم المنطقي (ابحث عن المورد مع نوع خادم SQL).

  3. في حقل البحث، أدخل Auditing. ضمن Security، حدد Auditing.

    Screenshot of the Azure portal interface for the logical server, showing the search field with Auditing entered.

  4. تحقق من تمكين التدقيق لهذا الخادم المنطقي.

    Screenshot of the Azure portal interface for the logical server, showing that the auditing configuration is enabled.