Microsoft Azure: من الاشتراك إلى بيئة الإنتاج
خروج

الدرس 1 من 12 · الأساسيات

Azure: الاشتراكات، مجموعات الموارد، المناطق، البوابة، Cloud Shell وaz CLI

40 د Debian 12

الهدف

أن تفهم كيف يُنظَّم حساب Azure (من يدفع، من يدير، أين توجد الموارد)، وأن تختار منطقة (region) مناسبة لعميل مغربي، وأن تقوم بأولى عملياتك باستعمال البوابة (portal) وCloud Shell وaz CLI.

المفاهيم العامة (IaaS وPaaS وSaaS، نموذج المسؤولية المشتركة، CapEx وOpEx) مشروحة في مسار «Cloud» (الأساسيات). هنا نركّز على الطريقة التي يطبّقها بها Azure.

أهم النقاط

  • كل شيء ينطلق من مستأجر (tenant) Microsoft Entra ID (دليل المؤسسة). يحتوي على اشتراكات (subscriptions)، وهي وحدة الفوترة والحدود (quotas).
  • المورد (VM، قرص، قاعدة بيانات…) ينتمي دائمًا إلى مجموعة موارد (resource group) واحدة، وهي بدورها داخل اشتراك واحد.
  • أربعة مستويات نطاق (scope) للصلاحيات والسياسات: مجموعة الإدارة ← الاشتراك ← مجموعة الموارد ← المورد. ما يُمنح في الأعلى يُورَث في الأسفل.
  • لا توجد (بعد) منطقة Azure في المغرب: الأقرب هي France Central (francecentral) وSpain Central (spaincentral) وWest Europe (westeurope).
  • az CLI أداة سطر أوامر متعددة الأنظمة؛ وCloud Shell يوفّرها لك متصلة مسبقًا، داخل المتصفح.

1. التسلسل الهرمي لحساب Azure

لنأخذ سلسلة متاجر في الدار البيضاء، «Boutique Atlas»، تنقل معلوماتيتها إلى Azure. في المخطّط التالي: المستأجر، ثم مجموعة الإدارة الجذرية، ثم مجموعتا إدارة («الإنتاج» و«خارج الإنتاج»)، وفي كل واحدة اشتراك (فاتورة واحدة وميزانية واحدة) يضم مجموعات موارد:

Locataire Entra ID : boutiqueatlas.ma
└── Groupe d'administration racine
    ├── GA « Production »
    │   └── Abonnement « Boutique-Prod »      ← une facture, un budget
    │       ├── rg-boutique-prod              ← le site web et sa base
    │       └── rg-reseau-prod                ← réseaux virtuels, VPN
    └── GA « Hors-production »
        └── Abonnement « Boutique-Dev »
            └── rg-boutique-dev
المستوى الدور مثال
المستأجر (tenant) الدليل: المستخدمون، المجموعات، التطبيقات boutiqueatlas.ma
مجموعة الإدارة (management group) تجميع الاشتراكات لتطبيق الصلاحيات والسياسات عليها «Production»
الاشتراك (subscription) عقد فوترة، حصص (quotas)، حدود أمنية «Boutique-Prod»
مجموعة الموارد (resource group) مجلد منطقي لموارد تعيش وتُحذف معًا rg-boutique-prod
المورد (resource) العنصر المفوتر: VM، حساب تخزين، عنوان IP… vm-web-01

قواعد يجب معرفتها:

  • لمجموعة الموارد منطقة (حيث تُخزَّن بياناتها الوصفية metadata)، لكنها يمكن أن تحتوي على موارد من مناطق أخرى.
  • حذف مجموعة موارد يحذف كل ما تحتويه. هذا عملي لبيئة الاختبار، وخطير في الإنتاج.
  • يمكن نقل مورد من مجموعة إلى أخرى (أغلب الأنواع تسمح بذلك)، لكن لا يمكن التداخل: لا توجد مجموعة داخل مجموعة.

كم اشتراكًا؟

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

2. المناطق ونطاقات التوفّر

المنطقة مجموعة من مراكز البيانات المتقاربة (مثلًا France Central، قرب باريس). كثير من المناطق تضم ثلاثة نطاقات توفّر (availability zones): مراكز بيانات منفصلة (تغذية كهربائية وتبريد وشبكة مستقلة) داخل المنطقة نفسها.

