الدرس: نشر تطبيق ASP.NET Core وAzure SQL Database على Azure App Service

في هذا الدرس، تتعلم كيفية نشر تطبيق ASP.NET Core المعتمد على البيانات إلى Azure App Service والاتصال بقاعدة بيانات Azure SQL Database. ستقوم أيضا بنشر ذاكرة تخزين مؤقت لريديس لتمكين كود التخزين المؤقت في تطبيقك. Azure App Service هي خدمة استضافة ويب قابلة للتوسع وذاتية الترقيع يمكنها نشر التطبيقات بسهولة على Windows أو Linux. على الرغم من أن هذا الدرس يستخدم تطبيق ASP.NET Core 8.0، إلا أن العملية هي نفسها في إصدارات أخرى من ASP.NET Core.

مهم

أعلنت Azure Cache for Redis عن جدول زمني التقاعد لجميع وحدات SKU. نوصي بنقل نسخ Azure Cache for Redis الحالية إلى Azure Managed Redis في أقرب وقت ممكن.

إرشادات الهجرة:

لمزيد من التفاصيل حول التقاعد:

في هذا البرنامج التعليمي، تتعلم كيفية:

  • إنشاء بنية ذاكرة التخزين المؤقت ل App Service وSQL Database وRedis بشكل افتراضي آمن.
  • أسرار الاتصال الآمنة باستخدام هوية مدارة ومراجع Key Vault.
  • نشر نموذج من تطبيق ASP.NET Core إلى خدمة التطبيقات من مستودع GitHub.
  • الوصول إلى سلسلة الاتصال App Service وإعدادات التطبيق في التعليمات البرمجية للتطبيق.
  • قم بإجراء التحديثات وإعادة توزيع التعليمات البرمجية للتطبيق.
  • إنشاء مخطط قاعدة بيانات عن طريق تحميل مجموعة عمليات الترحيل.
  • استمر سجلات التشخيص من Azure.
  • إدارة التطبيق في بوابة Azure.
  • توفير نفس البنية المعمارية ونشرها باستخدام واجهة تحكم Azure Developer.
  • قم بتحسين سير العمل الخاص بتطويرك باستخدام GitHub Codespaces و GitHub Copilot.

المتطلبات الأساسية

تخطي إلى النهاية

إذا كنت تريد فقط رؤية التطبيق النموذجي في هذا الدرس يعمل بنظام Azure، فقط شغل الأوامر التالية في Azure Cloud Shell، واتبع الطلب:

dotnet tool install --global dotnet-ef
mkdir msdocs-app-service-sqldb-dotnetcore
cd msdocs-app-service-sqldb-dotnetcore
azd init --template msdocs-app-service-sqldb-dotnetcore
azd up

1. تشغيل العينة

أولا، يمكنك إعداد نموذج تطبيق يستند إلى البيانات كنقطة بداية. لراحتك، يتضمن مستودع sample repository تكوين dev container. تحتوي حاوية التطوير على كل ما تحتاجه لتطوير تطبيق، بما في ذلك قاعدة البيانات وذاكرة التخزين المؤقت وجميع متغيرات البيئة التي يحتاجها نموذج التطبيق. يمكن لحاوية المطور العمل في مساحة كود GitHub، مما يعني أنه يمكنك تشغيل العينة على أي جهاز كمبيوتر يحتوي على متصفح ويب.

الخطوة 1: في نافذة مستعرض جديدة:

  1. سجل الدخول إلى حسابك في GitHub.
  2. انتقل إلى https://github.com/Azure-Samples/msdocs-app-service-sqldb-dotnetcore/fork.
  3. قم بإلغاء تحديد نسخ الفرع الرئيسي فقط. تريد جميع الفروع.
  4. حدد Create fork.

الخطوة 2: في GitHub fork:

  1. حدد main>starter-no-infra لفرع البداية. يحتوي هذا الفرع فقط على مشروع نموذجي ولا يحتوي على ملفات أو إعدادات متعلقة ب Azure.
  2. حدد Code>Codespaces>Create codespace على starter-no-infra. تستغرق مساحة التعليمات البرمجية بضع دقائق لإعدادها.

الخطوة 3: في الوحدة الطرفية لمساحة التعليمات البرمجية:

  1. تشغيل عمليات ترحيل قاعدة البيانات باستخدام dotnet ef database update.
  2. شغّل التطبيق باستخدام dotnet run.
  3. عندما ترى الإعلام Your application running on port 5093 is available.، حدد فتح في المستعرض. يجب أن تشاهد نموذج التطبيق في علامة تبويب مستعرض جديدة. لإيقاف التطبيق، اكتب Ctrl+C.

تلميح

يمكنك أن تسأل GitHub Copilot عن هذا المستودع. على سبيل المثال:

  • @workspace ماذا يفعل هذا المشروع؟
  • @workspace ماذا يفعل المجلد .devcontainer؟

هل تواجه مشكلات؟ تحقق من قسم استكشاف الأخطاء وإصلاحها.

2. إنشاء خدمة التطبيقات وقاعدة البيانات وذاكرة التخزين المؤقت

في هذه الخطوة، تنشئ موارد Azure. الخطوات المستخدمة في هذا الدرس تنشئ مجموعة من الموارد الآمنة بالافتراضي التي تشمل App Service وAzure SQL Database وAzure Cache. بالنسبة لعملية الإنشاء، ستحدد:

  • اسم تطبيق الويب. يتم استخدامه كجزء من اسم DNS لتطبيقك.
  • المنطقة لتشغيل التطبيق فعلياً في العالم. كما يتم استخدامه كجزء من اسم DNS لتطبيقك.
  • مكدس الذاكرة المؤقتة لوقت التشغيل للتطبيق. هي المكان الذي تختار فيه نسخة .NET لاستخدامها في تطبيقك.
  • خطة الاستضافة للتطبيق. إنها طبقة الأسعار التي تتضمن مجموعة الميزات وسعة التحجيم لتطبيقك.
  • مجموعة الموارد للتطبيق. تتيح لك مجموعة الموارد تجميع جميع موارد Azure اللازمة للتطبيق (في حاوية منطقية).

