أتمتة نشر الموارد لتطبيق الدالة الخاص بك في Azure Functions

لأتمتة نشر تطبيق الوظائف الخاص بك، استخدم ملف Bicep أو قالب Azure Resource Manager (قالب ARM). أثناء النشر، يمكنك استخدام موارد Azure الحالية أو إنشاء موارد جديدة.

باستخدام أتمتة النشر، سواء البنية التحتية ككود (IaC) أو التكامل والنشر المستمر (CI/CD)، يمكنك جلب هذه الفوائد إلى تطبيقات الإنتاج الخاصة بك:

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

توضح لك هذه المقالة كيفية أتمتة إنشاء موارد Azure وتكوينات النشر ل Azure Functions. لمعرفة المزيد حول النشر المستمر لكود مشروعك، راجع النشر المستمر ل Azure Functions.

كود القالب لإنشاء موارد Azure المطلوبة يعتمد على خيارات الاستضافة المطلوبة لتطبيق الوظائف الخاص بك. تدعم هذه المقالة خيارات الاستضافة التالية:

خيار الاستضافة نوع التوزيع عينات القوالب
خطة استهلاك Flex Code-only Bicep
<قالب c0>ARM
Terraform
خطة متميزة التعليمات البرمجية | وعاء Bicep
<قالب c0>ARM
خطة مخصصة التعليمات البرمجية | وعاء Bicep
<قالب c0>ARM
تطبيقات حاوية Azure Container-only Bicep
خطة الاستهلاك (الإرث) Code-only Bicep
<قالب c0>ARM

لتطبيقات الوظائف الجديدة بدون خوادم، استخدم خطة Flex Consumption.
خطة الاستهلاك هي خطة استضافة قديمة. بالنسبة للتطبيقات الحالية، انتقل إلى خطة الاستهلاك المرن.

تأكد من تحديد خطة الاستضافة الخاصة بك في أعلى المقالة.

Important

التطبيقات التي لا تزال تعمل بنظام v3 نهاية عمر التشغيل على لينكس ضمن خطة استهلاك تتوقف عن العمل بعد 30 سبتمبر 2026. لتجنب تعطيل الخدمة، قم بترحيل تطبيقك إلى وقت التشغيل v4.

سيتم التقاعد في 30 سبتمبر 2028 من خيار استضافة تطبيقات الوظائف على لينكس ضمن خطة الاستهلاك. خطة استهلاك لينكس لا تحصل على ميزات جديدة أو إصدارات لغوية جديدة. التطبيقات التي تعمل على Windows في خطة استهلاك غير متأثرة حاليا. قم بنقل تطبيقاتك إلى خطة الاستهلاك المرن قبل تاريخ التقاعد.

عند استخدام هذه المقالة، ضع هذه الاعتبارات في الاعتبار:

  • يتم عرض الأمثلة كأقسام فردية لموارد معينة.

الموارد المطلوبة

يجب عليك إنشاء أو تكوين هذه الموارد لنشر مستضاف بواسطة Azure Functions:

Resource Requirement مرجع بناء الجملة والخصائص
حساب تخزين Required Microsoft. Storage/storageAccounts
مكون Application Insights Recommended Microsoft. رؤى/مكونات*
خطة استضافة Required Microsoft. ويب/سيرفرفارمز
تطبيق وظائف Required Microsoft. المواقع/المواقع

يجب عليك إنشاء أو تكوين هذه الموارد لنشر مستضاف بواسطة Azure Functions:

Resource Requirement مرجع بناء الجملة والخصائص
حساب تخزين Required Microsoft. Storage/storageAccounts
مكون Application Insights Recommended Microsoft. رؤى/مكونات*
تطبيق وظائف Required Microsoft. المواقع/المواقع

عادة ما يتكون نشر Azure Container Apps المستضاف من هذه الموارد:

Resource Requirement مرجع بناء الجملة والخصائص
حساب تخزين Required Microsoft. Storage/storageAccounts
مكون Application Insights Recommended Microsoft. رؤى/مكونات*
بيئة مدارة Required Microsoft. App/managedEnvironments
تطبيق وظائف Required Microsoft. المواقع/المواقع

*إذا لم يكن لديك بالفعل مساحة عمل تحليلات سجلات يمكن لنسخة Application Insights استخدامها فيها، فعليك أيضا إنشاء هذا المورد.

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

Prerequisites

  • تعمل هذه الأمثلة في سياق مجموعة موارد موجودة.
  • تتطلب كل من Application Insights وسجلات التخزين مساحة عمل Azure Log Analytics موجودة. يمكنك مشاركة مساحات العمل بين الخدمات. لتحسين الأداء، أنشئ مساحة عمل في كل منطقة جغرافية. للحصول على مثال على كيفية إنشاء مساحة عمل Log Analytics، انظر إنشاء مساحة عمل Log Analytics. يمكنك العثور على معرف موارد مساحة العمل المؤهل بالكامل في صفحة مساحة العمل في بوابة Azure تحتمعرفموارد الخصائص>في الإعدادات>.
  • تفترض هذه المقالة أنك قد أنشأت بيئة مدارة بالفعل في Azure Container Apps. تحتاج إلى كل من اسم ومعرف البيئة المدارة لإنشاء تطبيق دالة مستضاف على تطبيقات الحاوية.

«Create storage account»

جميع تطبيقات الوظائف تتطلب حساب تخزين Azure. تحتاج إلى حساب عام يدعم الكتل والجداول وقوائم الانتظار والملفات. لمزيد من المعلومات، راجع Azure Functions متطلبات حساب التخزين.

Important

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

هذا القسم من الأمثلة ينشئ حساب تخزين v2 عام الأغراض القياسي:

resource storageAccount 'Microsoft.Storage/storageAccounts@2023-05-01' = {
  name: storageAccountName
  location: location
  kind: 'StorageV2'
  sku: {
    name: 'Standard_LRS'
  }
  properties: {
    supportsHttpsTrafficOnly: true
    defaultToOAuthAuthentication: true
    allowBlobPublicAccess: false
    minimumTlsVersion: 'TLS1_2'
  }
}