اختيار المنطقة حسب… ما يجب التحقق منه
زمن الاستجابة نحو المستخدمين في المغرب إسبانيا وفرنسا هما الأقرب
توفّر الخدمة ليست كل الخدمات متوفرة في كل المناطق
السعر يختلف من منطقة إلى أخرى
المتطلبات القانونية القانون 09-08 حول المعطيات الشخصية (رأي CNDP لبعض عمليات النقل)
النطاقات منطقة بنطاقات تتيح التوفّر العالي (high availability)
# عرض المناطق وأسمائها المختصرة
az account list-locations --output table

# أحجام VM المتاحة في منطقة
az vm list-sizes --location francecentral --output table

تنتظر الأوامر دائمًا الاسم المختصر (francecentral)، وليس أبدًا الاسم المعروض («France Central»).

3. بوابة Azure

البوابة (portal.azure.com) هي واجهة الويب. وهي ممتازة لـالاستكشاف والعرض المرئي (مخططات الشبكة، التكاليف، المقاييس) وإصلاح الأعطال. بعض المعالم:

  • شريط البحث في الأعلى يجد خدمة أو موردًا أو وثيقة؛
  • مجموعات الموارد: العرض «حسب المشروع»؛
  • إدارة التكاليف + الفوترة: الميزانيات وتحليل التكاليف؛
  • زر Cloud Shell (الأيقونة >_) يفتح طرفية أسفل الصفحة.

لكن النقرة لا تُعاد. فبمجرد أن تحتاج عملية إلى التكرار (VM لكل عميل، بيئة لكل متدرّب)، ننتقل إلى سطر الأوامر ثم إلى البنية التحتية كشيفرة (infrastructure as code) (الدرس 3.3، Bicep).

4. Cloud Shell

Cloud Shell طرفية مصادَق عليها مسبقًا بحسابك، داخل المتصفح:

  • بيئتان حسب الاختيار: Bash أو PowerShell؛
  • az CLI وkubectl وgit وTerraform وأدوات أخرى مثبّتة مسبقًا؛
  • الجلسة مؤقتة؛ وللاحتفاظ بملفاتك من جلسة إلى أخرى، يقترح عليك Cloud Shell ربط مشاركة ملفات (file share) في Azure (تخزين مفوتر، بضعة دراهم في الشهر).

إنها أسرع طريقة للبدء، من أي حاسوب، حتى من حاسوب في مقهى إنترنت لا تريد تثبيت أي شيء عليه.

5. az CLI على حاسوبك

يُثبَّت az CLI على Windows وmacOS وLinux (الحزمة azure-cli من مستودعات Microsoft). بعد ذلك:

az version                       # الإصدار المثبّت
az login                         # يفتح المتصفح لتسجيل الدخول
az login --use-device-code       # على خادم دون متصفح: رمز يُدخَل في جهاز آخر
az account show --output table   # الاشتراك المختار حاليًا
az account list --output table   # كل اشتراكاتك
az account set --subscription "Boutique-Prod"   # تغيير الاشتراك

شكل الأوامر

az  <groupe>  [sous-groupe]  <action>  --paramètres
az  group                    create    --name rg-boutique-prod --location francecentral
az  network   vnet           create    --name vnet-prod ...
az  vm                       list      --output table

(البنية: az ثم المجموعة ثم المجموعة الفرعية إن وُجدت ثم الإجراء ثم المعاملات.) يعرض az <groupe> --help الإجراءات الممكنة؛ ويقترح az find "créer une vm" أمثلة.

إنشاء مجموعة موارد وعرضها وحذفها

# إنشاء، مع وسوم (tags) لتتبّع التكاليف حسب المشروع
az group create --name rg-boutique-prod --location francecentral \
    --tags env=prod projet=boutique

az group list --output table
az group show --name rg-boutique-prod

# حذف كل محتوى المجموعة (يطلب التأكيد)
az group delete --name rg-boutique-dev
az group delete --name rg-boutique-dev --yes --no-wait   # دون سؤال، في الخلفية

الوسوم (--tags) أزواج مفتاح=قيمة. لا تغيّر شيئًا في طريقة العمل، لكنها تتيح ترشيح تحليل التكاليف («كم يكلّف مشروع boutique في الإنتاج؟»).

القيم الافتراضية

az configure --defaults group=rg-boutique-prod location=francecentral
az vm list --output table        # يستعمل من الآن rg-boutique-prod
az configure --list-defaults     # عرض القيم المسجّلة

عملي، لكنه خطير في سكربت مشترك: اجعل القيم صريحة في سكربتات الإنتاج.

صيغ الإخراج والاستعلامات