سجل الدخول إلى بوابة Azure واتبع هذه الخطوات لإنشاء موارد Azure App Service الخاصة بك.

الخطوة 1: في بوابة Azure:

  1. في شريط البحث العلوي، اكتب app service.
  2. حدد العنصر المسمى App Service ضمن عنوان Services .
  3. حدد إنشاء>تطبيق ويب. يمكنك أيضا التنقل مباشرة إلى <وسيد الخلق c0>.

الخطوة 2: في صفحة إنشاء تطبيق ويب، املأ النموذج كما يلي.

  1. الاسم: msdocs-core-sql-XYZ. سيتم إنشاء مجموعة موارد باسم msdocs-core-sql-XYZ_group لك.
  2. مكدس وقت التشغيل: .NET 8 (LTS).
  3. نظام التشغيل: Linux.
  4. المنطقة: منطقتك المفضلة.
  5. خطة Linux: إنشاء جديد واستخدام اسم msdocs-core-sql-XYZ.
  6. خطة التسعير: Basic B1. عندما تكون مستعدا، يمكنك التوسع إلى مستوى تسعير مختلف.

الخطوة 3:

  1. حدد علامة التبويب قاعدة البيانات .
  2. حدد إنشاء قاعدة بيانات.
  3. في Engine، حدد SQLAzure.
  4. أنشئ ذاكرة تخزين مؤقت لريديس.
  5. في الاسم (ضمن ذاكرة التخزين المؤقت)، أدخل اسما لذاكرة التخزين المؤقت.
  6. في SKU، حدد Basic.

الخطوة 4:

  1. حدد علامة التبويب Deployment .
  2. تمكين النشر المستمر.
  3. في Organization، اختر GitHub الاسم المستعار.
  4. في Repository، حدد msdocs-app-service-sqldb-dotnetcore.
  5. في Branch، حدد starter-no-infra.
  6. تأكد من تعطيل المصادقة الأساسية .
  7. حدد "Review + create".
  8. وبعد اكتمال عملية التحقق، حدد Create.

الخطوة 5: يستغرق النشر بضع دقائق حتى يكتمل. بعد اكتمال التوزيع، حدد الزر انتقال إلى المورد. يتم نقلك مباشرة إلى تطبيق App Service، ولكن يتم إنشاء الموارد التالية:

  • مجموعة الموارد: الحاوية لكافة الموارد التي تم إنشاؤها.
  • خطة App Service: تحدد موارد الحوسبة ل App Service. يتم إنشاء خطة Linux في الطبقة الأساسية.
  • App Service: تمثل تطبيقك وتعمل في خطة App Service.
  • الشبكة الظاهرية: متكاملة مع تطبيق App Service وتعزل حركة مرور الشبكة الخلفية.
  • نقاط النهاية الخاصة: الوصول إلى نقاط النهاية لمخزن المفاتيح وخادم قاعدة البيانات وذاكرة التخزين المؤقت Redis في الشبكة الظاهرية.
  • واجهات الشبكة: تمثل عناوين IP الخاصة، واحدة لكل نقطة من نقاط النهاية الخاصة.
  • Azure SQL Database server: يمكن الوصول إليه فقط من خلف نقطة النهاية الخاصة.
  • Azure SQL Database: يتم إنشاء قاعدة بيانات ومستخدم لك على الخادم.
  • Redis: يمكن الوصول إليه فقط من خلف نقطة النهاية الخاصة به.
  • Key vault: يمكن الوصول إليه فقط من خلف نقطة النهاية الخاصة به. يستخدم لإدارة البيانات السرية لتطبيق App Service.
  • مناطق Private DNS: تفعيل حل DNS لخزنة المفاتيح، وخادم قاعدة البيانات، وذاكرة Redis المؤقتة في الشبكة الافتراضية.

3. تأمين أسرار الاتصال

معالج الإنشاء يولد متغير الاتصال لك بالفعل ك .NET سلاسل الاتصال وapp settings. ومع ذلك، فإن أفضل ممارسة أمنية هي الاحتفاظ بأسرار خارج App Service تماما. ستنقل أسرارك إلى key vault وتغير إعداد التطبيق إلى Key Vault references بمساعدة Service Connectors.

تلميح

لاستخدام المصادقة بدون كلمة مرور، راجع كيف أعمل تغيير اتصال قاعدة بيانات SQL لاستخدام هوية مدارة بدلا من ذلك؟

الخطوة 1: استرجاع connection string

  1. في القائمة اليسرى من صفحة App Service، حدد Settings > Environment variables > Connection strings.
  2. حدد AZURE_SQL_CONNECTIONSTRING.
  3. في add/edit connection string، في حقل Value، ابحث عن جزء Password= في نهاية السلسلة.
  4. انسخ سلسلة كلمة المرور بعد كلمة المرور= لاستخدامها لاحقا. تتيح لك هذه السلسلة connection string الاتصال بقاعدة بيانات SQL المؤمنة خلف نقطة نهاية خاصة. ومع ذلك، يتم حفظ الأسرار مباشرة في تطبيق App Service، وهو ليس الأفضل. وبالمثل، يحتوي connection string ذاكرة Redis المؤقتة في تبويب إعدادات App على سر. ستغير هذا.

