حل أخطاء الموارد غير موجودة

توضح هذه المقالة الخطأ الذي تراه عندما يتعذر العثور على مورد أثناء عملية. عادة ما ترى هذا الخطأ عند توزيع الموارد باستخدام ملف Bicep أو قالب Azure Resource Manager (قالب ARM). كما ترى هذا الخطأ عند القيام بمهام الإدارة ولا يمكن العثور على المورد المطلوب Azure Resource Manager. على سبيل المثال، إذا حاولت إضافة علامات إلى مورد غير موجود، تظهر لك هذه الأخطاء.

أعراض

هناك رمزي خطأ يشيران إلى تعذر العثور على المورد. يرجع الخطأ NotFound نتيجة مشابهة لما يلي:

Code=NotFound;
Message=Cannot find ServerFarm with name exampleplan.

يرجع الخطأ ResourceNotFound نتيجة مشابهة لما يلي:

Code=ResourceNotFound;
Message=The Resource 'Microsoft.Storage/storageAccounts/{storage name}' under resource
group {resource group name} was not found.

السبب

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

الحل 1: تحقق من خصائص المورد

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

  • اسم المورد
  • اسم مجموعة الموارد
  • الاشتراك

إذا كنت تستخدم PowerShell أو Azure CLI، فتحقق من أنك تقوم بتشغيل الأوامر في الاشتراك الذي يحتوي على المورد. يمكنك تغيير الاشتراك مع Set-AzContext أو مجموعة حسابات az. توفر العديد من الأوامر معلمة اشتراك تتيح لك تحديد اشتراك مختلف عن السياق الحالي.

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

الحل 2: تعيين التبعيات

إذا حدث هذا الخطأ عند توزيع قالب، فقد تحتاج إلى إضافة تبعية. يحسِّن Resource Manager عمليات التوزيع عن طريق إنشاء الموارد بالتوازي، عندما يكون ذلك ممكناً.

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

استخدم تبعية ضمنية بدلاً من الدالة resourceId. يتم إنشاء التبعية باستخدام اسم المورد الرمزي وخاصية المعرّف.

على سبيل المثال، تستخدم الخاصية serverFarmId لتطبيق الويب servicePlan.id لإنشاء تبعية على خطة خدمة التطبيق.

resource webApp 'Microsoft.Web/sites@2022-03-01' = {
  properties: {
    serverFarmId: servicePlan.id
  }
}

resource servicePlan 'Microsoft.Web/serverfarms@2022-03-01' = {
  name: hostingPlanName
  ...

بالنسبة لمعظم عمليات التوزيع، ليس من الضروري استخدام dependsOn لإنشاء تبعية صريحة.

تجنب تعيين التبعيات غير المطلوبة. تعمل التبعيات غير الضرورية على إطالة مدة التوزيع حيث لا يتم توزيع الموارد بالتوازي. وأيضاً، يمكنك إنشاء تبعيات دائرية تمنع التوزيع.

ترتيب التوزيع

عند رؤيتك مشاكل في التبعية، ستحتاج إلى الحصول على نتيجة معرفية لترتيب توزيع الموارد. يمكنك استخدام المدخل لعرض ترتيب عمليات التوزيع:

  1. الانتقال إلى المدخل.

  2. من نظرة عامة على مجموعة الموارد، حدد الارتباط لمحفوظات التوزيع.

    لقطة شاشة لمدخل Azure تسلط الضوء على الارتباط بمحفوظات توزيع مجموعة الموارد في قسم نظرة عامة.

  3. بالنسبة لاسم التوزيع الذي تريد مراجعته، حدد "Related events".

    لقطة شاشة لمدخل Microsoft Azure تعرض اسم توزيع مع تمييز ارتباط الأحداث ذات الصلة في محفوظات النشر.

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

    لقطة شاشة لسجل نشاط مدخل Microsoft Azure تعرض ثلاثة حسابات تخزين تم نشرها بالتوازي، مع الطوابع الزمنية والحالات الخاصة بها.

    تعرض الصورة التالية ثلاثة حسابات تخزين لا يتم توزيعها بالتوازي. يعتمد حساب التخزين الثاني على حساب التخزين الأول، ويعتمد حساب التخزين الثالث على حساب التخزين الثاني. تتم تسمية حساب التخزين الأول Started، وAccepted، وSucceeded قبل بدء تشغيل التالي.

    لقطة شاشة لسجل نشاط مدخل Microsoft Azure تعرض ثلاثة حسابات تخزين تم نشرها بترتيب تسلسلي، مع الطوابع الزمنية والحالات الخاصة بها.

الحل 3: الحصول على موارد خارجية

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

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

resource servicePlan 'Microsoft.Web/serverfarms@2022-03-01' existing = {
  name: hostingPlanName
  scope: resourceGroup(rgname)
}

resource webApp 'Microsoft.Web/sites@2022-03-01' = {
  name: siteName
  properties: {
    serverFarmId: servicePlan.id
  }
}

الحل 4: الحصول على هوية مدارة من المورد

إذا كنت توزع مورداً باستخدام هوية مُدارةضمنياً، فيجب الانتظار حتى يتم توزيع هذا المورد قبل استرداد القيم على الهوية المُدارة. استخدم تبعية ضمنية للمورد الذي يتم تطبيق الهوية عليه. يضمن هذا النهج توزيع المورد والهوية المُدارة قبل أن يستخدم Resource Manager التبعية.

يمكنك الحصول على المعرّف الرئيسي ومعرّف المستأجر لهوية مُدارة يتم تطبيقها على جهاز ظاهري. على سبيل المثال، إذا كان لمورد جهاز ظاهري اسم رمزي لـ vm، فاستخدم بناء الجملة التالية:

vm.identity.principalId

vm.identity.tenantId

الحل 5: التحقق من الدالات

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

يرجع المثال التالي لحساب تخزين موجود في مجموعة موارد مختلفة.

resource stgAcct 'Microsoft.Storage/storageAccounts@2022-05-01' existing = {
  name: stgname
  scope: resourceGroup(rgname)
}

الحل 6: بعد حذف المورد

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

لقطة شاشة لمدخل Microsoft Azure تعرض موردا محذوفا مع رسالة خطأ

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