العمل مع الموارد الموجودة
غالبًا ما تحتاج ملفات Bicep إلى الإشارة إلى الموارد التي تم إنشاؤها في مكان آخر. قد تكون هذه الموارد قد تم إنشاؤها يدويًا، ربما بواسطة زميل يستخدم مدخل Azure. أو ربما تم إنشاؤها في ملف Bicep آخر. هناك العديد من الأسباب التي تجعلك بحاجة إلى الإشارة إلى هذه الموارد، مثل:
- أنت تقوم بإضافة قاعدة بيانات SQL إلى مثيل خادم منطقي لـ SQL Azure قام أحدهم بإنشائه بالفعل.
- تقوم بتكوين إعدادات التشخيص للموارد التي تم تعريفها في وحدة Bicep أخرى.
- يجب عليك الوصول بأمان إلى مفاتيح حساب تخزين تم توزيعه يدويًا في اشتراكك.
يوفر Bicep الكلمة الأساسية existing لاستخدامها في هذه الحالات.
ملاحظة
تُعرض الأوامر في هذه الوحدة لتوضيح المفاهيم. لا تقم بتشغيل الأوامر بعد. ستتدرب على ما تتعلمه هنا قريبًا.
الإشارة إلى الموارد الموجودة
ضمن ملف Bicep، يمكنك تعريف مورد موجود مسبقًا. يبدو الإعلان مشابهًا لتعريف المورد العادي، ولكن هناك بعض الاختلافات الرئيسية. في المثال التالي لتعريف مورد موجود، يشير التعريف إلى حساب تخزين يسمى toydesigndocs في نفس مجموعة الموارد التي سيتم توزيع قالب Bicep لديك إليها.
resource storageAccount 'Microsoft.Storage/storageAccounts@2019-06-01' existing = {
name: 'toydesigndocs'
}
دعونا ننظر عن كثب في الجوانب المكونة لهذا التعريف:
مثلما تفعل مع مورد عادي، يمكنك تضمين الكلمة الأساسية
resourceواسم رمزي ونوع المورد وإصدار واجهة برمجة التطبيقات.ملاحظة
تذكر، يتم استخدام الاسم الرمزي فقط ضمن ملف Bicep هذا. إذا أنشأت هذا المورد باستخدام ملف Bicep واحد وأشرت إليه باستخدام المورد
existingفي ملف Bicep مختلف، لا يجب أن تتطابق الأسماء الرمزية.تشير الكلمة الأساسية
existingلـ Bicep إلى أن تعريف المورد هذا هو مرجع إلى مورد تم إنشاؤه بالفعل، وأن Bicep يجب ألا يحاول توزيعه.الخاصية
nameهي اسم مورد Azure لحساب التخزين الذي تم توزيعه مسبقًا.لن تحتاج إلى تحديد
locationأوskuأوproperties، لأن القالب لا يقوم بتوزيع المورد. إنه يشير فقط إلى مورد موجود. فكر في الأمر كمورد عنصر نائب.
الإشارة إلى الموارد التابعة
يمكنك الإشارة إلى مورد تابع موجود أيضًا. يمكنك استخدام نفس نوع بناء الجملة الذي استخدمته عند توزيع مورد تابع. يوضح المثال التالي كيف يمكنك الإشارة إلى شبكة فرعية موجودة، والتي تمثل موردًا تابعًا لشبكة ظاهرية. يستخدم المثال موردًا تابعًا متداخلاً كما هو موضح هنا:
resource vnet 'Microsoft.Network/virtualNetworks@2020-11-01' existing = {
name: 'toy-design-vnet'
resource managementSubnet 'subnets' existing = {
name: 'management'
}
}
لاحظ أنه تم تطبيق الكلمة الأساسية existingلكل من المورد الأصل والتابع.
يمكنك بعد ذلك الإشارة إلى الشبكة الفرعية باستخدام نفس عامل التشغيل :: الذي تستخدمه لموارد تابعة أخرى متداخلة:
output managementSubnetResourceId string = vnet::managementSubnet.id
الإشارة إلى الموارد خارج مجموعة الموارد
غالبا ما تحتاج إلى الإشارة إلى الموارد في مجموعة موارد مختلفة. على سبيل المثال، إذا كانت لديك شبكة اتصال ظاهرية في مجموعة موارد مركزية، فقد تحتاج إلى توزيع جهاز ظاهري في تلك الشبكة الظاهرية في مجموعة الموارد الخاصة به. يمكنك استخدام الكلمة الأساسية scope للإشارة إلى الموارد الموجودة في مجموعة موارد مختلفة. يوضح المثال التالي كيف يمكن الإشارة إلى شبكة ظاهرية تسمى toy-design-vnet ضمن مجموعة الموارد networking-rg:
resource vnet 'Microsoft.Network/virtualNetworks@2020-11-01' existing = {
scope: resourceGroup('networking-rg')
name: 'toy-design-vnet'
}
لاحظ أن scope تستخدم الكلمة الأساسية resourceGroup() للإشارة إلى مجموعة الموارد التي تحتوي على الشبكة الظاهرية.
يمكنك حتى الإشارة إلى الموارد ضمن اشتراك Azure مختلف، طالما أن الاشتراك داخل مستأجر Azure Active Directory لديك. إذا قام فريق الشبكات بتوفير الشبكة الظاهرية في اشتراك مختلف، فقد يشير القالب إلى ذلك على النحو التالي:
resource vnet 'Microsoft.Network/virtualNetworks@2020-11-01' existing = {
scope: resourceGroup('f0750bbe-ea75-4ae5-b24d-a92ca601da2c', 'networking-rg')
name: 'toy-design-vnet'
}
لاحظ أن scope تستخدم الكلمة الأساسية resourceGroup() للإشارة إلى معرف اشتراك Azure ( f0750bbe-ea75-4ae5-b24d-a92ca601da2c ) واسم مجموعة الموارد التي تحتوي على الشبكة الظاهرية.
والآن، بعد أن فهمت كيفية الإشارة إلى الموارد الموجودة، دعنا ننظر إلى كيفية استخدام هذه الإمكانية في القوالب لديك.
إضافة موارد تابعة وملحقة إلى مورد موجود
يمكنك إضافة مورد تابع إلى مورد أصل تم إنشاؤه بالفعل باستخدام مجموعة من الكلمات الأساسية existing وparent. ينشئ قالب المثال التالي قاعدة بيانات Azure SQL داخل خادم موجود مسبقًا:
resource server 'Microsoft.Sql/servers@2020-11-01-preview' existing = {
name: serverName
}
resource database 'Microsoft.Sql/servers/databases@2020-11-01-preview' = {
parent: server
name: databaseName
location: location
sku: {
name: 'Standard'
tier: 'Standard'
}
}
إذا كنت بحاجة إلى توزيع مورد ملحق إلى مورد موجود، يمكنك استخدام الكلمة الأساسية scope. إليك قالب يستخدم existing الكلمة الرئيسية scope والكلمة الأساسية لإضافة قفل مورد إلى حساب تخزين موجود بالفعل:
resource storageAccount 'Microsoft.Storage/storageAccounts@2019-06-01' existing = {
name: 'toydesigndocs'
}
resource lockResource 'Microsoft.Authorization/locks@2016-09-01' = {
scope: storageAccount
name: 'DontDelete'
properties: {
level: 'CanNotDelete'
notes: 'Prevents deletion of the toy design documents storage account.'
}
}
الإشارة إلى خصائص مورد موجود
تحتاج الموارد غالبًا إلى الإشارة إلى خصائص الموارد الأخرى. على سبيل المثال، إذا قمت بتوزيع تطبيق، فقد تحتاج إلى معرفة المفاتيح أو معلومات الاتصال لمورد آخر. باستخدام الكلمة الأساسية existing، يمكنك الوصول إلى خصائص المورد الذي تشير إليه.
تلميح
من أفضل الممارسات البحث عن مفاتيح من موارد أخرى بهذه الطريقة بدلاً من تمريرها عبر المخرجات. ستحصل دائمًا على أحدث البيانات. أيضًا، الأهم من ذلك، لم يتم تصميم المخرجات للتعامل مع البيانات الآمنة مثل المفاتيح.
تعتمد الطريقة التي يمكنك من خلالها الوصول إلى المعلومات المتعلقة بالموارد على نوع المعلومات التي تحصل عليها. إذا كانت خاصية غير آمنة، فعادةً ستستخدم فقط خاصية properties للمورد. يتم من خلال قالب المثال التالي توزيع تطبيق Azure Functions، ويستخدم تفاصيل الوصول (مفتاح تقرير عن حالة النظام) لمثيل Application Insights الذي تم إنشاؤه بالفعل:
resource applicationInsights 'Microsoft.Insights/components@2018-05-01-preview' existing = {
name: applicationInsightsName
}
resource functionApp 'Microsoft.Web/sites@2020-06-01' = {
name: functionAppName
location: location
kind: 'functionapp'
properties: {
siteConfig: {
appSettings: [
// ...
{
name: 'APPINSIGHTS_INSTRUMENTATIONKEY'
value: applicationInsights.properties.InstrumentationKey
}
]
}
}
}
في هذا المثال، نظرًا لأن مفتاح التقرير عن حالة النظام لا يعتبر بيانات حساسة، فإنه متوفر في properties للمورد. عندما تحتاج إلى الوصول إلى بيانات آمنة، مثل بيانات الاعتماد المطلوب استخدامها للوصول إلى مورد، استخدم الدالة listKeys()، كما هو موضح في التعليمات البرمجية التالية:
resource storageAccount 'Microsoft.Storage/storageAccounts@2019-06-01' existing = {
name: storageAccountName
}
resource functionApp 'Microsoft.Web/sites@2020-06-01' = {
name: functionAppName
location: location
kind: 'functionapp'
properties: {
siteConfig: {
appSettings: [
// ...
{
name: 'StorageAccountKey'
value: storageAccount.listKeys().keys[0].value
}
]
}
}
}
لاحظ رجوع listKeys الدالة keys إلى صفيف. يقوم رمز Bicep باسترداد value الخاصية من العنصر الأول في keys الصفيف. لكل نوع من أنواع الموارد معلومات مختلفة متاحة من الدالة listKeys(). يمنحك ملحق Bicep لـ Visual Studio Code تلميحات لمساعدتك على فهم البيانات التي ترجعها دالة listKeys() لكل مورد. تظهر لقطة الشاشة أدناه إخراج الدالة listKeys() لحساب التخزين:
.
تدعم بعض الموارد دوال أخرى أيضاً. يسرد IntelliSense لـ Visual Studio Code الدوال المتاحة لكل مورد. في لقطة الشاشة أدناه، يمكنك أن ترى أن حسابات التخزين توفر دوال تسمى listAccountSas() وlistServiceSas() بالإضافة إلى listKeys():
.
هام
توفر الدالة listKeys() الوصول إلى البيانات الحساسة حول المورد. هذا يعني أن المستخدم أو كيان الخدمة الذي يقوم بتشغيل التوزيع يحتاج إلى مستوى مناسب من الإذن على المورد. عادةً ما يكون هذا هو الدور المضمن في المساهم، أو دور مخصص يقوم بتعيين الإذن المناسب.
هل تحتاج إلى مساعدة؟ راجع دليل استكشاف الأخطاء وإصلاحها الذي نقدمه أو يمكنك توفير ملاحظات معينة عبر الإبلاغ عن مشكلة.