الخطوة 2: إنشاء مخزن رئيسي للإدارة الآمنة للبيانات السرية

  1. في شريط البحث العلوي، اكتب "key vault"، ثم اختر Marketplace>Key Vault.
  2. في Resource Group، حدد msdocs-core-sql-XYZ_group.
  3. في اسم Key vault، اكتب اسما يتكون من أحرف وأرقام فقط.
  4. في Region، قم بتعيينه إلى نفس موقع مجموعة الموارد.

الخطوة 3: تأمين خزنة المفاتيح باستخدام نقطة نهاية خاصة

  1. حدد علامة التبويب Networking
  2. إلغاء تحديد تمكين الوصول العام.
  3. حدد Create a private endpoint.
  4. في Resource group، حدد msdocs-core-sql-XYZ_group.
  5. في مربع الحوار، في الموقع، حدد نفس موقع تطبيق App Service.
  6. في Name، اكتب msdocs-core-sql-XYZVvaultEndpoint.
  7. في الشبكة الظاهرية، حدد الشبكة الظاهرية في مجموعة msdocs-core-sql-XYZ_group .
  8. في الشبكة الفرعية، حدد الشبكة الفرعية المتوافقة المتوفرة. قام معالج Web App بإنشائه لراحتك.
  9. حدد موافق.
  10. حدد Review + create، ثم حدد Create. انتظر حتى ينتهي نشر مخزن المفاتيح. يجب أن ترى "اكتمل النشر الخاص بك. "

الخطوة 4:

  1. في شريط البحث العلوي، اكتب msdocs-core-sql، ثم مورد App Service المسمى msdocs-core-sql-XYZ.
  2. في صفحة App Service، في القائمة اليمنى، حدد Settings > Service Connector. هناك بالفعل موصلان، أنشأهما معالج إنشاء التطبيق لك.
  3. حدد خانة الاختيار بجوار موصل قاعدة بيانات SQL، ثم حدد تحرير.
  4. حدد علامة التبويب مصادقة.
  5. في كلمة المرور، الصق كلمة المرور التي نسختها سابقا.
  6. اختر Store Secret في Key Vault.
  7. تحت Key Vault Connection، اختر إنشاء جديد. يتم فتح مربع حوار إنشاء اتصال أعلى مربع حوار التحرير.

الخطوة 5: أنشأ الاتصال Key Vault

  1. في مربع Create connection للاتصال Key Vault، في Key Vault، اختر key vault الذي أنشأته سابقا.
  2. حدد "استعراض + إنشاء".
  3. عند اكتمال التحقق من الصحة، حدد إنشاء.

الخطوة 6: إنهاء إعدادات موصل قاعدة بيانات SQL

  1. لقد عدت إلى مربع حوار التحرير ل defaultConnector. في علامة التبويب Authentication ، انتظر حتى يتم إنشاء موصل key vault. عند الانتهاء، يقوم منسدلي Key Vault Connection بتحديده تلقائيا.
  2. حدد Next: Networking.
  3. حدد تكوين قواعد جدار الحماية لتمكين الوصول إلى الخدمة المستهدفة. قام معالج إنشاء التطبيق بتأمين قاعدة بيانات SQL بالفعل بنقطة نهاية خاصة.
  4. حدد حفظ. انتظر حتى يظهر إعلام نجاح التحديث.

الخطوة 7: تكوين موصل Redis لاستخدام Key Vault secrets

  1. في صفحة Service Connector، حدد خانة الاختيار بجوار موصل Cache for Redis، ثم حدد Edit.
  2. حدد علامة التبويب مصادقة.
  3. اختر Store Secret في Key Vault.
  4. تحت Key Vault Connection، اختر key vault الذي أنشأته.
  5. حدد Next: Networking.
  6. حدد تكوين قواعد جدار الحماية لتمكين الوصول إلى الخدمة المستهدفة.
  7. حدد حفظ. انتظر حتى يظهر إعلام نجاح التحديث.

الخطوة 8: تحقق من تكامل Key Vault

  1. من القائمة اليسرى، حدد Settings > Environment variables > Connection strings مرة أخرى.
  2. بجوار AZURE_SQL_CONNECTIONSTRING، حدد Show value. يجب أن تكون القيمة ، مما يعني أنها <مرجع خزنة مفتاح c1>key لأن السر الآن يدار في خزنة المفاتيح.
  3. للتحقق من connection string Redis، اختر تبويب App settings. بجانب AZURE_REDIS_CONNECTIONSTRING، اختر عرض القيمة. يجب أن تكون القيمة @Microsoft.KeyVault(...) أيضا.

للتلخيص، تتضمن عملية تأمين أسرار الاتصال الخاصة بك ما يلي:

  • استرداد أسرار الاتصال من متغيرات البيئة لتطبيق App Service.
  • إنشاء مفتاح رئيسي.
  • إنشاء اتصال Key Vault مع الهوية المدارة المعينة من النظام.
  • تحديث موصلات الخدمة لتخزين الأسرار في مخزن المفاتيح.

4. نشر نموذج التعليمات البرمجية

في هذه الخطوة، تقوم بتكوين نشر GitHub باستخدام GitHub Actions. إنها مجرد واحدة من العديد من الطرق للتوزيع في خدمة التطبيق، ولكنها أيضا طريقة رائعة للحصول على تكامل مستمر في عملية التوزيع الخاصة بك. افتراضيا، كل git push إلى مستودع GitHub يبدأ إجراء البناء والنشر.

Step 1: في مساحة الشيفرة GitHub لفرع العينة، شغل git pull origin starter-no-infra. يؤدي هذا إلى سحب ملف سير العمل الملتزم به حديثا إلى مساحة التعليمات البرمجية الخاصة بك.