لمزيد من السياق، راجع ملف main.bicep الكامل في مستودع القوالب.

لمزيد من السياق، راجع ملف storage-PrivateEndpoint.bicep الكامل في مستودع العينة.

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

تلميح

للحصول على أمان أفضل، أضف allowSharedKeyAccess: false إلى خصائص حساب التخزين الخاص بك واستخدم الاتصالات المدارة القائمة على الهوية بدلا من سلاسل الاتصال. تستخدم أمثلة خطط الاستهلاك المرن في هذا المقال هذا النهج، بما في ذلك AzureWebJobsStorage__* الإعدادات القائمة على الهوية وهوية مدارة معينة من النظام. لمزيد من المعلومات، راجع الاتصال باستضافة storage بهوية.

تلميح

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

Important

تستخدم خطط Elastic Premium وConsumption ملفات Azure لمشاركة المحتوى، بينما لا يدعم Azure Files حاليا الاتصالات المدارة القائمة على الهوية. هذا القيد يعني أن هذه الخطط تتطلب الوصول المشترك إلى مفتاح التخزين في حساب التخزين، لذا لا تعيينها allowSharedKeyAccess على false. عندما تحتاج إلى استخدام سلاسل الاتصال، قم بتخزينها في Azure Key Vault واستخدم مراجع Key Vault في إعدادات التطبيق بدلا من تخزين المفاتيح مباشرة. إذا كنت تريد إزالة اعتماد ملفات Azure، راجع إنشاء تطبيق بدون Azure Files.

حاوية النشر

لنشره على تطبيق يعمل ضمن خطة استهلاك مرنة، تحتاج إلى حاوية في Azure Blob Storage كمصدر للنشر. يمكنك استخدام حساب التخزين الافتراضي أو تحديد حساب تخزين منفصل. لمزيد من المعلومات، راجع تكوين إعدادات النشر.

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

يوضح هذا المثال كيفية إنشاء حاوية في حساب التخزين:

}