الخيار الإخراج الاستعمال
--output json (افتراضي) JSON كامل السكربتات، الأدوات
--output table جدول مقروء قراءة بشرية
--output tsv قيم خام مفصولة بعلامات جدولة استرجاع قيمة في متغير
--output yaml YAML القراءة

يرشّح الخيار --query النتيجة باستعمال صياغة JMESPath:

# فقط اسم ومنطقة كل مجموعة
az group list --query "[].{nom:name, region:location}" --output table

# مجموعات الإنتاج (الوسم env=prod)
az group list --query "[?tags.env=='prod'].name" --output tsv

# استرجاع معرّف مجموعة في متغير
ID=$(az group show --name rg-boutique-prod --query id --output tsv)
echo "$ID"     # /subscriptions/<id-abonnement>/resourceGroups/rg-boutique-prod

هذا المعرّف الطويل (معرّف المورد resource ID) يتكرّر في كل مكان: يحدّد المورد دون أي لبس، ويُستعمل نطاقًا (scope) للصلاحيات (الدرس 1.2).

6. الأقفال: تجنّب الحذف غير المقصود

# منع الحذف (يبقى التعديل ممكنًا)
az lock create --name ne-pas-supprimer --resource-group rg-boutique-prod \
    --lock-type CanNotDelete

# منع أي تعديل
az lock create --name lecture-seule --resource-group rg-archives --lock-type ReadOnly

az lock list --resource-group rg-boutique-prod --output table
az lock delete --name ne-pas-supprimer --resource-group rg-boutique-prod

ينطبق القفل حتى على مالك (owner) الاشتراك: يجب أولًا إزالة القفل من أجل الحذف. وهذا بالضبط هو الهدف.

7. التكاليف منذ اليوم الأول

  • أنشئ ميزانية (budget) على الاشتراك (البوابة: Gestion des coûts → Budgets) مع تنبيه عند 50 % و80 % و100 %.
  • الـVM التي أُوقفت من داخل النظام تبقى مفوترة؛ وحدها الـVM المحرَّرة (deallocated) (az vm deallocate) لا تدفع ثمن الحوسبة (الدرس 1.3).
  • الأقراص وعناوين IP العمومية والنسخ الاحتياطية مفوترة حتى عندما تكون الـVM مطفأة.
  • احذف مجموعات الاختبار: az group delete هو أفضل أداة للتوفير لديك.

أخطاء متكررة

  • العمل في الاشتراك الخطأ: دائمًا az account show قبل عملية مهمة، وaz account set في بداية السكربت.
  • استعمال الاسم المعروض للمنطقة («France Central») بدل الاسم المختصر francecentral.
  • وضع كل شيء في مجموعة موارد واحدة: لن تستطيع حذف بيئة الاختبار دون المخاطرة بالإنتاج.
  • نسيان الوسوم: بعد ستة أشهر، لا أحد يعرف لأي مشروع تعود فاتورة بـ 4 000 درهم.

التطبيق العملي (Lab)

ستُعِدّ سكربت القاعدة (socle) لـ Boutique Atlas: اختيار الاشتراك، وإنشاء مجموعة موارد الإنتاج في France Central مع وسومها، والقيم الافتراضية، والقفل. لا يتوفّر التمرين على شبكة ولا على az CLI: تكتب السكربت تمامًا كما كنت ستشغّله في Cloud Shell، ثم ملفًا صغيرًا يلخّص تسلسل النطاقات.

cat /root/azure/01-socle.sh      # إعادة قراءة السكربت
sh -n /root/azure/01-socle.sh    # التحقق من صياغة shell دون تنفيذه

اختبار قصير

  1. ما وحدة الفوترة في Azure؟
  2. هل يمكن لمورد أن ينتمي إلى مجموعتي موارد؟
  3. ماذا يحدث عند حذف مجموعة موارد؟
  4. أي خيار في az CLI يعطي قيمة خامًا، سهلة الوضع في متغير shell؟
  5. هل يستطيع مالك الاشتراك حذف مجموعة عليها قفل CanNotDelete؟
الأجوبة
  1. الاشتراك (فاتورة واحدة، حصص، حدود للصلاحيات).
  2. لا: المورد في مجموعة واحدة فقط في الوقت نفسه (ويمكن نقله).
  3. تُحذف كل الموارد التي تحتويها.
  4. --output tsv (غالبًا مع --query).
  5. لا، ما دام القفل موجودًا: يجب عليه أولًا حذفه (az lock delete).