الخطوة 2 (الخيار 1: مع GitHub Copilot):

  1. ابدأ جلسة دردشة جديدة عن طريق تحديد طريقة عرض الدردشة، ثم تحديد +.
  2. اسأل: "@workspace كيف يتصل التطبيق بقاعدة البيانات والكاش؟" Copilot قد يشرح لك <فئة > c1 / وكيف يتم تكوينها في Program.cs.
  3. اسأل: "في وضع الإنتاج، أريد من التطبيق أن يستخدم connection string المسمى AZURE_SQL_CONNECTIONSTRING لقاعدة البيانات وإعداد التطبيق المسمى AZURE_REDIS_CONNECTIONSTRING." قد يعطيك Copilot اقتراح كود مشابه لذلك الموجود في الخيار 2: بدون GitHub Copilot الخطوات التالية وحتى تطلب منك إجراء التغيير في ملف Program.cs.
  4. افتح Program.cs في المستكشف وأضف اقتراح التعليمات البرمجية. GitHub Copilot لا يعطيك نفس الرد في كل مرة، وليس دائما صحيحا. قد تحتاج إلى طرح المزيد من الأسئلة لضبط استجابتها. للحصول على نصائح، راجع ماذا يمكنني أن أفعل ب GitHub Copilot في مساحة الشيفرة الخاصة بي؟.

الخطوة 2 (الخيار 2: بدون GitHub Copilot):

  1. افتح Program.cs في المستكشف.
  2. ابحث عن التعليمات البرمجية التي تم التعليق عليها (الأسطر 12-21) وقم بإلغاء التعليق عليها. تتصل هذه التعليمة البرمجية بقاعدة البيانات باستخدام AZURE_SQL_CONNECTIONSTRING ذاكرة التخزين المؤقت Redis وتتصل بها باستخدام إعداد AZURE_REDIS_CONNECTIONSTRINGالتطبيق .

الخطوة 3 (الخيار 1: مع GitHub Copilot):

  1. افتح .github/workflows/starter-no-infra_msdocs-core-sql-XYZ في المستكشف. معالج إنشاء خدمة التطبيقات أنشأ هذا الملف.
  2. قم بتمييز dotnet publish الخطوة وحدد .
  3. Ask Copilot، "تثبيت dotnet ef، ثم أنشئ حزمة ترحيل في نفس مجلد الإخراج."
  4. إذا كان الاقتراح مقبولا، فحدد قبول. GitHub Copilot لا يعطيك نفس الرد في كل مرة، وليس دائما صحيحا. قد تحتاج إلى طرح المزيد من الأسئلة لضبط استجابتها. للحصول على نصائح، راجع ماذا يمكنني أن أفعل ب GitHub Copilot في مساحة الشيفرة الخاصة بي؟.

الخطوة 3 (الخيار 2: بدون GitHub Copilot):

  1. افتح .github/workflows/starter-no-infra_msdocs-core-sql-XYZ في المستكشف. أنشأ معالج إنشاء خدمة التطبيقات هذا الملف
  2. تحت خطوة dotnet publish، أضف خطوة لتثبيت أداة Entity Framework Core مع الأمر dotnet tool install -g dotnet-ef --version 8.*.
  3. ضمن الخطوة الجديدة، أضف خطوة أخرى لإنشاء حزمة ترحيل قاعدة بيانات في حزمة النشر: dotnet ef migrations bundle --runtime linux-x64 -o ${{env.DOTNET_ROOT}}/myapp/migrationsbundle. حزمة الترحيل هي ملف تنفيذي مستقل يمكنك تشغيله في بيئة الإنتاج دون الحاجة إلى حزمة تطوير البرمجيات .NET. حاوية خدمة التطبيقات تحتوي فقط على وقت تشغيل .NET وليس حزمة تطوير .NET.

الخطوة 4:

  1. حدد ملحق البرنامج للتحكم بالمصادر.
  2. في مربع النص، اكتب رسالة التزام مثل Configure Azure database and cache connections. أو اختر ودع GitHub Copilot يولد رسالة التزام لك.
  3. حدد Commit، ثم قم بالتأكيد باستخدام Yes.
  4. حدد مزامنة التغييرات 1، ثم تأكد من موافق.

Step 5: عودة إلى صفحة مركز النشر في بوابة Azure:

  1. حدد علامة التبويب Logs، ثم حدد Refresh لمشاهدة تشغيل التوزيع الجديد.
  2. في عنصر السجل لتشغيل النشر، حدد إدخال Build/Deploy Logs مع أحدث طابع زمني.

الخطوة 6: يتم أخذك إلى مستودع GitHub الخاص بك وترى أن الإجراء GitHub يعمل. يحدد ملف سير العمل مرحلتين منفصلتين، الإنشاء والتوزيع. انتظر حتى تظهر GitHub الجولة حالة Success. يستغرق حوالي 5 دقائق.

هل تواجه مشكلات؟ تحقق من قسم استكشاف الأخطاء وإصلاحها.

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

مع قاعدة بيانات SQL المحمية بالشبكة الظاهرية، أسهل طريقة لتشغيل عمليات ترحيل قاعدة بيانات dotnet هي في جلسة SSH مع حاوية Linux في خدمة التطبيقات.

الخطوة 1: العودة إلى صفحة App Service، في القائمة اليسرى،

  1. حدد Development Tools>SSH.
  2. حدد Go. (يستغرق بدء التشغيل بضع دقائق.)