// Azure Functions Flex Consumption
module functionApp 'br/public:avm/res/web/site:0.16.0' = {
  name: 'functionapp'
  scope: rg
  params: {
    kind: 'functionapp,linux'
    name: functionAppName_resolved
    location: location
    tags: union(tags, { 'azd-service-name': 'api' })
    serverFarmResourceId: appServicePlan.outputs.resourceId
    managedIdentities: {
      systemAssigned: true
    }
    functionAppConfig: {
      deployment: {
        storage: {
          type: 'blobContainer'
          value: '${storage.outputs.primaryBlobEndpoint}${deploymentStorageContainerName}'
          authentication: {
            type: 'SystemAssignedIdentity'
          }

يوضح هذا المثال كيفية استخدام AVM لحسابات التخزين لإنشاء حاوية تخزين blob مع حساب التخزين. للمقتطف في السياق، انظر this deployment example.

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

تمكين سجلات التخزين

نظرا لأن حساب التخزين يستخدم لبيانات التطبيقات المهمة للوظائف، راقب الحساب لتعديل ذلك المحتوى. لمراقبة حساب التخزين الخاص بك، قم بتكوين سجلات موارد Azure Monitor ل Azure Storage. في هذا القسم المثالي، يستخدم مساحة عمل Log Analytics باسم myLogAnalytics كوجهة لهذه السجلات.

resource blobService 'Microsoft.Storage/storageAccounts/blobServices@2023-05-01' existing = {
  name:'default'
  parent:storageAccountName
}

resource storageDataPlaneLogs 'Microsoft.Insights/diagnosticSettings@2021-05-01-preview' = {
  name: '${storageAccountName}-logs'
  scope: blobService
  properties: {
    workspaceId: myLogAnalytics.id
    logs: [
      {
        category: 'StorageWrite'
        enabled: true
      }
    ]
    metrics: [
      {
        category: 'Transaction'
        enabled: true
      }
    ]
  }
}

يمكنك استخدام نفس مساحة العمل لمورد Application Insights الذي تم تعريفه لاحقا. لمزيد من المعلومات، بما في ذلك كيفية التعامل مع هذه السجلات، راجع Monitoring Azure Storage.

إنشاء Application Insights

استخدم Application Insights لمراقبة تنفيذ وظائفك التطبيقية. يتطلب Application Insights الآن مساحة عمل Azure Log Analytics، يمكن مشاركتها. تفترض هذه الأمثلة أنك تستخدم مساحة عمل موجودة ولديك معرف المورد المؤهل بالكامل لمساحة العمل. لمزيد من المعلومات، راجع Azure Log Analytics workspace.

في هذا القسم المثالي، حدد مورد Application Insights بالنوع Microsoft.Insights/components والنوع webالتالي:

resource applicationInsight 'Microsoft.Insights/components@2020-02-02' = {
  name: applicationInsightsName
  location: appInsightsLocation
  tags: tags
  kind: 'web'
  properties: {
    Application_Type: 'web'
    WorkspaceResourceId: '<FULLY_QUALIFIED_RESOURCE_ID>'
  }
}

لمزيد من السياق، راجع ملف main.bicep الكامل في مستودع القوالب.

يجب عليك توفير الاتصال بتطبيق الوظيفة باستخدام APPLICATIONINSIGHTS_CONNECTION_STRING إعداد التطبيق. لمزيد من المعلومات، راجع تكوين التطبيق.

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

إنشاء خطة الاستضافة

يجب عليك تحديد خطة الاستضافة للتطبيقات المستضافة في خطة Azure Functions Flex Consumption، أو خطة Premime، أو خطة مخصصة (خدمة التطبيقات).

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

خطة استهلاك Flex هي نوع خاص من serverfarm الموارد. يمكنك تحديده باستخدام FC1 لقيمة الخاصية Name في الخاصية sku بقيمة tierFlexConsumption.

ينشئ هذا القسم المثال خطة استهلاك Flex:

  scaleAndConcurrency: {
    maximumInstanceCount: maximumInstanceCount
    instanceMemoryMB: instanceMemoryMB
  }
  runtime: { 
    name: functionAppRuntime
    version: functionAppRuntimeVersion
  }
}
siteConfig: {
  alwaysOn: false
}
configs: [{
  name: 'appsettings'
  properties:{

يستخدم هذا المثال AVM لخطط خدمة التطبيقات. للمقتطف في السياق، انظر this deployment example.

نظرا لأن خطة Flex Consumption تدعم حاليا Linux فقط، يجب عليك أيضا تعيين الخاصية reserved إلى true.

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

الخطة المتميزة هي نوع خاص من مورد serverfarm. يمكنك تحديده باستخدام أو EP1EP2أو EP3 لقيمة الخاصية Name في الخاصية sku . طريقة تعريفك لخطة استضافة الوظائف تعتمد على ما إذا كان تطبيق الوظائف يعمل على Windows أو على لينكس. ينشئ EP1 قسم المثال هذا خطة:

resource hostingPlan 'Microsoft.Web/serverfarms@2024-04-01' = {
  name: hostingPlanName
  location: location
  sku: {
    name: 'EP1'
    tier: 'ElasticPremium'
    family: 'EP'
  }
  kind: 'elastic'
  properties: {
    maximumElasticWorkerCount: 20
  }
}

لمزيد من السياق، راجع ملف main.bicep الكامل في مستودع القوالب.

لمزيد من المعلومات حول sku العنصر، راجع SkuDefinition قوالب المثال أو راجعها.

في خطة Dedicated (خدمة التطبيقات)، يعمل تطبيق الوظائف الخاص بك على أجهزة افتراضية مخصصة على وحدات SKU الأساسية والقياسية والمميزة في خطط خدمة التطبيقات، مشابهة لتطبيقات الويب. لمزيد من المعلومات، راجع الخطة المخصصة.

للحصول على نموذج نموذج Bicep ملف/Azure Resource Manager، راجع Function app على Azure App Service plan.

في Functions، الخطة المخصصة هي مجرد خطة App Service عادية، والتي يتم تعريفها بواسطة مورد serverfarm. يجب توفير القيمة على الأقل name . للحصول على قائمة بأسماء الخطط المدعومة، راجع --sku الإعداد az appservice plan create في القائمة الحالية للقيم المدعومة لخطة مخصصة.

طريقة تعريفك لخطة الاستضافة تعتمد على ما إذا كان تطبيق الوظائف يعمل على Windows أو على لينكس:

resource hostingPlanName 'Microsoft.Web/serverfarms@2024-04-01' = {
  name: hostingPlanName
  location: location
  sku: {
    tier: 'Standard'
    name: 'S1'
    size: 'S1'
    family: 'S'
    capacity: 1
  }
}

لمزيد من السياق، راجع ملف main.bicep الكامل في مستودع القوالب.

إنشاء خطة الاستضافة

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

يمكنك تعريف خطة الاستهلاك بشكل صريح كنوع خاص من serverfarm الموارد. اضبط الخصائص computeMode و sku على Dynamic. يوضح لك قسم المثال هذا كيفية تحديد خطة استهلاك بشكل صريح. طريقة تعريفك لخطة الاستضافة تعتمد على ما إذا كان تطبيق الوظائف يعمل على Windows أو على لينكس.

resource hostingPlan 'Microsoft.Web/serverfarms@2024-04-01' = {
  name: hostingPlanName
  location: location
  sku: {
    name: 'Y1'
    tier: 'Dynamic'
    size: 'Y1'
    family: 'Y'
    capacity: 0
  }
  properties: {
    computeMode: 'Dynamic'
  }
}

لمزيد من السياق، راجع ملف main.bicep الكامل في مستودع القوالب.

إنشاء تطبيق الدالة

تعريف مورد تطبيق الدالة كمورد من النوع Microsoft.Web/sites مع kind خاصية تشمل functionapp.

طريقة تعريفك لمورد تطبيق الوظائف تعتمد على ما إذا كنت تستضيف على لينكس أو ويندوز:

للحصول على قائمة بإعدادات التطبيق المطلوبة عند التشغيل على Windows، انظر Application configuration. للحصول على نموذج لملف Bicep أو قالب Azure Resource Manager، راجع تطبيق الوظائف المستضاف على ويندوز في قالب خطة استهلاك .

للحصول على قائمة بإعدادات التطبيق المطلوبة عند التشغيل على Windows، انظر Application configuration.

تستبدل Flex Consumption العديد من إعدادات التطبيق القياسية وخصائص تكوين الموقع المستخدمة في نشر قوالب Bicep وARM. لمزيد من المعلومات، راجع تكوين التطبيق.

        AzureWebJobsStorage__blobServiceUri: 'https://${storage.outputs.name}.blob.${environment().suffixes.storage}'
        AzureWebJobsStorage__queueServiceUri: 'https://${storage.outputs.name}.queue.${environment().suffixes.storage}'
        AzureWebJobsStorage__tableServiceUri: 'https://${storage.outputs.name}.table.${environment().suffixes.storage}'

        // Application Insights settings are always included
        APPLICATIONINSIGHTS_CONNECTION_STRING: applicationInsights.outputs.connectionString
        APPLICATIONINSIGHTS_AUTHENTICATION_STRING: 'Authorization=AAD'
    }
    }]
  }
}

// Consolidated Role Assignments
module rbacAssignments 'rbac.bicep' = {
  name: 'rbacAssignments'
  scope: rg
  params: {
    storageAccountName: storage.outputs.name
    appInsightsName: applicationInsights.outputs.name
    managedIdentityPrincipalId: functionApp.outputs.?systemAssignedMIPrincipalId ?? ''
    userIdentityPrincipalId: principalId
    allowUserIdentityPrincipal: !empty(principalId)
  }
}

// Outputs
output AZURE_LOCATION string = location
output AZURE_TENANT_ID string = tenant().tenantId
output AZURE_FUNCTION_NAME string = functionApp.outputs.name
output APPLICATIONINSIGHTS_CONNECTION_STRING string = applicationInsights.outputs.connectionString

يستخدم هذا المثال AVM لتطبيقات الوظائف. للمقتطف في السياق، انظر this deployment example.

Note

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

قم بتعيين الخاصية serverFarmId على التطبيق بحيث تشير إلى معرف المورد للخطة. تأكد من أن تطبيق الوظيفة يحتوي على إعداد dependsOn يشير أيضاً إلى الخطة.

resource functionAppName_resource 'Microsoft.Web/sites@2024-04-01' = {
  name: functionAppName
  location: location
  kind: 'functionapp'
  properties: {
    serverFarmId: hostingPlanName.id
    siteConfig: {
      appSettings: [
        {
          name: 'APPLICATIONINSIGHTS_CONNECTION_STRING'
          value: applicationInsightsName.properties.ConnectionString
        }
        {
          name: 'AzureWebJobsStorage'
          value: 'DefaultEndpointsProtocol=https;AccountName=${storageAccountName};EndpointSuffix=${environment().suffixes.storage};AccountKey=${storageAccount.listKeys().keys[0].value}'
        }
        {
          name: 'WEBSITE_CONTENTAZUREFILECONNECTIONSTRING'
          value: 'DefaultEndpointsProtocol=https;AccountName=${storageAccountName};EndpointSuffix=${environment().suffixes.storage};AccountKey=${storageAccount.listKeys().keys[0].value}'
        }
        {
          name: 'WEBSITE_CONTENTSHARE'
          value: toLower(functionAppName)
        }
        {
          name: 'FUNCTIONS_EXTENSION_VERSION'
          value: '~4'
        }
        {
          name: 'FUNCTIONS_WORKER_RUNTIME'
          value: 'node'
        }
        {
          name: 'WEBSITE_NODE_DEFAULT_VERSION'
          value: '~20'
        }
      ]
    }
  }
}

للحصول على مثال شامل من الطرف إلى الطرف، انظر هذا <ملف c0>main.bicep.

resource functionApp 'Microsoft.Web/sites@2024-04-01' = {
  name: functionAppName
  location: location
  kind: 'functionapp'
  properties: {
    serverFarmId: hostingPlan.id
    siteConfig: {
      alwaysOn: true
      appSettings: [
        {
          name: 'APPLICATIONINSIGHTS_CONNECTION_STRING'
          value: applicationInsightsName.properties.ConnectionString
        }
        {
          name: 'AzureWebJobsStorage'
          value: 'DefaultEndpointsProtocol=https;AccountName=${storageAccountName};EndpointSuffix=${environment().suffixes.storage};AccountKey=${storageAccount.listKeys().keys[0].value}'
        }
        {
          name: 'FUNCTIONS_EXTENSION_VERSION'
          value: '~4'
        }
        {
          name: 'FUNCTIONS_WORKER_RUNTIME'
          value: 'node'
        }
        {
          name: 'WEBSITE_NODE_DEFAULT_VERSION'
          value: '~20'
        }
      ]
    }
  }
}

للحصول على مثال شامل من الطرف إلى الطرف، انظر هذا <ملف c0>main.bicep.

مصادر النشر

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

Important

عند إنشاء الحاويات الخاصة بك، يطلب منك تحديث الصورة الأساسية للحاوية إلى أحدث صورة أساسية مدعومة. الصور الأساسية المدعومة ل Azure Functions مخصصة للغة. راجع مستودعات الصور الأساسية Azure Functions.

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

ملف Bicep أو قالب ARM الخاص بك يمكن أيضا تعريف نشر لكود الدالة الخاص بك. يمكن أن يشمل هذا النشر هذه الطرق:

خطة استهلاك المرن تحتفظ بكود مشروعك في ملف حزمة مضغوط بضغط مضغوط داخل حاوية تخزين كتل تعرف بحاوية النشر. يمكنك تكوين كل من حساب التخزين والحاوية المستخدمة للنشر. لمزيد من المعلومات، راجع النشر.

يجب عليك استخدام نشر واحد لنشر حزمة التعليمات البرمجية الخاصة بك إلى حاوية النشر. أثناء نشر قالب ARM أو Bimp، يمكنك القيام بهذه الخطوة بتعريف مصدر حزمة يستخدم الامتداد /onedeploy . إذا اخترت بدلا من ذلك رفع الطرد مباشرة إلى الحاوية، فلن يتم نشر الطرد تلقائيا.

حاوية النشر

حدد حساب التخزين والحاويات المستخدم في النشرات، وطريقة المصادقة، وبيانات الاعتماد في functionAppConfig.deployment.storage عنصر الموقع properties . يجب أن تكون الحاوية وأي إعدادات تطبيق موجودة عند إنشاء التطبيق. للحصول على مثال حول كيفية إنشاء حاوية التخزين، راجع حاوية النشر.

يستخدم هذا المثال هوية مدارة معينة من قبل النظام للوصول إلى حاوية تخزين blob المحددة، والتي تم إنشاؤها في مكان آخر في النشر:

// Consolidated Role Assignments
module rbacAssignments 'rbac.bicep' = {
  name: 'rbacAssignments'
  scope: rg
  params: {
    storageAccountName: storage.outputs.name
    appInsightsName: applicationInsights.outputs.name
    managedIdentityPrincipalId: functionApp.outputs.?systemAssignedMIPrincipalId ?? ''
    userIdentityPrincipalId: principalId
    allowUserIdentityPrincipal: !empty(principalId)
  }
}

// Outputs
output AZURE_LOCATION string = location
output AZURE_TENANT_ID string = tenant().tenantId
output AZURE_FUNCTION_NAME string = functionApp.outputs.name
output APPLICATIONINSIGHTS_CONNECTION_STRING string = applicationInsights.outputs.connectionString

يستخدم هذا المثال AVM لتطبيقات الوظائف. للمقتطف في السياق، انظر this deployment example.

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

module storageRoleAssignment_User 'br/public:avm/ptn/authorization/resource-role-assignment:0.1.2' = if (allowUserIdentityPrincipal && !empty(userIdentityPrincipalId)) {
  name: 'storageRoleAssignment-User-${uniqueString(storageAccount.id, userIdentityPrincipalId)}'
  params: {
    resourceId: storageAccount.id
    roleDefinitionId: roleDefinitions.storageBlobDataOwner
    principalId: userIdentityPrincipalId
    principalType: 'User'
    description: 'Storage Blob Data Owner role for user identity (development/testing)'
    roleName: 'Storage Blob Data Owner'
  }
}

يستخدم هذا المثال AVM لتعيين الأدوار بنطاق الموارد. للمقتطف في السياق، انظر this deployment example.

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

az role definition list --output tsv --query "[?roleName=='Storage Blob Data Owner'].{name:name}"

عند استخدام سلسلة اتصال بدلا من الهويات المدارة، قم بتعيين to authentication.typeStorageAccountConnectionString وتعيين authentication.storageAccountConnectionStringName إلى اسم إعداد التطبيق الذي يحتوي على سلسلة اتصال حساب تخزين النشر.

حزمة النشر

تستخدم خطة Flex Consumption عملية نشر واحدة لنشر مشروع التعليمات البرمجية الخاص بك. حزمة الكود نفسها هي نفسها الحزمة التي تستخدمها لنشر الملف البريدي في خطط استضافة Functions الأخرى. ومع ذلك، يجب أن يكون اسم ملف الحزمة هو released-package.zip.

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

يضيف هذا المثال مصدر نشر واحدا إلى تطبيق موجود:

@description('The name of the function app.')
param functionAppName string

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

@description('The zip content URL for released-package.zip.')
param packageUri string

resource functionAppName_OneDeploy 'Microsoft.Web/sites/extensions@2022-09-01' = {
  name: '${functionAppName}/onedeploy'
  location: location
  properties: {
    packageUri: packageUri
    remoteBuild: false 
  }
}

يمكن لملف Bicep أو قالب ARM أن يحدد أيضا نشرا لكود الوظيفة الخاص بك باستخدام حزمة نشر zip.

لنشر تطبيقك بنجاح باستخدام Azure Resource Manager، تحتاج إلى فهم كيفية نشر الموارد في Azure. في معظم الأمثلة، تطبق تكوينات المستوى الأعلى باستخدام siteConfig. قم بتعيين هذه التكوينات على المستوى الأعلى، لأنها تنقل المعلومات إلى وقت تشغيل الوظائف ومحرك النشر. يتطلب محرك النشر معلومات على مستوى أعلى قبل تطبيق المورد الفرعي sourcecontrols/web . على الرغم من أنه يمكنك تكوين هذه الإعدادات في مورد الطفل config/appSettings ، إلا أنه في بعض الحالات يجب نشر تطبيق الوظيفة قبلconfig/appSettings تطبيقه.

حزمة توزيع Zip

النشر البريدي هو الطريقة الموصى بها لنشر كود تطبيق الوظيفة الخاص بك. بشكل افتراضي، تعمل الوظائف التي تستخدم توزيع zip في حزمة التوزيع نفسها. لمزيد من المعلومات، بما في ذلك متطلبات حزمة النشر، انظر Zip deployment ل Azure Functions. عند استخدام أتمتة نشر الموارد، يمكنك الرجوع إلى حزمة نشر .zip في قالب Bicep أو ARM.

لاستخدام توزيع zip في القالب الخاص بك، قم بتعيين WEBSITE_RUN_FROM_PACKAGE الإعداد في التطبيق إلى 1 وتضمين /zipDeploy تعريف المورد.

بالنسبة لخطة استهلاك على لينكس، بدلا من ذلك، قم بتعيين URI لحزمة النشر مباشرة في إعداد WEBSITE_RUN_FROM_PACKAGE، كما هو موضح في هذا المثال القالب.

يضيف هذا المثال مصدر نشر مضغوط إلى تطبيق موجود:

@description('The name of the function app.')
param functionAppName string

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

@description('The zip content url.')
param packageUri string

resource functionAppName_ZipDeploy 'Microsoft.Web/sites/extensions@2024-04-01' = {
  name: '${functionAppName}/ZipDeploy'
  location: location
  properties: {
    packageUri: packageUri
  }
}

ضع الاعتبارات التالية في اعتبارك عند تضمين موارد نشر الملف البريدي في قالبك:

  • packageUri يجب أن يكون موقعا يمكن للوظائف الوصول إليه. فكر في استخدام تخزين Azure Blob مع توقيع وصول مشترك (SAS). بعد انتهاء صلاحية SAS، لا يمكن للدالات الوصول إلى المشاركة الخاصة بالنشر. عند إعادة إنشاء SAS الخاص بك، تذكر تحديث WEBSITE_RUN_FROM_PACKAGE الإعداد بقيمة URI الجديدة.

  • عند الإعداد WEBSITE_RUN_FROM_PACKAGE إلى URI، يجب مزامنة المشغلات يدويا.

  • دائما قم بتعيين جميع إعدادات التطبيق المطلوبة في appSettings المجموعة عند إضافة أو تحديث الإعدادات. التحديث يزيل الإعدادات الموجودة التي لم تضبطها صراحة. لمزيد من المعلومات، راجع تكوين التطبيق.

  • لا تدعم الدالات Web Deploy (msdeploy) لتوزيع الحزمة. يجب عليك بدلا من ذلك استخدام توزيع zip في مسارات التوزيع والأتمتة. لمزيد من المعلومات، راجع Zip deployment ل Azure Functions.

الإصدارات عن بعد

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

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

تعتمد الطريقة التي تطلب بها إنشاء عن بعد على نظام التشغيل الذي تقوم بالنشر إليه:

عند نشر تطبيق على ويندوز، تقوم عملية النشر بتشغيل أوامر خاصة باللغة، مثل dotnet restore تطبيقات C# أو npm install تطبيقات Node.js.

لتمكين نفس عمليات البناء التي تحصل عليها مع التكامل المستمر، أضف SCM_DO_BUILD_DURING_DEPLOYMENT=true إعدادات التطبيق في كود النشر وقم بإزالة الإعداد WEBSITE_RUN_FROM_PACKAGE تماما.

حاويات Linux

إذا كنت تقوم بنشر تطبيق وظائف koverized على خطة Azure Functions Premium أو Special، يجب عليك:

إذا كانت بعض الإعدادات مفقودة، فقد يفشل توفير التطبيق مع خطأ HTTP/500 هذا:

Function app provisioning failed.

لمزيد من المعلومات، راجع تكوين التطبيق.

resource functionApp 'Microsoft.Web/sites@2024-04-01' = {
  name: functionAppName
  location: location
  kind: 'functionapp'
  properties: {
    serverFarmId: hostingPlan.id
    siteConfig: {
      appSettings: [
        {
          name: 'AzureWebJobsStorage'
          value: 'DefaultEndpointsProtocol=https;AccountName=${storageAccountName};AccountKey=${storageAccount.listKeys().keys[0].value}'
        }
        {
          name: 'FUNCTIONS_WORKER_RUNTIME'
          value: 'node'
        }
        {
          name: 'WEBSITE_NODE_DEFAULT_VERSION'
          value: '~20'
        }
        {
          name: 'FUNCTIONS_EXTENSION_VERSION'
          value: '~4'
        }
        {
          name: 'DOCKER_REGISTRY_SERVER_URL'
          value: dockerRegistryUrl
        }
        {
          name: 'DOCKER_REGISTRY_SERVER_USERNAME'
          value: dockerRegistryUsername
        }
        {
          name: 'DOCKER_REGISTRY_SERVER_PASSWORD'
          value: dockerRegistryPassword
        }
        {
          name: 'WEBSITES_ENABLE_APP_SERVICE_STORAGE'
          value: 'false'
        }
      ]
      linuxFxVersion: 'DOCKER|myacr.azurecr.io/myimage:mytag'
    }
  }
  dependsOn: [
    storageAccount
  ]
}

عند نشر الدوال containerized على Azure Container Apps، يجب أن يكون قالبك:

  • kind تعيين الحقل إلى قيمة functionapp,linux,container,azurecontainerapps.
  • managedEnvironmentId قم بتعيين خاصية الموقع إلى URI المؤهل بالكامل لبيئة Container Apps.
  • أضف رابط مورد في مجموعة dependsOn الخاصة بالموقع عند إنشاء مورد Microsoft.App/managedEnvironments في نفس وقت الموقع.

قد يبدو تعريف تطبيق وظائف حاوية تم نشره من سجل حاوية خاص إلى بيئة Container Apps موجودة مثل هذا المثال:

resource functionApp 'Microsoft.Web/sites@2024-04-01' = {
  name: functionAppName
  kind: 'functionapp,linux,container,azurecontainerapps'
  location: location
  properties: {
    serverFarmId: hostingPlanName
    siteConfig: {
      linuxFxVersion: 'DOCKER|myacr.azurecr.io/myimage:mytag'
      appSettings: [
        {
          name: 'FUNCTIONS_EXTENSION_VERSION'
          value: '~4'
        }
        {
          name: 'AzureWebJobsStorage'
          value: 'DefaultEndpointsProtocol=https;AccountName=${storageAccountName};AccountKey=${storageAccount.listKeys().keys[0].value}'
        }
        {
          name: 'APPLICATIONINSIGHTS_CONNECTION_STRING'
          value: applicationInsightsName.properties.ConnectionString
        }
      ]
    }
    managedEnvironmentId: managedEnvironmentId
  }
  dependsOn: [
    storageAccount
    hostingPlan
  ]
}

تكوين التطبيق

في خطة استهلاك مرنة، تقوم بتكوين تطبيق الوظائف الخاص بك في Azure بنوعين من الخصائص:

Configuration Microsoft.Web/sites الملكية
تكوين التطبيق functionAppConfig
إعدادات التطبيق siteConfig.appSettings مجموعة

تقوم بالحفاظ على هذه التكوينات التطبيقية في functionAppConfig:

Behavior إعداد في functionAppConfig
مثيلات جاهزة دائما scaleAndConcurrency.alwaysReady
مصدر النشر deployment
حجم المثيل scaleAndConcurrency.instanceMemoryMB
تزامن مشغل HTTP scaleAndConcurrency.triggers.http.perInstanceConcurrency
وقت تشغيل اللغة runtime.name
نسخة اللغة runtime.version
الحد الأقصى لعدد المثيلات scaleAndConcurrency.maximumInstanceCount
استراتيجية تحديث الموقع siteUpdateStrategy.type

تدعم خطة Flex Consumption أيضا إعدادات التطبيق التالية:

يوفر Functions الخيارات التالية لتكوين تطبيق الوظائف الخاص بك في Azure:

Configuration Microsoft.Web/sites الملكية
إعدادات الموقع siteConfig
إعدادات التطبيق siteConfig.appSettings مجموعة

إعدادات الموقع هذه مطلوبة على الخاصية siteConfig :

هذه الإعدادات مطلوبة فقط عند استخدام الهويات المدارة للحصول على الصورة من مثيل Azure Container Registry:

إعدادات التطبيق هذه مطلوبة (أو مستحسنة) لنظام تشغيل معين وخيار استضافة:

إعدادات التطبيق هذه مطلوبة لنشر الحاوية:

هذه الإعدادات مطلوبة فقط عند النشر من سجل حاوية خاص:

ضع هذه الاعتبارات في اعتبارك عند العمل مع إعدادات الموقع والتطبيقات باستخدام ملفات Bicep أو قوالب ARM:

  • يحتوي الإعداد الاختياري alwaysReady على صفيف من كائن واحد أو أكثر {name,instanceCount} ، مع عنصر واحد لكل مجموعة مقياس لكل وظيفة. تتخذ هذه المجموعات قرارات مقياس جاهزة دائما. يعين هذا المثال أعدادا جاهزة دائما لكل من http المجموعة ودالة واحدة تسمى helloworld، وهي من نوع مشغل غير مجمع:
      alwaysReady: [
        {
          name: 'http'
          instanceCount: 2
        }
        {
          name: 'function:helloworld'
          instanceCount: 1
        }
      ]
    
  • فكر في متى يجب ضبط WEBSITE_CONTENTSHARE النشر الآلي. للحصول على إرشادات مفصلة، راجع WEBSITE_CONTENTSHARE المرجع.
  • بالنسبة إلى عمليات نشر الحاوية، قم أيضا بتعيين WEBSITES_ENABLE_APP_SERVICE_STORAGE إلى false، حيث يتم توفير محتوى التطبيق الخاص بك في الحاوية نفسها.
  • دائما حدد إعدادات تطبيقك كمجموعة siteConfig/appSettings من الموارد التي Microsoft.Web/sites تنشئها، كما هو موضح في الأمثلة في هذا المقال. يضمن هذا التعريف الإعدادات التي يحتاج تطبيق الوظائف إلى تشغيلها متوفرة عند بدء التشغيل الأولي.

  • عند إضافة أو تحديث إعدادات التطبيق باستخدام القوالب، تأكد من تضمين جميع الإعدادات الموجودة مع التحديث. يجب القيام بذلك لأن استدعاءات واجهة برمجة تطبيقات REST للتحديث الأساسي تحل محل المورد بأكمله /config/appsettings . إذا قمت بإزالة الإعدادات الموجودة، فلن يتم تشغيل تطبيق الوظائف. لتحديث إعدادات التطبيق الفردية برمجيا، يمكنك بدلا من ذلك استخدام Azure CLI أو Azure PowerShell أو بوابة Azure لإجراء هذه التغييرات. لمزيد من المعلومات، راجع العمل مع إعدادات التطبيق.

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

عمليات نشر الفتحات

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

أنت تعرف مورد الفتحة بنفس طريقة مورد تطبيق الدالة (Microsoft.Web/sites)، لكنك تستخدم Microsoft.Web/sites/slots معرف الموارد. للحصول على مثال على النشر (في كل من Bicep وARM) الذي ينشئ كل من الإنتاجية وفتحة المراحل في خطة Premium، انظر Azure تطبيق الوظائف مع فتحة نشر.

لتعلم كيفية تبديل الفتحات باستخدام القوالب، راجع أتمتة مع Resource Manager القالب.

ضع الاعتبارات التالية في الاعتبار عند العمل مع عمليات توزيع الفتحات:

  • لا تقم بتعيين WEBSITE_CONTENTSHARE الإعداد بشكل صريح في تعريف فتحة التوزيع. عملية إنشاء التطبيق في خانة النشر تولد هذا الإعداد لك.

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

عمليات النشر الآمنة

يمكنك إنشاء تطبيق الوظائف الخاص بك في عملية نشر حيث تؤمن واحدة أو أكثر من الموارد من خلال التكامل مع الشبكات الافتراضية. يحدد المورد Microsoft.Web/sites/networkConfig تكامل الشبكة الافتراضية لتطبيق الوظائف الخاص بك. يعتمد هذا التكامل على كل من تطبيق الوظائف المشار إليه وموارد الشبكة الظاهرية. قد يعتمد تطبيق الوظائف أيضا على موارد الشبكات الخاصة الأخرى، مثل نقاط النهاية والمسارات الخاصة. لمزيد من المعلومات، راجع خيارات الشبكة Azure Functions.

توفر هذه المشاريع أمثلة مبنية على Bicep لكيفية نشر تطبيقات الوظائف الخاصة بك في شبكة افتراضية، بما في ذلك مع قيود الوصول إلى الشبكة:

عند إنشاء نشر يستخدم حساب تخزين آمن، يجب عليك تعيين الإعداد WEBSITE_CONTENTSHARE بشكل صريح وإنشاء مورد مشاركة الملفات المسمى في هذا الإعداد. تأكد من إنشاء Microsoft.Storage/storageAccounts/fileServices/shares مورد باستخدام قيمة WEBSITE_CONTENTSHARE، كما هو موضح في هذا المثال (قالب| ARMلملف العضلة ذات الرأسين). تحتاج أيضا إلى ضبط خاصية vnetContentShareEnabled الموقع على true.

Note

عندما لا تكون هذه الإعدادات جزءا من نشر يستخدم حساب تخزين آمن، ترى هذا الخطأ أثناء التحقق من صحة النشر: Could not access storage account using provided connection string.

توفر هذه المشاريع أمثلة على قوالب Bicep وARM لكيفية نشر تطبيقات الوظائف في شبكة افتراضية، بما في ذلك قيود الوصول إلى الشبكة:

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

إعدادات الشبكة المقيدة

قد تحتاج أيضا إلى استخدام هذه الإعدادات عندما يحتوي تطبيق الوظائف على قيود على الشبكة:

Setting Value Description
WEBSITE_CONTENTOVERVNET 1 إعداد التطبيق الذي يمكن تطبيق الوظائف من التوسع عندما يكون حساب التخزين مقيدا بشبكة ظاهرية. لمزيد من المعلومات، راجع تقييد حساب التخزين الخاص بك بشبكة ظاهرية.
vnetrouteallenabled 1 إعداد الموقع الذي يفرض على كل حركة المرور من تطبيق الوظائف استخدام الشبكة الظاهرية. لمزيد من المعلومات، راجع تكامل الشبكة الظاهرية الإقليمية. يحل إعداد الموقع هذا محل إعداد WEBSITE_VNET_ROUTE_ALLالتطبيق .

اعتبارات قيود الشبكة

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

مفاتيح الوصول إلى الدالة

تعريف مفاتيح الوصول إلى الوظائف على مستوى المضيف كموارد Azure. تتيح لك هذه الطريقة إنشاء وإدارة مفاتيح المضيف في قوالب ARM وملفات البايسب. يعرف مفتاح المضيف بأنه مورد من النوع Microsoft.Web/sites/host/functionKeys. المثال التالي ينشئ مفتاح وصول على مستوى المضيف يسمى my_custom_key عند إنشاء تطبيق الوظيفة:

resource functionKey 'Microsoft.Web/sites/host/functionKeys@2022-09-01' = {
  name: '${parameters('name')}/default/my_custom_key'
  properties: {
    name: 'my_custom_key'
  }
  dependsOn: [
    resourceId('Microsoft.Web/Sites', parameters('name'))
  ]
}

في هذا المثال، المعلمة name هي اسم تطبيق الوظائف الجديد. يجب تضمين dependsOn إعداد لضمان إنشاء المفتاح باستخدام تطبيق الوظائف الجديد. أخيرا، يمكن أن properties يتضمن كائن مفتاح المضيف خاصية value يمكنك استخدامها لتعيين مفتاح معين.

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

إنشاء القالب الخاص بك

يمكن للخبراء الذين يستخدمون قوالب Bicep أو ARM برمجة نشراتهم يدويا باستخدام محرر نصوص بسيط. بالنسبة لبقية الناس، هناك عدة خيارات تجعل عملية التطوير أسهل:

  • كود فيجوال ستوديو: تتوفر امتدادات لمساعدتك في العمل مع ملفات العضلة ذات الرأسوقوالب ARM. استخدم هذه الأدوات لمساعدتك على التأكد من صحة الكود. توفر بعض التأكيدات الأساسية.

  • Azure portal: عندما تنشئ تطبيق الوظائف والموارد ذات الصلة في بوابة تنشئ تطبيق الوظائف والموارد ذات الصلة في البوابة/c1، تظهر الشاشة النهائية Review + create رابط تحميل قالب للأتمتة.

    تحميل رابط القالب من عملية إنشاء Azure Functions في بوابة Azure.

    يعرض لك هذا الارتباط قالب ARM الذي تم إنشاؤه استنادا إلى الخيارات التي اخترتها في المدخل. يمكن أن يبدو هذا القالب معقدا بعض الشيء عند إنشاء تطبيق وظائف مع العديد من الموارد الجديدة. ومع ذلك، يمكن أن يوفر مرجعا جيدا لكيفية ظهور قالب ARM الخاص بك.

صلاحية القالب الخاص بك

عند إنشاء ملف قالب التوزيع يدويا، من المهم التحقق من صحة القالب قبل النشر. تتحقق جميع أساليب النشر من صحة بناء جملة القالب الخاص بك وترفع validation failed رسالة خطأ كما هو موضح في المثال التالي بتنسيق JSON:

{"error":{"code":"InvalidTemplate","message":"Deployment template validation failed: 'The resource 'Microsoft.Web/sites/func-xyz' is not defined in the template. Please see https://aka.ms/arm-template for usage details.'.","additionalInfo":[{"type":"TemplateViolation","info":{"lineNumber":0,"linePosition":0,"path":""}}]}}

استخدم الطرق التالية للتحقق من صحة القالب قبل النشر:

مهمة نشر مجموعة الموارد v<2 Azure التالية مع >Azure Pipelines تطلب التحقق من صحة القالب.

- task: AzureResourceManagerTemplateDeployment@3
  inputs:
    deploymentScope: 'Resource Group'
    subscriptionId: # Required subscription ID
    action: 'Create Or Update Resource Group'
    resourceGroupName: # Required resource group name
    location: # Required when action == Create Or Update Resource Group
    templateLocation: 'Linked artifact'
    csmFile: # Required when  TemplateLocation == Linked Artifact
    csmParametersFile: # Optional
    deploymentMode: 'Validation'

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

نشر قالبك

استخدم أيا من الطرق التالية لنشر ملف وقالب العضلة ذات الرأس المزدوجة الخاص بك:

  • واجهة سطر الأوامر Azure (Azure CLI)
  • PowerShell

زر Deploy to Azure

Note

هذه الطريقة لا تدعم نشر ملفات Bicep حاليا.

استبدل <url-encoded-path-to-azuredeploy-json> بنسخة URL-encoded من المسار الخام لملف azuredeploy.json في GitHub.

وفيما يلي مثال يستخدم علامة markdown:

[![Deploy to Azure](https://azuredeploy.net/deploybutton.png)](https://portal.azure.com/#create/Microsoft.Template/uri/<url-encoded-path-to-azuredeploy-json>)

فيما يلي مثال يستخدم HTML:

<a href="https://portal.azure.com/#create/Microsoft.Template/uri/<url-encoded-path-to-azuredeploy-json>" target="_blank"><img src="https://azuredeploy.net/deploybutton.png"></a>

نشر باستخدام PowerShell

تقوم أوامر PowerShell التالية بإنشاء مجموعة موارد ونشر ملف Bicep أو قالب ARM ينشئ تطبيق وظائف بالموارد المطلوبة. لتشغيل الأوامر محليا، يجب أن يكون لديك Azure PowerShell مثبت. لتسجيل الدخول إلى Azure، أول تشغيل Connect-AzAccount.

# Register Resource Providers if they're not already registered
Register-AzResourceProvider -ProviderNamespace "microsoft.web"
Register-AzResourceProvider -ProviderNamespace "microsoft.storage"

# Create a resource group for the function app
New-AzResourceGroup -Name "MyResourceGroup" -Location 'West Europe'

# Deploy the template
New-AzResourceGroupDeployment -ResourceGroupName "MyResourceGroup" -TemplateFile main.bicep  -Verbose

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

الخطوات التالية

تعرف أكثر على كيفية تطوير وتكوين Azure Functions.