مصادر مرجعية: Microsoft Learn (CC BY 4.0) — وثائق Azure RBAC والآلات الافتراضية والشبكات الافتراضية. نص أصلي من MasterLinux.

تمارين تطبيقية

تُنجَز على Debian 12

الطرفية عبر الإنترنت قادمة قريبًا. في انتظار ذلك، أنجِز هذه المهام على جهازك بنظام لينكس أو على آلة افتراضية أو WSL.

  1. أنشئ المجلد /root/azure والسكربت /root/azure/01-socle.sh. سطره الأول هو #!/bin/sh؛ والسطر الثاني يختار الاشتراك المسمّى Boutique-Prod باستعمال az account set.
    عرض تلميحmkdir -p /root/azure، ثم printf بسطرين: #!/bin/sh وaz account set --subscription Boutique-Prod
    عرض الحل
    mkdir -p /root/azure && printf "%s\n" "#!/bin/sh" "az account set --subscription Boutique-Prod" > /root/azure/01-socle.sh

    التحقق : f=/root/azure/01-socle.sh; [ "$(head -n1 $f)" = "#!/bin/sh" ] && grep -Eq "^az account set --subscription \"?Boutique-Prod\"?$" $f

  2. أضف إلى السكربت إنشاء مجموعة الموارد rg-boutique-prod، في المنطقة francecentral، مع الوسوم (tags) env=prod وprojet=boutique.
    عرض تلميحaz group create --name … --location … --tags clé=valeur clé=valeur (إضافة في آخر الملف باستعمال >>)
    عرض الحل
    echo "az group create --name rg-boutique-prod --location francecentral --tags env=prod projet=boutique" >> /root/azure/01-socle.sh

    التحقق : f=/root/azure/01-socle.sh; grep -E "^az group create" $f | grep -E -- "(--name|-n) rg-boutique-prod" | grep -E -- "(--location|-l) francecentral" | grep -- "--tags" | grep "env=prod" | grep -q "projet=boutique"

  3. أضف سطر az configure يحدّد افتراضيًا المجموعة rg-boutique-prod والمنطقة francecentral للأوامر التالية.
    عرض تلميحaz configure --defaults group=… location=…
    عرض الحل
    echo "az configure --defaults group=rg-boutique-prod location=francecentral" >> /root/azure/01-socle.sh

    التحقق : grep -E "^az configure --defaults" /root/azure/01-socle.sh | grep "group=rg-boutique-prod" | grep -q "location=francecentral"

  4. احمِ المجموعة من الحذف: أضف قفلًا (lock) اسمه ne-pas-supprimer من نوع CanNotDelete على rg-boutique-prod.
    عرض تلميحaz lock create --name … --resource-group … --lock-type CanNotDelete
    عرض الحل
    echo "az lock create --name ne-pas-supprimer --resource-group rg-boutique-prod --lock-type CanNotDelete" >> /root/azure/01-socle.sh

    التحقق : grep -E "^az lock create" /root/azure/01-socle.sh | grep -E -- "(--name|-n) ne-pas-supprimer" | grep -- "--lock-type CanNotDelete" | grep -Eq -- "(--resource-group|-g) rg-boutique-prod"

  5. اكتب /root/azure/hierarchie.txt: مستويات النطاق (scope) الأربعة في Azure، من الأوسع إلى الأضيق، مستوى في كل سطر، بهذه الكلمات بالضبط: groupe-administration وabonnement وgroupe-ressources وressource.
    عرض تلميحمجموعة الإدارة (groupe-administration) تحتوي على اشتراكات (abonnement)، وهذه تحتوي على مجموعات موارد (groupe-ressources).
    عرض الحل
    printf "%s\n" groupe-administration abonnement groupe-ressources ressource > /root/azure/hierarchie.txt

    التحقق : printf "groupe-administration\nabonnement\ngroupe-ressources\nressource\n" | cmp -s - /root/azure/hierarchie.txt

المراجع الرسمية المعتمدة: Vue d'ensemble d'Azure RBAC (étendues) — https://learn.microsoft.com/fr-fr/azure/role-based-access-control/overview ; Démarrage rapide : créer une machine virtuelle Linux avec Azure CLI — https://learn.microsoft.com/fr-fr/azure/virtual-machines/linux/quick-create-cli ; Démarrage rapide : créer un réseau virtuel avec Azure CLI — https://learn.microsoft.com/fr-fr/azure/virtual-network/quick-create-cli ; Documentation Machines virtuelles Azure — https://learn.microsoft.com/fr-fr/azure/virtual-machines/. نص أصلي من MasterLinux.