الخطوة 2: في جلسة SSH:

  1. شغّل cd /home/site/wwwroot. فيما يلي جميع الملفات المنشورة.
  2. شغل حزمة الترحيل التي أنشأها سير عمل GitHub، مع الأمر ./migrationsbundle -- --environment Production. إذا نجحت، فإن خدمة التطبيقات تتصل بنجاح بقاعدة بيانات SQL. تذكر أن --environment Production يتوافق مع تغييرات التعليمات البرمجية التي أجريتها في Program.cs.

في جلسة SSH، يمكن أن تستمر التغييرات على الملفات في /home فقط بعد إعادة تشغيل التطبيق. التغييرات خارج /home غير مستمرة.

هل تواجه مشكلات؟ تحقق من قسم استكشاف الأخطاء وإصلاحها.

6. تصفح إلى التطبيق

الخطوة 1: في صفحة App Service:

  1. من القائمة اليسرى، حدد نظرة عامة.
  2. حدد عنوان URL لتطبيقك.

الخطوة 2: إضافة بعض المهام إلى القائمة. مبروك، أنت تستخدم تطبيق ويب في Azure App Service، مع اتصال آمن ب Azure SQL Database.

تلميح

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

7. دفق سجلات التشخيص

يلتقط Azure App Service جميع سجلات الكونسول لمساعدتك في تشخيص المشكلات في تطبيقك. يتضمن نموذج التطبيق رمز التسجيل في كل نقطة من نقاط النهاية الخاصة به لتوضيح هذه الإمكانية.

الخطوة 1: في صفحة App Service:

  1. من القائمة اليسرى، حدد Monitoring>App Service logs.
  2. ضمن سجل التطبيقات، حدد نظام الملفات.
  3. في القائمة العلوية، حدد حفظ.

الخطوة 2: من القائمة اليسرى، حدد Log stream. ترى سجلات تطبيقك، بما في ذلك سجلات النظام الأساسي والسجلات من داخل الحاوية.

8- تنظيف الموارد

عندما تنتهي، يمكنك حذف جميع الموارد من اشتراكك في Azure عن طريق حذف مجموعة الموارد.

الخطوة 1: في شريط البحث أعلى بوابة Azure:

  1. أدخل اسم مجموعة الموارد.
  2. حدد مجموعة الموارد.

الخطوة 2: في صفحة مجموعة الموارد، حدد حذف مجموعة الموارد.

الخطوة 3:

  1. أدخل اسم مجموعة الموارد لتأكيد حذفك.
  2. حدد حذف.

2. إنشاء موارد Azure ونشر تطبيق نموذجي

في هذه الخطوة، تنشئ موارد Azure وتنشر تطبيق نموذجي على App Service on Linux. الخطوات المستخدمة في هذا الدرس تخلق مجموعة من الموارد الآمنة افتراضيا التي تشمل خدمة التطبيقات، وقاعدة بيانات Azure SQL، وذاكرة Redis المؤقتة.

حاوية المطور تحتوي بالفعل على Azure Developer CLI (AZD).

  1. من جذر المستودع، قم بتشغيل azd init.

    azd init --template dotnet-app-service-sqldb-infra
    
  2. عند المطالبة، قدم الإجابات التالية:

    السؤال الإجابة
    الدليل الحالي ليس فارغا. هل ترغب في تهيئة مشروع هنا في "<دليلك>"؟ السنة
    ماذا تريد أن تفعل بهذه الملفات؟ الاحتفاظ بالملفات الموجودة دون تغيير
    أدخل اسم بيئة جديدة اكتب اسم فريد. يستخدم قالب AZD هذا الاسم كجزء من اسم DNS لتطبيق الويب الخاص بك في Azure (<app-name>-<hash>.azurewebsites.net). يسمح بالأحرف الأبجدية الرقمية والواصلات.
  3. سجل الدخول إلى Azure عن طريق تشغيل أمر azd auth login واتباع التعليم:

    azd auth login
    
  4. أنشئ الموارد Azure اللازمة ونشر كود التطبيق باستخدام أمر azd up. اتبع التعليمات لاختيار الاشتراك المطلوب والموقع لموارد Azure.

    azd up
    

    azd up يستغرق الأمر حوالي 15 دقيقة لإكماله (تستغرق ذاكرة التخزين المؤقت Redis معظم الوقت). كما أنه يقوم بتجميع ونشر التعليمات البرمجية للتطبيق الخاص بك، ولكنك ستقوم بتعديل التعليمات البرمجية الخاصة بك لاحقا للعمل مع App Service. أثناء تشغيله، يوفر الأمر رسائل حول عملية التوفير والنشر، بما في ذلك رابط للنشر في Azure. عند الانتهاء، يعرض الأمر أيضا ارتباطا إلى تطبيق التوزيع.

    يحتوي قالب AZD هذا على ملفات (azure.yaml ودليل infra) التي تولد بنية آمنة بالافتراضي مع الموارد Azure التالية:

    • مجموعة الموارد: الحاوية لكافة الموارد التي تم إنشاؤها.
    • خطة App Service: تحدد موارد الحوسبة ل App Service. يتم إنشاء خطة Linux في الطبقة الأساسية.
    • App Service: تمثل تطبيقك وتعمل في خطة App Service.
    • الشبكة الظاهرية: متكاملة مع تطبيق App Service وتعزل حركة مرور الشبكة الخلفية.
    • نقاط النهاية الخاصة: الوصول إلى نقاط النهاية لمخزن المفاتيح وخادم قاعدة البيانات وذاكرة التخزين المؤقت Redis في الشبكة الظاهرية.
    • واجهات الشبكة: تمثل عناوين IP الخاصة، واحدة لكل نقطة من نقاط النهاية الخاصة.
    • Azure SQL Database server: يمكن الوصول إليه فقط من خلف نقطة النهاية الخاصة.
    • Azure SQL Database: يتم إنشاء قاعدة بيانات ومستخدم لك على الخادم.
    • Redis: يمكن الوصول إليه فقط من خلف نقطة النهاية الخاصة به.
    • Key vault: يمكن الوصول إليه فقط من خلف نقطة النهاية الخاصة به. يستخدم لإدارة البيانات السرية لتطبيق App Service.
    • مناطق Private DNS: تفعيل حل DNS لخزنة المفاتيح، وخادم قاعدة البيانات، وذاكرة Redis المؤقتة في الشبكة الافتراضية.

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

هل تواجه مشكلات؟ تحقق من قسم استكشاف الأخطاء وإصلاحها.

3. التحقق من سلسلة الاتصال

تلميح

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

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

  1. في إخراج AZD، ابحث عن الإعدادات AZURE_SQL_CONNECTIONSTRING و AZURE_REDIS_CONNECTIONSTRING. يتم عرض أسماء الإعدادات فقط. تبدو كما يلي في إخراج AZD:

     App Service app has the following connection strings:
         - AZURE_SQL_CONNECTIONSTRING
         - AZURE_REDIS_CONNECTIONSTRING
         - AZURE_KEYVAULT_RESOURCEENDPOINT
         - AZURE_KEYVAULT_SCOPE
     

    يحتوي AZURE_SQL_CONNECTIONSTRING على connection string قاعدة بيانات SQL في Azure، ويحتوي AZURE_REDIS_CONNECTIONSTRING على connection string إلى ذاكرة التخزين المؤقت ل Redis Azure. تحتاج إلى استخدامها في التعليمات البرمجية الخاصة بك لاحقا.

  2. لراحتك، يعرض لك قالب AZD الارتباط المباشر إلى صفحة إعدادات التطبيق. ابحث عن الارتباط وافتحه في علامة تبويب مستعرض جديدة.

هل تواجه مشكلات؟ تحقق من قسم استكشاف الأخطاء وإصلاحها.

4. تعديل نموذج التعليمات البرمجية وإعادة النشر

  1. في مساحة الشيفرة GitHub، ابدأ جلسة دردشة جديدة باختيار عرض Chat، ثم اختيار +.

  2. اسأل: "@workspace كيف يتصل التطبيق بقاعدة البيانات والكاش؟" Copilot قد يشرح لك <فئة > c1 / وكيف يتم تكوينها في Program.cs.

  3. اسأل: "في وضع الإنتاج، أريد أن يستخدم التطبيق connection string المسمى AZURE_SQL_CONNECTIONSTRING لقاعدة البيانات وإعداد التطبيق المسمى AZURE_REDIS_CONNECTIONSTRING*." قد يعطيك Copilot اقتراح كود مشابه لما في الخيار 2: بدون GitHub Copilot الخطوات التالية وحتى تطلب منك إجراء التغيير في ملف Program.cs.

  4. افتح Program.cs في المستكشف وأضف اقتراح التعليمات البرمجية.

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

قبل نشر هذه التغييرات، لا تزال بحاجة إلى إنشاء مجموعة ترحيل.

هل تواجه مشكلات؟ تحقق من قسم استكشاف الأخطاء وإصلاحها.

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

مع قاعدة بيانات SQL المحمية بواسطة الشبكة الظاهرية، أسهل طريقة لتشغيل عمليات ترحيل قاعدة البيانات هي في جلسة SSH مع حاوية App Service. ومع ذلك، فإن حاويات App Service Linux لا تحتوي على حزمة تطوير .NET، لذا أسهل طريقة لتشغيل ترحيلات قواعد البيانات هي رفع حزمة ترحيل مستقلة.

  1. إنشاء مجموعة عمليات ترحيل لمشروعك باستخدام الأمر التالي:

    dotnet ef migrations bundle --runtime linux-x64 -o migrationsbundle
    

    تلميح

    تم إعداد نموذج التطبيق (انظر DotNetCoreSqlDb.csproj) ليشمل هذا الملف migrationsbundle. azd package أثناء المرحلة، ستتم إضافة migrationsbundle إلى حزمة التوزيع.

  2. انشر جميع التغييرات باستخدام azd up.

    azd up
    
  3. في إخراج AZD، ابحث عن عنوان URL لجلسة SSH وانتقل إليه في المتصفح. يبدو مثل هذا في الإخراج:

     Open SSH session to App Service container at: <URL>
     
  4. في جلسة SSH، قم بتشغيل الأوامر التالية:

    cd /home/site/wwwroot
    ./migrationsbundle -- --environment Production
    

    إذا نجحت، فإن App Service تتصل بنجاح بقاعدة البيانات. تذكر أن --environment Production يتوافق مع تغييرات التعليمات البرمجية التي أجريتها في Program.cs.

    إشعار

    يمكن أن تستمر التغييرات التي يتم إجراؤها على الملفات في /home فقط بعد عمليات إعادة تشغيل التطبيق. التغييرات خارج /home غير مستمرة.

هل تواجه مشكلات؟ تحقق من قسم استكشاف الأخطاء وإصلاحها.

6. تصفح إلى التطبيق

  1. في إخراج AZD، ابحث عن عنوان URL لتطبيقك وانتقل إليه في المستعرض. يبدو عنوان URL كما يلي في إخراج AZD:

     Deploying services (azd deploy)
    
       (✓) Done: Deploying service web
       - Endpoint: <URL>
     
  2. أضف القليل من المهام إلى القائمة.

    لقطة شاشة لتطبيق الويب ASP.NET Core مع قاعدة بيانات SQL تعمل على Azure تظهر المهام.

    مبروك، أنت تستخدم تطبيق ويب في Azure App Service، مع اتصال آمن ب Azure SQL Database.

هل تواجه مشكلات؟ تحقق من قسم استكشاف الأخطاء وإصلاحها.

7. دفق سجلات التشخيص

يمكن ل Azure App Service التقاط سجلات الكونسول لمساعدتك في تشخيص المشكلات في تطبيقك. للراحة، قالب AZD بالفعل enabled تسجيل السجلات إلى نظام الملفات المحلي وهو شحن السجلات إلى مساحة عمل Log Analytics.

يتضمن نموذج التطبيق عبارات تسجيل قياسية لإثبات هذه الإمكانية، كما هو موضح في القصاصة البرمجية التالية:

public async Task<IActionResult> Index()
{
    var todoItems = await _cache.GetAsync(_TodoItemsCacheKey);
    if (todoItems != null)
    {
        _logger.LogInformation("Data from cache.");
        var todoList = JsonConvert.DeserializeObject<List<Todo>>(Encoding.UTF8.GetString(todoItems));
        return View(todoList);
    }
    else
    {
        _logger.LogInformation("Data from database.");
        var todoList = await _context.Todo.ToListAsync();
        var serializedTodoList = JsonConvert.SerializeObject(todoList);
        await _cache.SetAsync(_TodoItemsCacheKey, Encoding.UTF8.GetBytes(serializedTodoList));
        return View(todoList);
    }
}

في إخراج AZD، ابحث عن الارتباط لدفق سجلات App Service وانتقل إليه في المتصفح. يبدو الارتباط كما يلي في إخراج AZD:

Stream App Service logs at: <URL>

تعرف على المزيد حول تسجيل الدخول .NET التطبيقات في السلسلة على تمكين Azure Monitor OpenTelemetry لتطبيقات .NET وNode.jsو Python و Java applications.

هل تواجه مشكلات؟ تحقق من قسم استكشاف الأخطاء وإصلاحها.

8- تنظيف الموارد

لحذف جميع موارد Azure في بيئة النشر الحالية، قم بتشغيل azd down واتبع التعليمات.

azd down

استكشاف الأخطاء وإصلاحها

عرض نشر البوابة ل Azure SQL Database يظهر حالة تعارض

اعتمادا على اشتراكك والمنطقة التي تختارها، قد ترى حالة النشر ل Azure SQL Database Conflict، مع الرسالة التالية في تفاصيل العمليات:

Location '<region>' is not accepting creation of new Windows Azure SQL Database servers at this time.

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

في بوابة Azure، تظهر واجهة تدفق السجلات لتطبيق الويب أخطاء في الشبكة

قد ترى هذا الخطأ:

Unable to open a connection to your app. This may be due to any network security groups or IP restriction rules that you have placed on your app. To use log streaming, please make sure you are able to access your app directly from your current network.

عادة ما يكون هذا خطأ عابرا عند بدء تشغيل التطبيق لأول مرة. انتظر بضع دقائق وتحقق مرة أخرى.

تظهر جلسة SSH في المستعرض SSH CONN CLOSED

يستغرق الأمر بضع دقائق حتى تبدأ حاوية Linux. انتظر بضع دقائق وتحقق مرة أخرى.

تظهر صفحة دفق سجل المدخل ولكن لا توجد Connected! سجلات

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

الأسئلة الشائعة

كم يكلف هذا الإعداد؟

تسعير الموارد التي تم إنشاؤها كما يلي:

  • يتم إنشاء خطة App Service في الطبقة الأساسية، ويمكن تغيير حجمها زيادة أو نقصانًا. راجع تسعير App Service.
  • يتم إنشاء Azure SQL Database في طبقة عامة الأغراض بدون خادم على أجهزة سلسلة Standard، مع الحد الأدنى من الأنوية. هناك تكلفة صغيرة ويمكن توزيعها على مناطق أخرى. يمكنك تقليل التكلفة بشكل أكبر عن طريق تقليل الحد الأقصى لحجمها، أو يمكنك توسيع نطاقها عن طريق ضبط مستوى الخدمة وطبقة الحوسبة وتكوين الأجهزة وعدد الذاكرات الأساسية وحجم قاعدة البيانات والتكرار في المنطقة. انظر Azure SQL Database التسعير.
  • يتم إنشاء Azure Cache for Redis بطبقة Basic مع الحد الأدنى لحجم ذاكرة التخزين المؤقت. هناك تكلفة صغيرة مرتبطة بهذا المستوى. يمكنك توسيع نطاقه إلى مستويات أداء أعلى للحصول على قابلية وصول عالية، وتكوين أنظمة المجموعات، وميزات أخرى. انظر Azure Cache for Redis التسعير. لمزيد من المعلومات، راجع تسعير Azure Managed Redis.
  • لا تتحمل الشبكة الظاهرية رسوما ما لم تقم بتكوين وظائف إضافية، مثل التناظر. انظر Azure Virtual Network التسعير.
  • تتحمل منطقة DNS الخاصة رسوما صغيرة. انظر Azure DNS التسعير.

كيف أتصل بخادم Azure SQL Database الذي يؤمن خلف الشبكة الافتراضية باستخدام أدوات أخرى؟

  • للوصول الأساسي من أداة سطر الأوامر، يمكنك التشغيل sqlcmd من وحدة SSH الطرفية للتطبيق. لا تأتي حاوية التطبيق مع sqlcmd، لذا يجب عليك تثبيتها يدوياً. تذكر أن العميل المثبت لا يستمر عبر عمليات إعادة تشغيل التطبيق.
  • للاتصال من عميل SQL Server Management Studio أو من Visual Studio، يجب أن يكون جهازك داخل الشبكة الافتراضية. على سبيل المثال، قد يكون جهاز افتراضي Azure متصل بأحد الشبكات الفرعية، أو جهازا في شبكة محلية لديه اتصال site to-site VPN مع الشبكة الافتراضية Azure.

كيف يعمل تطوير التطبيقات المحلية مع GitHub Actions؟

خذ ملف سير العمل الذي تم إنشاؤه تلقائيا من خدمة التطبيق كمثال، git push كل يبدأ تشغيل بنية وتوزيع جديد. من نسخة محلية من مستودع GitHub، تقوم بجعل التحديثات المطلوبة تدفعه إلى GitHub. على سبيل المثال:

git add .
git commit -m "<some-message>"
git push origin main

كيف يمكنني تصحيح أخطاء الأخطاء أثناء نشر GitHub Actions؟

إذا فشلت خطوة في ملف سير العمل التلقائي على GitHub، جرب تعديل الأمر الفاشل لتوليد مخرجات أكثر تفصيلا. على سبيل المثال، يمكنك الحصول على المزيد من الإخراج من أي من dotnet الأوامر عن طريق إضافة -v الخيار . قم بتثبيت التغييرات ودفعها لتشغيل توزيع آخر إلى App Service.

ليس لدي أذونات لإنشاء هوية معينة من قبل المستخدم

انظر إعداد GitHub Actions النشر من مركز النشر.

كيف أعمل تغيير اتصال قاعدة بيانات SQL لاستخدام هوية مدارة بدلا من ذلك؟

يدير Service Connector connection string الافتراضي لقاعدة بيانات SQL، تحت اسم defaultConnector، ويستخدم مصادقة SQL. لاستبداله باتصال يستخدم هوية مدارة، قم بتشغيل الأوامر التالية في cloud shell بعد استبدال العناصر النائبة:

az extension add --name serviceconnector-passwordless --upgrade
az sql server update --enable-public-network true
az webapp connection delete sql --connection defaultConnector --resource-group <group-name> --name <app-name>
az webapp connection create sql --connection defaultConnector --resource-group <group-name> --name <app-name> --target-resource-group <group-name> --server <database-server-name> --database <database-name> --client-type dotnet --system-identity --config-connstr true
az sql server update --enable-public-network false

بشكل افتراضي، يقوم الأمر az webapp connection create sql --client-type dotnet --system-identity --config-connstr ما يلي:

  • يحدد المستخدم كمسؤول Microsoft Entra ID لخادم قاعدة بيانات SQL.
  • إنشاء هوية مدارة معينة من قبل النظام ومنحها حق الوصول إلى قاعدة البيانات.
  • ينشئ connection string بدون كلمة مرور يسمى AZURE_SQL_CONNECTIONGSTRING، والذي يستخدمه تطبيقك بالفعل في نهاية التعليم.

يجب أن يكون لتطبيقك الآن اتصال بقاعدة بيانات SQL. لمزيد من المعلومات، راجع Tutorial: الاتصال بقواعد البيانات Azure من App Service بدون أسرار باستخدام هوية مدارة.

تلميح

ألا تريد تمكين اتصال الشبكة العامة؟ يمكنك تخطي az sql server update --enable-public-network true عن طريق تشغيل الأوامر من غلاف سحابي Azure المدمج مع شبكتك الافتراضية إذا كان لديك تعيين دور Owner على اشتراكك.

لمنح الهوية الوصول المطلوب إلى قاعدة البيانات التي يتم تأمينها بواسطة الشبكة الافتراضية، يحتاج az webapp connection create sql إلى اتصال مباشر مع Entra ID المصادقة مع خادم قاعدة البيانات. افتراضيا، لا يمتلك غلاف سحابة Azure هذا الوصول إلى قاعدة البيانات المؤمنة بالشبكة.

ماذا يمكنني أن أفعل باستخدام GitHub Copilot في مساحة الشيفرة الخاصة بي؟

ربما لاحظت أن عرض الدردشة في GitHub Copilot كان موجودا بالفعل لك عند إنشاء مساحة الكود. لراحتك، ندرج إضافة الدردشة GitHub Copilot في تعريف الحاوية (انظر .devcontainer/devcontainer.json). ومع ذلك، تحتاج إلى حساب GitHub Copilot (تجربة مجانية لمدة 30 يوما متاحة).

بعض النصائح لك عندما تتحدث مع GitHub Copilot:

  • في جلسة دردشة واحدة، تعتمد الأسئلة والأجوبة على بعضها البعض ويمكنك ضبط أسئلتك لضبط الإجابة التي تحصل عليها.
  • افتراضيا، GitHub Copilot لا يملك وصولا لأي ملف في مستودعك. لطرح أسئلة حول ملف، افتح الملف في المحرر أولا.
  • لكي أتاح GitHub Copilot الوصول إلى جميع الملفات في المستودع عند إعداد إجاباته، ابدأ سؤالك ب @workspace. لمزيد من المعلومات، انظر Use the @workspace agent.
  • في جلسة الدردشة، يمكن GitHub Copilot اقتراح تغييرات و(باستخدام @workspace) حتى مكان إجراء التغييرات، لكن لا يسمح له بإجراء التغييرات نيابة عنك. الأمر متروك لك لإضافة التغييرات المقترحة واختبارها.

فيما يلي بعض الأشياء الأخرى التي يمكنك قولها لضبط الإجابة التي تحصل عليها:

  • أريد تشغيل هذه التعليمة البرمجية فقط في وضع الإنتاج.
  • أريد أن يعمل هذا الكود فقط في Azure App Service وليس محليا.
  • يبدو أن المعلمة --output-path غير مدعومة.

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

أو، يمكنك التحقق من الموارد الأخرى: