أتمتة توزيع الموارد لتطبيق الوظيفة في وظائف Azure
يمكنك استخدام ملف Bicep أو قالب Azure Resource Manager لأتمتة عملية نشر تطبيق دالة إلى موارد Azure الجديدة أو الموجودة. توفر هذه الأتمتة طريقة رائعة لتكون قادرا على دمج عمليات توزيع الموارد الخاصة بك مع التعليمات البرمجية المصدر في DevOps، أو استعادة تطبيق دالة والموارد ذات الصلة من نسخة احتياطية، أو نشر مخطط تطبيق عدة مرات.
توضح لك هذه المقالة كيفية أتمتة إنشاء الموارد ونشرها ل Azure Functions. اعتمادا على المشغلات والروابط المستخدمة من قبل الوظائف الخاصة بك، قد تحتاج إلى نشر موارد أخرى، والتي هي خارج نطاق هذه المقالة.
تعتمد التعليمات البرمجية المحددة للقالب على كيفية استضافة تطبيق الوظائف، وما إذا كنت تقوم بنشر التعليمات البرمجية أو تطبيق وظائف في حاوية، ونظام التشغيل الذي يستخدمه تطبيقك. تدعم هذه المقالة خيارات الاستضافة التالية:
خيار الاستضافة | نوع التوزيع | لمعرفة المزيد، راجع... |
---|---|---|
خطة استهلاك وظائف Azure | تعليمة برمجية فقط | خطة الاستهلاك |
خطة Azure Functions Elastic Premium | التعليمات البرمجية | حاويه | خطة متميزة |
خطة Azure Functions Dedicated (App Service) | التعليمات البرمجية | حاويه | خطة مخصصة |
Azure Container Apps | الحاوية فقط | استضافة تطبيقات الحاوية لوظائف Azure |
Azure Arc | التعليمات البرمجية | حاويه | App Service وFunctions وLogic Apps على Azure Arc (معاينة) |
الموارد المطلوبة
عادة ما يتكون التوزيع المستضاف على Azure Functions من هذه الموارد:
Resource | المتطلبات | مرجع بناء الجملة والخصائص |
---|---|---|
A حساب تخزين | المطلوب | Microsoft.Storage/storageAccounts |
مكوّن تحليلات التطبيق | مستحسن | Microsoft.Insights/مكوّنات |
خطة الاستضافة | مطلوب1 | Microsoft.Web/مزارع الخادم |
تطبيق دالة | المطلوب | Microsoft.Web/sites |
عادة ما يتكون توزيع Azure Functions لخطة الاستهلاك من هذه الموارد:
Resource | المتطلبات | مرجع بناء الجملة والخصائص |
---|---|---|
A حساب تخزين | المطلوب | Microsoft.Storage/storageAccounts |
مكوّن تحليلات التطبيق | مستحسن | Microsoft.Insights/مكوّنات |
تطبيق دالة | المطلوب | Microsoft.Web/sites |
عادة ما يتكون النشر المستضاف من Azure Container Apps من هذه الموارد:
Resource | المتطلبات | مرجع بناء الجملة والخصائص |
---|---|---|
A حساب تخزين | المطلوب | Microsoft.Storage/storageAccounts |
مكوّن تحليلات التطبيق | مستحسن | Microsoft.Insights/مكوّنات |
بيئة مدارة | المطلوب | Microsoft.App/managedEnvironments |
تطبيق دالة | المطلوب | Microsoft.Web/sites |
عادة ما يتكون النشر المستضاف من Azure Arc من هذه الموارد:
Resource | المتطلبات | مرجع بناء الجملة والخصائص |
---|---|---|
A حساب تخزين | المطلوب | Microsoft.Storage/storageAccounts |
مكوّن تحليلات التطبيق | مستحسن | Microsoft.Insights/مكوّنات |
بيئة App Service Kubernetes | المطلوب | Microsoft.ExtendedLocation/customLocations |
تطبيق دالة | المطلوب | Microsoft.Web/sites |
1لا يلزم وجود خطة استضافة صريحة عند اختيار استضافة تطبيق الوظائف في خطة الاستهلاك.
عند نشر موارد متعددة في ملف Bicep واحد أو قالب ARM، يكون الترتيب الذي يتم إنشاء الموارد به مهما. هذا المطلب هو نتيجة للتبعيات بين الموارد. لهذه التبعيات، تأكد من استخدام dependsOn
العنصر لتعريف التبعية في المورد التابع. لمزيد من المعلومات، راجع إما تعريف ترتيب توزيع الموارد في قوالب ARM أو تبعيات الموارد في Bicep.
تفترض هذه المقالة أن لديك فهما أساسيا حول إنشاء ملفات Bicep أو تأليف قوالب Azure Resource Manager، ويتم عرض الأمثلة كأقسام فردية لموارد معينة. للحصول على مجموعة واسعة من ملفات Bicep الكاملة وأمثلة قالب ARM، راجع أمثلة نشر تطبيق الوظائف هذه.
المتطلبات الأساسية
تفترض هذه المقالة أنك قمت بالفعل بإنشاء بيئة مدارة في Azure Container Apps. تحتاج إلى كل من اسم ومعرف البيئة المدارة لإنشاء تطبيق دالة مستضاف على تطبيقات الحاوية.
تفترض هذه المقالة أنك قمت بالفعل بإنشاء موقع مخصص ممكن لخدمة التطبيقات على مجموعة Kubernetes الممكنة في Azure Arc. تحتاج إلى كل من معرف الموقع المخصص ومعرف بيئة Kubernetes لإنشاء تطبيق دالة مستضاف في موقع Azure Arc المخصص.
«Create storage account»
تتطلب جميع تطبيقات الوظائف حساب تخزين Azure. تحتاج إلى حساب عام الغرض يدعم الكائنات الثنائية كبيرة الحجم والجداول وقوائم الانتظار والملفات. للحصول على مزيد من المعلومات، راجع متطلبات حساب تخزين وظائف Azure.
هام
يتم استخدام حساب التخزين لتخزين بيانات التطبيق المهمة، بما في ذلك أحيانا التعليمات البرمجية للتطبيق نفسه. يجب تقييد الوصول من التطبيقات والمستخدمين الآخرين إلى حساب التخزين.
ينشئ قسم المثال هذا حساب تخزين قياسي للأغراض العامة v2:
"resources": [
{
"type": "Microsoft.Storage/storageAccounts",
"apiVersion": "2022-05-01",
"name": "[parameters('storageAccountName')]",
"location": "[parameters('location')]",
"kind": "StorageV2",
"sku": {
"name": "[parameters('storageAccountType')]"
},
"properties": {
"supportsHttpsTrafficOnly": true,
"defaultToOAuthAuthentication": true
}
}
]
لمزيد من السياق، راجع ملف azuredeploy.json الكامل في مستودع القوالب.
تحتاج إلى تعيين سلسلة الاتصال حساب التخزين هذا كإعداد AzureWebJobsStorage
التطبيق، والذي تتطلبه الوظائف. تنشئ القوالب الموجودة في هذه المقالة قيمة سلسلة الاتصال هذه استنادا إلى حساب التخزين الذي تم إنشاؤه، وهو أفضل ممارسة. لمزيد من المعلومات، راجع تكوين التطبيق.
تمكين سجلات التخزين
نظرا لاستخدام حساب التخزين لبيانات تطبيق الوظائف المهمة، يجب عليك مراقبة الحساب لتعديل هذا المحتوى. لمراقبة حساب التخزين الخاص بك، تحتاج إلى تكوين سجلات موارد Azure Monitor ل Azure Storage. في هذا المثال، يتم استخدام مساحة عمل Log Analytics المسماة myLogAnalytics
كوجهة لهذه السجلات.
"resources": [
{
"type": "Microsoft.Insights/diagnosticSettings",
"apiVersion": "2021-05-01-preview",
"scope": "[format('Microsoft.Storage/storageAccounts/{0}/blobServices/default', parameters('storageAccountName'))]",
"name": "[parameters('storageDataPlaneLogsName')]",
"properties": {
"workspaceId": "[resourceId('Microsoft.OperationalInsights/workspaces', parameters('myLogAnalytics'))]",
"logs": [
{
"category": "StorageWrite",
"enabled": true
}
],
"metrics": [
{
"category": "Transaction",
"enabled": true
}
]
}
}
]
يمكن استخدام نفس مساحة العمل هذه لمورد Application Insights المحدد لاحقا. لمزيد من المعلومات، بما في ذلك كيفية العمل مع هذه السجلات، راجع مراقبة تخزين Azure.
إنشاء Application Insights
يوصى باستخدام Application Insights لمراقبة عمليات تنفيذ تطبيق الوظائف. في هذا القسم المثال، يتم تعريف مورد Application Insights بالنوع Microsoft.Insights/components
والنوع web
:
{
"type": "Microsoft.Insights/components",
"apiVersion": "2020-02-02",
"name": "[variables('applicationInsightsName')]",
"location": "[parameters('appInsightsLocation')]",
"tags": {
"[format('hidden-link:{0}', resourceId('Microsoft.Web/sites', parameters('functionAppName')))]": "Resource"
},
"properties": {
"Application_Type": "web"
},
"kind": "web"
},
لمزيد من السياق، راجع ملف azuredeploy.json الكامل في مستودع القوالب.
يجب توفير الاتصال بتطبيق الوظائف باستخدام APPLICATIONINSIGHTS_CONNECTION_STRING
إعداد التطبيق. لمزيد من المعلومات، راجع إعدادات التطبيق.
تحصل الأمثلة في هذه المقالة على قيمة سلسلة الاتصال للمثيل الذي تم إنشاؤه. قد تستخدم APPINSIGHTS_INSTRUMENTATIONKEY
الإصدارات القديمة بدلا من ذلك لتعيين مفتاح تقرير عن حالة النظام، والذي لم يعد مستحسنا.
إنشاء خطة الاستضافة
يجب أن تحتوي التطبيقات المستضافة في خطة Azure Functions Premium أو خطة مخصصة (خدمة التطبيقات) على خطة استضافة محددة بشكل صريح.
تقدم الخطة المتميزة نفس التحجيم الذي توفره خطة الاستهلاك ولكنها تتضمن موارد مخصصة وقدرات إضافية. لمعرفة المزيد، راجع خطة وظائف Azure المتميزة.
الخطة المتميزة هي نوع خاص من مورد serverfarm
. يمكنك تحديده باستخدام أو EP1
EP2
أو EP3
لقيمة الخاصية Name
في الخاصية sku
. تعتمد الطريقة التي تحدد بها خطة استضافة الوظائف على ما إذا كان تطبيق الوظائف يعمل على Windows أو على Linux. ينشئ EP1
قسم المثال هذا خطة:
"resources": [
{
"type": "Microsoft.Web/serverfarms",
"apiVersion": "2022-03-01",
"name": "[parameters('hostingPlanName')]",
"location": "[parameters('location')]",
"sku": {
"name": "EP1",
"tier": "ElasticPremium",
"family": "EP"
},
"kind": "elastic",
"properties": {
"maximumElasticWorkerCount": 20
}
}
]
لمزيد من السياق، راجع ملف azuredeploy.json الكامل في مستودع القوالب.
لمزيد من المعلومات حول sku
العنصر، راجع SkuDefinition
قوالب المثال أو راجعها.
في خطة Dedicated (App Service)، يعمل تطبيق الوظائف على أجهزة ظاهرية مخصصة على وحدات SKU الأساسية والقياسية والمتميزة في خطط App Service، على غرار تطبيقات الويب. لمزيد من المعلومات، راجع الخطة المخصصة.
للحصول على نموذج ملف Bicep/قالب Azure Resource Manager، راجع تطبيق الوظائف على خطة Azure App Service
في Functions، الخطة المخصصة هي مجرد خطة App Service عادية، والتي يتم تعريفها بواسطة مورد serverfarm
. يجب توفير القيمة على الأقل name
. للحصول على قائمة بأسماء الخطط المدعومة، راجع --sku
الإعداد az appservice plan create
في القائمة الحالية للقيم المدعومة لخطة مخصصة.
تعتمد الطريقة التي تحدد بها خطة الاستضافة على ما إذا كان تطبيق الوظائف يعمل على Windows أو على Linux:
"resources": [
{
"type": "Microsoft.Web/serverfarms",
"apiVersion": "2022-03-01",
"name": "[parameters('hostingPlanName')]",
"location": "[parameters('location')]",
"sku": {
"tier": "Standard",
"name": "S1",
"size": "S1",
"family": "S",
"capacity": 1
}
}
]
لمزيد من السياق، راجع ملف azuredeploy.json الكامل في مستودع القوالب.
إنشاء خطة الاستضافة
لا تحتاج إلى تعريف مورد خطة استضافة الاستهلاك بشكل صريح. عند تخطي تعريف المورد هذا، يتم إنشاء خطة أو تحديدها تلقائيا على أساس كل منطقة عند إنشاء مورد تطبيق الوظيفة نفسه.
يمكنك تعريف خطة الاستهلاك بشكل صريح كنوع خاص من serverfarm
الموارد، والتي تحددها باستخدام قيمة Dynamic
الخاصيتين computeMode
و sku
. يوضح لك قسم المثال هذا كيفية تحديد خطة استهلاك بشكل صريح. تعتمد الطريقة التي تحدد بها خطة الاستضافة على ما إذا كان تطبيق الوظائف يعمل على Windows أو على Linux.
"resources": [
{
"type": "Microsoft.Web/serverfarms",
"apiVersion": "2022-03-01",
"name": "[parameters('hostingPlanName')]",
"location": "[parameters('location')]",
"sku": {
"name": "Y1",
"tier": "Dynamic",
"size": "Y1",
"family": "Y",
"capacity": 0
},
"properties": {
"computeMode": "Dynamic"
}
}
]
لمزيد من السياق، راجع ملف azuredeploy.json الكامل في مستودع القوالب.
بيئة Kubernetes
يمكن نشر Azure Functions في Kubernetes الممكنة في Azure Arc إما كمشروع تعليمة برمجية أو تطبيق وظائف في حاوية.
لإنشاء موارد التطبيق والتخطيط، يجب أن تكون قد أنشأت بالفعل بيئة Kubernetes لخدمة التطبيقات لمقطع تخزين Kubernetes الممكّنة بواسطة Azure Arc. تفترض الأمثلة في هذه المقالة أن لديك معرف المورد للموقع المخصص (customLocationId
) وبيئة App Service Kubernetes (kubeEnvironmentId
) التي تقوم بنشرها، والتي تم تعيينها في هذا المثال:
"parameters": {
"kubeEnvironmentId" : {
"type": "string"
},
"customLocationId" : {
"type": "string"
}
}
يجب أن تشير كل من المواقع والخطط إلى الموقع المخصص من خلال حقل extendedLocation
. كما هو موضح في هذا المثال المقتطع، extendedLocation
يقع خارج properties
، كنظير إلى kind
و location
:
{
"type": "Microsoft.Web/serverfarms",
...
{
"extendedLocation": {
"name": "[parameters('customLocationId')]"
},
}
}
يجب أن يستخدم مورد الخطة قيمة Kubernetes (K1
) ل SKU
، kind
ويجب أن يكون linux,kubernetes
الحقل ، ويجب أن تكون true
الخاصية reserved
، لأنها توزيع Linux. يجب عليك أيضا تعيين extendedLocation
و kubeEnvironmentProfile.id
إلى معرف الموقع المخصص ومعرف بيئة Kubernetes، على التوالي، والتي قد تبدو مثل هذا القسم المثال:
"resources": [
{
"type": "Microsoft.Web/serverfarms",
"apiVersion": "2022-03-01",
"name": "[parameters('hostingPlanName')]",
"location": "[parameters('location')]",
"kind": "linux,kubernetes",
"sku": {
"name": "K1",
"tier": "Kubernetes"
},
"extendedLocation": {
"name": "[parameters('customLocationId')]"
},
"properties": {
"kubeEnvironmentProfile": {
"id": "[parameters('kubeEnvironmentId')]"
},
"reserved": true
}
}
]
إنشاء تطبيق الدالة
يتم تعريف مورد تطبيق الدالة بواسطة مورد من النوع Microsoft.Web/sites
kind
ويتضمن functionapp
، كحد أدنى.
تعتمد الطريقة التي تحدد بها مورد تطبيق الوظائف على ما إذا كنت تستضيف على Linux أو على Windows:
للحصول على قائمة بإعدادات التطبيق المطلوبة عند التشغيل على Windows، راجع تكوين التطبيق. للحصول على نموذج ملف Bicep/قالب Azure Resource Manager، راجع تطبيق الوظائف المستضاف على Windows في قالب خطة الاستهلاك.
إشعار
إذا اخترت تحديد خطة الاستهلاك اختياريا، فيجب عليك تعيين serverFarmId
الخاصية على التطبيق بحيث تشير إلى معرف المورد للخطة. تأكد من أن تطبيق الوظيفة يحتوي على إعداد dependsOn
يشير أيضاً إلى الخطة. إذا لم تحدد خطة بشكل صريح، فسيتم إنشاء خطة لك.
قم بتعيين الخاصية serverFarmId
على التطبيق بحيث تشير إلى معرف المورد للخطة. تأكد من أن تطبيق الوظيفة يحتوي على إعداد dependsOn
يشير أيضاً إلى الخطة.
"resources": [
{
"type": "Microsoft.Web/sites",
"apiVersion": "2022-03-01",
"name": "[parameters('functionAppName')]",
"location": "[parameters('location')]",
"kind": "functionapp",
"dependsOn": [
"[resourceId('Microsoft.Insights/components', parameters('applicationInsightsName'))]",
"[resourceId('Microsoft.Web/serverfarms', parameters('hostingPlanName'))]",
"[resourceId('Microsoft.Storage/storageAccounts', parameters('storageAccountName'))]"
],
"properties": {
"serverFarmId": "[resourceId('Microsoft.Web/serverfarms', parameters('hostingPlanName'))]",
"siteConfig": {
"appSettings": [
{
"name": "APPLICATIONINSIGHTS_CONNECTION_STRING",
"value": "[reference(resourceId('Microsoft.Insights/components', parameters('applicationInsightsName')), '2020-02-02').ConnectionString]"
},
{
"name": "AzureWebJobsStorage",
"value": "[format('DefaultEndpointsProtocol=https;AccountName={0};EndpointSuffix={1};AccountKey={2}', parameters('storageAccountName'), environment().suffixes.storage, listKeys(resourceId('Microsoft.Storage/storageAccounts', parameters('storageAccountName')), '2021-09-01').keys[0].value)]"
},
{
"name": "WEBSITE_CONTENTAZUREFILECONNECTIONSTRING",
"value": "[format('DefaultEndpointsProtocol=https;AccountName={0};EndpointSuffix={1};AccountKey={2}', parameters('storageAccountName'), environment().suffixes.storage, listKeys(resourceId('Microsoft.Storage/storageAccounts', parameters('storageAccountName')), '2021-09-01').keys[0].value)]"
},
{
"name": "WEBSITE_CONTENTSHARE",
"value": "[toLower(parameters('functionAppName'))]"
},
{
"name": "FUNCTIONS_EXTENSION_VERSION",
"value": "~4"
},
{
"name": "FUNCTIONS_WORKER_RUNTIME",
"value": "node"
},
{
"name": "WEBSITE_NODE_DEFAULT_VERSION",
"value": "~14"
}
]
}
}
}
]
للحصول على مثال كامل من طرف إلى طرف، راجع قالب azuredeploy.json هذا.
"resources": [
{
"type": "Microsoft.Web/sites",
"apiVersion": "2022-03-01",
"name": "[parameters('functionAppName')]",
"location": "[parameters('location')]",
"kind": "functionapp",
"dependsOn": [
"[resourceId('Microsoft.Insights/components', parameters('applicationInsightsName'))]",
"[resourceId('Microsoft.Web/serverfarms', parameters('hostingPlanName'))]",
"[resourceId('Microsoft.Storage/storageAccounts', parameters('storageAccountName'))]"
],
"properties": {
"serverFarmId": "[resourceId('Microsoft.Web/serverfarms', parameters('hostingPlanName'))]",
"siteConfig": {
"alwaysOn": true,
"appSettings": [
{
"name": "APPLICATIONINSIGHTS_CONNECTION_STRING",
"value": "[reference(resourceId('Microsoft.Insights/components', parameters('applicationInsightsName')), '2020-02-02').ConnectionString]"
},
{
"name": "AzureWebJobsStorage",
"value": "[format('DefaultEndpointsProtocol=https;AccountName={0};EndpointSuffix={1};AccountKey={2}', parameters('storageAccountName'), environment().suffixes.storage, listKeys(resourceId('Microsoft.Storage/storageAccounts', parameters('storageAccountName')), '2021-09-01').keys[0].value)]"
},
{
"name": "FUNCTIONS_EXTENSION_VERSION",
"value": "~4"
},
{
"name": "FUNCTIONS_WORKER_RUNTIME",
"value": "node"
},
{
"name": "WEBSITE_NODE_DEFAULT_VERSION",
"value": "~14"
}
]
}
}
}
]
للحصول على مثال كامل من طرف إلى طرف، راجع قالب azuredeploy.json هذا.
مصادر التوزيع
يمكن لملف Bicep أو قالب ARM اختياريا أيضا تحديد توزيع للتعليمات البرمجية للدالة الخاصة بك، والتي يمكن أن تتضمن هذه الطرق:
مصادر التوزيع
يمكن لملف Bicep أو قالب ARM اختياريا أيضا تحديد توزيع للتعليمات البرمجية للدالة باستخدام حزمة توزيع مضغوطة.
لتوزيع التطبيق بنجاح باستخدام Azure Resource Manager، من المهم فهم كيفية توزيع الموارد في Azure. في معظم الأمثلة، يتم تطبيق تكوينات المستوى الأعلى باستخدام siteConfig
. من المهم تعيين هذه التكوينات في مستوى أعلى؛ لأنها تنقل المعلومات إلى مشغل وقت تشغيل وتوزيع المحرك. مطلوب معلومات المستوى الأعلى قبل تطبيق المورد التابع sourcecontrols/web
. على الرغم من أنه من الممكن تكوين هذه الإعدادات في المورد على مستوى config/appSettings
التابع، في بعض الحالات يجب نشر تطبيق الوظائف قبلconfig/appSettings
تطبيقه.
حزمة توزيع Zip
يعد توزيع Zip طريقة موصى بها لنشر التعليمات البرمجية لتطبيق الوظائف. بشكل افتراضي، تعمل الوظائف التي تستخدم توزيع zip في حزمة التوزيع نفسها. لمزيد من المعلومات، بما في ذلك متطلبات حزمة التوزيع، راجع توزيع Zip ل Azure Functions. عند استخدام أتمتة توزيع الموارد، يمكنك الرجوع إلى حزمة توزيع .zip في قالب Bicep أو ARM.
لاستخدام توزيع zip في القالب الخاص بك، قم بتعيين WEBSITE_RUN_FROM_PACKAGE
الإعداد في التطبيق إلى 1
وتضمين /zipDeploy
تعريف المورد.
بالنسبة لخطة الاستهلاك على Linux، قم بدلا من ذلك بتعيين URI لحزمة التوزيع مباشرة في WEBSITE_RUN_FROM_PACKAGE
الإعداد، كما هو موضح في هذا المثال القالب.
يضيف هذا المثال مصدر نشر مضغوط إلى تطبيق موجود:
{
"$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
"contentVersion": "1.0.0.0",
"parameters": {
"functionAppName": {
"type": "string",
"metadata": {
"description": "The name of the Azure Function app."
}
},
"location": {
"type": "string",
"defaultValue": "[resourceGroup().location]",
"metadata": {
"description": "The location into which the resources should be deployed."
}
},
"packageUri": {
"type": "string",
"metadata": {
"description": "The zip content url."
}
}
},
"resources": [
{
"name": "[concat(parameters('functionAppName'), '/ZipDeploy')]",
"type": "Microsoft.Web/sites/extensions",
"apiVersion": "2021-02-01",
"location": "[parameters('location')]",
"properties": {
"packageUri": "[parameters('packageUri')]"
}
}
]
}
ضع الأشياء التالية في الاعتبار عند تضمين موارد توزيع zip في القالب الخاص بك:
- خطط الاستهلاك على Linux لا تدعم
WEBSITE_RUN_FROM_PACKAGE = 1
. يجب عليك بدلا من ذلك تعيين URI لحزمة التوزيع مباشرة فيWEBSITE_RUN_FROM_PACKAGE
الإعداد. لمزيد من المعلومات، راجع WEBSITE_RUN_FROM_PACKAGE. للحصول على مثال قالب، راجع تطبيق الوظائف المستضاف على Linux في خطة الاستهلاك.
packageUri
يجب أن يكون موقعا يمكن الوصول إليه بواسطة Functions. ضع في اعتبارك استخدام تخزين Azure blob مع توقيع وصول مشترك (SAS). بعد انتهاء صلاحية SAS، لا يمكن للدالات الوصول إلى المشاركة الخاصة بالنشر. عند إعادة إنشاء SAS الخاص بك، تذكر تحديثWEBSITE_RUN_FROM_PACKAGE
الإعداد بقيمة URI الجديدة.عند الإعداد
WEBSITE_RUN_FROM_PACKAGE
إلى URI، يجب مزامنة المشغلات يدويا.تأكد من تعيين جميع إعدادات التطبيق المطلوبة دائما في
appSettings
المجموعة عند إضافة الإعدادات أو تحديثها. تتم إزالة الإعدادات الموجودة التي لم يتم تعيينها بشكل صريح بواسطة التحديث. لمزيد من المعلومات، راجع تكوين التطبيق.لا تدعم الوظائف Web Deploy (msdeploy) لتوزيع الحزمة. يجب عليك بدلا من ذلك استخدام توزيع zip في مسارات التوزيع والأتمتة. لمزيد من المعلومات، راجع توزيع Zip ل Azure Functions.
الإصدارات البعيدة
تفترض عملية التوزيع أن ملف .zip الذي تستخدمه أو نشر zip يحتوي على تطبيق جاهز للتشغيل. وهذا يعني أنه بشكل افتراضي لا يتم تشغيل أي تخصيصات.
ومع ذلك، هناك سيناريوهات تتطلب منك إعادة إنشاء تطبيقك عن بعد، مثل عندما تحتاج إلى سحب حزم خاصة بنظام Linux في Python أو Node.js التطبيقات التي طورتها على كمبيوتر Windows. في هذه الحالة، يمكنك تكوين Functions لتنفيذ بنية عن بعد على التعليمات البرمجية الخاصة بك بعد نشر الرمز البريدي.
تعتمد الطريقة التي تطلب بها إنشاء عن بعد على نظام التشغيل الذي تقوم بالنشر إليه:
عند نشر تطبيق في Windows، يتم تشغيل الأوامر الخاصة باللغة (مثل dotnet restore
تطبيقات C# أو npm install
تطبيقات Node.js).
لتمكين نفس عمليات الإنشاء التي تحصل عليها مع التكامل المستمر، أضف SCM_DO_BUILD_DURING_DEPLOYMENT=true
إلى إعدادات التطبيق في التعليمات البرمجية WEBSITE_RUN_FROM_PACKAGE
للتوزيع الخاص بك وقم بإزالة بالكامل.
حاويات Linux
إذا كنت تقوم بنشر تطبيق وظائف في حاوية إلى Azure Functions Premium أو خطة مخصصة، يجب عليك:
linuxFxVersion
تعيين إعداد الموقع باستخدام معرف صورة الحاوية.- تعيين أي إعدادات مطلوبة
DOCKER_REGISTRY_SERVER_*
عند الحصول على الحاوية من سجل خاص. - تعيين
WEBSITES_ENABLE_APP_SERVICE_STORAGE
إعداد التطبيق إلىfalse
.
لمزيد من المعلومات، راجع تكوين التطبيق.
"resources": [
{
"type": "Microsoft.Web/sites",
"apiVersion": "2022-03-01",
"name": "[parameters('functionAppName')]",
"location": "[parameters('location')]",
"kind": "functionapp",
"dependsOn": [
"[resourceId('Microsoft.Web/serverfarms', parameters('hostingPlanName'))]",
"[resourceId('Microsoft.Storage/storageAccounts', parameters('storageAccountName'))]"
],
"properties": {
"serverFarmId": "[resourceId('Microsoft.Web/serverfarms', parameters('hostingPlanName'))]",
"siteConfig": {
"appSettings": [
{
"name": "AzureWebJobsStorage",
"value": "[format('DefaultEndpointsProtocol=https;AccountName={0};AccountKey={1}', parameters('storageAccountName'), listKeys(resourceId('Microsoft.Storage/storageAccounts', parameters('storageAccountName')), '2021-09-01').keys[0].value)]"
},
{
"name": "FUNCTIONS_WORKER_RUNTIME",
"value": "node"
},
{
"name": "WEBSITE_NODE_DEFAULT_VERSION",
"value": "~14"
},
{
"name": "FUNCTIONS_EXTENSION_VERSION",
"value": "~4"
},
{
"name": "DOCKER_REGISTRY_SERVER_URL",
"value": "[parameters('dockerRegistryUrl')]"
},
{
"name": "DOCKER_REGISTRY_SERVER_USERNAME",
"value": "[parameters('dockerRegistryUsername')]"
},
{
"name": "DOCKER_REGISTRY_SERVER_PASSWORD",
"value": "[parameters('dockerRegistryPassword')]"
},
{
"name": "WEBSITES_ENABLE_APP_SERVICE_STORAGE",
"value": "false"
}
],
"linuxFxVersion": "DOCKER|myacr.azurecr.io/myimage:mytag"
}
}
}
]
عند نشر الوظائف الحاوية إلى Azure Container Apps، يجب أن يكون القالب الخاص بك:
kind
تعيين الحقل إلى قيمةfunctionapp,linux,container,azurecontainerapps
.managedEnvironmentId
قم بتعيين خاصية الموقع إلى URI المؤهل بالكامل لبيئة Container Apps.- إضافة ارتباط مورد في مجموعة الموقع
dependsOn
عند إنشاء مورد في نفس الوقت الذي يتم فيه إنشاءMicrosoft.App/managedEnvironments
الموقع.
قد يبدو تعريف تطبيق وظائف حاوية تم نشره من سجل حاوية خاص إلى بيئة Container Apps موجودة مثل هذا المثال:
"resources": [
{
"type": "Microsoft.Web/sites",
"apiVersion": "2022-03-01",
"name": "[parameters('functionAppName')]",
"kind": "functionapp,linux,container,azurecontainerapps",
"location": "[parameters('location')]",
"dependsOn": [
"[resourceId('Microsoft.Insights/components', parameters('applicationInsightsName'))]",
"[resourceId('Microsoft.Storage/storageAccounts', parameters('storageAccountName'))]"
],
"properties": {
"serverFarmId": "[parameters('hostingPlanName')]",
"siteConfig": {
"linuxFxVersion": "DOCKER|myacr.azurecr.io/myimage:mytag",
"appSettings": [
{
"name": "FUNCTIONS_EXTENSION_VERSION",
"value": "~4"
},
{
"name": "AzureWebJobsStorage",
"value": "[format('DefaultEndpointsProtocol=https;AccountName={0};AccountKey={1}', parameters('storageAccountName'), listKeys(resourceId('Microsoft.Storage/storageAccounts', parameters('storageAccountName')), '2021-09-01').keys[0].value)]"
},
{
"name": "APPLICATIONINSIGHTS_CONNECTION_STRING",
"value": "[reference(resourceId('Microsoft.Insights/components', parameters('applicationInsightsName')), '2020-02-02').ConnectionString]"
}
],
},
"managedEnvironmentId": "[parameters('managedEnvironmentId')]"
}
}
]
عند نشر الدالات إلى Azure Arc، تعتمد القيمة التي قمت بتعيينها لحقل kind
مورد تطبيق الوظائف على نوع النشر:
نوع التوزيع | kind قيمة الحقل |
---|---|
نشر التعليمات البرمجية فقط | functionapp,linux,kubernetes |
نشر الحاوية | functionapp,linux,kubernetes,container |
يجب عليك أيضا تعيين customLocationId
كما فعلت لمورد خطة الاستضافة.
قد يبدو تعريف تطبيق الوظائف المعبأة في حاويات، باستخدام صورة التشغيل السريع .NET 6، مثل هذا المثال:
"resources": [
{
"type": "Microsoft.Web/sites",
"apiVersion": "2022-03-01",
"name": "[parameters('functionAppName')]",
"kind": "kubernetes,functionapp,linux,container",
"location": "[parameters('location')]",
"extendedLocation": {
"name": "[parameters('customLocationId')]"
},
"dependsOn": [
"[resourceId('Microsoft.Insights/components', parameters('applicationInsightsName'))]",
"[resourceId('Microsoft.Web/serverfarms', parameters('hostingPlanName'))]",
"[resourceId('Microsoft.Storage/storageAccounts', parameters('storageAccountName'))]"
],
"properties": {
"serverFarmId": "[parameters('hostingPlanName')]",
"siteConfig": {
"linuxFxVersion": "DOCKER|mcr.microsoft.com/azure-functions/4-dotnet-isolated6.0-appservice-quickstart",
"appSettings": [
{
"name": "FUNCTIONS_EXTENSION_VERSION",
"value": "~4"
},
{
"name": "AzureWebJobsStorage",
"value": "[format('DefaultEndpointsProtocol=https;AccountName={0};AccountKey={1}', parameters('storageAccountName'), listKeys(resourceId('Microsoft.Storage/storageAccounts', parameters('storageAccountName')), '2021-09-01').keys[0].value)]"
},
{
"name": "APPLICATIONINSIGHTS_CONNECTION_STRING",
"value": "[reference(resourceId('Microsoft.Insights/components', parameters('applicationInsightsName')), '2020-02-02').ConnectionString]"
}
],
"alwaysOn": true
}
}
}
]
تكوين التطبيق
توفر الوظائف الخيارات التالية لتكوين تطبيق الوظائف في Azure:
التكوين | Microsoft.Web/sites خاصية |
---|---|
إعدادات الموقع | siteConfig |
إعدادات التطبيق | siteConfig.appSettings جمع |
إعدادات الموقع التالية مطلوبة على الخاصية siteConfig
:
إعدادات التطبيق هذه مطلوبة (أو مستحسنة) لنظام تشغيل معين وخيار استضافة:
إعدادات التطبيق هذه مطلوبة لنشر الحاوية:
هذه الإعدادات مطلوبة فقط عند النشر من سجل حاوية خاص:
ضع هذه الاعتبارات في الاعتبار عند العمل مع إعدادات الموقع والتطبيق باستخدام ملفات Bicep أو قوالب ARM:
- هناك اعتبارات مهمة للوقت الذي يجب تعيينه
WEBSITE_CONTENTSHARE
في نشر تلقائي. للحصول على إرشادات مفصلة، راجعWEBSITE_CONTENTSHARE
المرجع.
- بالنسبة إلى عمليات نشر الحاوية، قم أيضا بتعيين
WEBSITES_ENABLE_APP_SERVICE_STORAGE
إلىfalse
، حيث يتم توفير محتوى التطبيق الخاص بك في الحاوية نفسها.
يجب عليك دائما تعريف إعدادات التطبيق كمجموعة
siteConfig/appSettings
من المورد الذيMicrosoft.Web/sites
يتم إنشاؤه، كما هو الحال في الأمثلة الواردة في هذه المقالة. وهذا يضمن أن الإعدادات التي يحتاج تطبيق الوظائف إلى تشغيلها متوفرة عند بدء التشغيل الأولي.عند إضافة إعدادات التطبيق أو تحديثها باستخدام القوالب، تأكد من تضمين جميع الإعدادات الموجودة مع التحديث. يجب القيام بذلك لأن استدعاءات واجهة برمجة تطبيقات REST للتحديث الأساسي تحل محل المورد بأكمله
/config/appsettings
. إذا قمت بإزالة الإعدادات الموجودة، فلن يتم تشغيل تطبيق الوظائف. لتحديث إعدادات التطبيق الفردية برمجيا، يمكنك بدلا من ذلك استخدام Azure CLI أو Azure PowerShell أو مدخل Microsoft Azure لإجراء هذه التغييرات. لمزيد من المعلومات، راجع العمل مع إعدادات التطبيق.
عمليات نشر الفتحة
تتيح لك الوظائف نشر إصدارات مختلفة من التعليمات البرمجية الخاصة بك إلى نقاط نهاية فريدة في تطبيق الوظائف. وهذا يسهل تطوير تحديثات الوظائف والتحقق من صحتها ونشرها دون التأثير على الوظائف التي تعمل في الإنتاج. فتحات النشر هي ميزة من ميزات Azure App Service. يعتمد عدد الفتحات المتوفرة على خطة الاستضافة الخاصة بك. لمزيد من المعلومات، راجع وظائف فتحات توزيع Azure Functions .
يتم تعريف مورد الفتحة بنفس طريقة تعريف مورد تطبيق الوظائف (Microsoft.Web/sites
)، ولكن بدلا من ذلك يمكنك استخدام Microsoft.Web/sites/slots
معرف المورد. للحصول على مثال للتوزيع (في كل من قوالب Bicep وARM) التي تنشئ كلا من الإنتاج وفتحة التقسيم المرحلي في خطة Premium، راجع Azure Function App مع فتحة نشر.
للتعرف على كيفية إجراء التبديل باستخدام القوالب، راجع أتمتة باستخدام قوالب Resource Manager.
ضع الاعتبارات التالية في الاعتبار عند العمل مع عمليات توزيع الفتحات:
لا تقم بتعيين
WEBSITE_CONTENTSHARE
الإعداد بشكل صريح في تعريف فتحة التوزيع. يتم إنشاء هذا الإعداد لك عند إنشاء التطبيق في فتحة التوزيع.عند تبديل الفتحات، تعتبر بعض إعدادات التطبيق "ملصقة"، من حيث أنها تبقى مع الفتحة وليس مع تبديل التعليمات البرمجية. يمكنك تعريف إعداد الفتحة هذا عن طريق تضمين
"slotSetting":true
في تعريف إعداد التطبيق المحدد في القالب الخاص بك. لمزيد من المعلومات، راجع إدارة الإعدادات.
عمليات النشر الآمنة
يمكنك إنشاء تطبيق الوظائف في عملية نشر حيث تم تأمين مورد واحد أو أكثر من خلال التكامل مع الشبكات الظاهرية. يتم تعريف تكامل الشبكة الظاهرية لتطبيق الوظائف الخاص بك بواسطة Microsoft.Web/sites/networkConfig
مورد. يعتمد هذا التكامل على كل من تطبيق الوظائف المشار إليه وموارد الشبكة الظاهرية. قد يعتمد تطبيق الوظائف أيضا على موارد الشبكات الخاصة الأخرى، مثل نقاط النهاية والمسارات الخاصة. لمزيد من المعلومات، راجع خيارات شبكة Azure Functions.
عند إنشاء نشر يستخدم حساب تخزين آمن، يجب عليك تعيين WEBSITE_CONTENTSHARE
الإعداد بشكل صريح وإنشاء مورد مشاركة الملف المسمى في هذا الإعداد. تأكد من إنشاء Microsoft.Storage/storageAccounts/fileServices/shares
مورد باستخدام قيمة WEBSITE_CONTENTSHARE
، كما هو موضح في هذا المثال (ملف Bicep لقالب|ARM). ستحتاج أيضا إلى تعيين خاصية vnetContentShareEnabled
الموقع إلى صحيح.
إشعار
عندما لا تكون هذه الإعدادات جزءا من عملية نشر تستخدم حساب تخزين آمن، سترى هذا الخطأ أثناء التحقق من صحة التوزيع: Could not access storage account using provided connection string
.
توفر هذه المشاريع كلا من أمثلة قالب Bicep وARM لكيفية نشر تطبيقات الوظائف في شبكة ظاهرية، بما في ذلك مع قيود الوصول إلى الشبكة:
سيناريو مقيد | الوصف |
---|---|
إنشاء تطبيق دالة مع تكامل الشبكة الظاهرية | يتم إنشاء تطبيق الوظائف الخاص بك في شبكة ظاهرية مع الوصول الكامل إلى الموارد في تلك الشبكة. الوصول الوارد والصادر إلى تطبيق الوظائف غير مقيد. للحصول على مزيد من المعلومات، يُرجى الرجوع إلى تكامل الشبكة الافتراضية. |
إنشاء تطبيق دالة يصل إلى حساب تخزين آمن | يستخدم تطبيق الوظائف الذي تم إنشاؤه حساب تخزين آمن، والذي تصل إليه الوظائف باستخدام نقاط النهاية الخاصة. لمزيد من المعلومات، راجع تقييد حساب التخزين الخاص بك بشبكة ظاهرية. |
إنشاء تطبيق دالة وحساب تخزين يستخدم كلاهما نقاط النهاية الخاصة | لا يمكن الوصول إلى تطبيق الوظائف الذي تم إنشاؤه إلا باستخدام نقاط النهاية الخاصة، ويستخدم نقاط نهاية خاصة للوصول إلى موارد التخزين. لمزيد من المعلومات، راجع نقاط النهاية الخاصة. |
إعدادات الشبكة المقيدة
قد تحتاج أيضا إلى استخدام هذه الإعدادات عندما يحتوي تطبيق الوظائف على قيود على الشبكة:
الإعداد | قيمة | الوصف |
---|---|---|
WEBSITE_CONTENTOVERVNET |
1 |
إعداد التطبيق الذي يمكن تطبيق الوظائف من التوسع عندما يكون حساب التخزين مقيدا بشبكة ظاهرية. لمزيد من المعلومات، راجع تقييد حساب التخزين الخاص بك بشبكة ظاهرية. |
vnetrouteallenabled |
1 |
إعداد الموقع الذي يفرض على كل حركة المرور من تطبيق الوظائف استخدام الشبكة الظاهرية. لمزيد من المعلومات، راجع تكامل الشبكة الظاهرية الإقليمية. يحل إعداد الموقع هذا محل إعداد WEBSITE_VNET_ROUTE_ALL التطبيق . |
اعتبارات قيود الشبكة
عندما تقيد الوصول إلى حساب التخزين من خلال نقاط النهاية الخاصة، لا يمكنك الوصول إلى حساب التخزين من خلال المدخل أو أي جهاز خارج الشبكة الظاهرية. يمكنك منح حق الوصول إلى عنوان IP الآمن أو الشبكة الظاهرية في حساب التخزين عن طريق إدارة قاعدة الوصول إلى الشبكة الافتراضية.
إنشاء القالب الخاص بك
يمكن للخبراء الذين لديهم قوالب Bicep أو ARM ترميز عمليات النشر يدويا باستخدام محرر نص بسيط. بالنسبة لبقيتنا، هناك عدة طرق لتسهيل عملية التطوير:
Visual Studio Code: هناك ملحقات متوفرة لمساعدتك في العمل مع كل من ملفات Bicep وقوالب ARM. يمكنك استخدام هذه الأدوات للمساعدة في التأكد من صحة التعليمات البرمجية الخاصة بك، وأنها توفر بعض التحقق الأساسي.
مدخل 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":""}}]}}
يمكن استخدام الطرق التالية للتحقق من صحة القالب قبل النشر:
ترشد مهمة توزيع مجموعة موارد Azure الإصدار 2 التالية مع deploymentMode: 'Validation'
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'
يمكنك أيضا إنشاء مجموعة موارد اختبار للعثور على أخطاء الاختبار المسبق والتوزيع.
نشر قالبك
يمكنك استخدام أي من الطرق التالية لتوزيع ملف Bicep والقالب:
زر "Deploy to Azure"
إشعار
لا يدعم هذا الأسلوب توزيع ملفات Bicep الحالية.
دفع استبدل <url-encoded-path-to-azuredeploy-json>
مع إصدار عنوان موقع الويب المرمّز من المسار الخام ل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 مثبتة. تشغيل 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 azuredeploy.json -Verbose
لاختبار هذا التوزيع، يمكنك استخدام قالب مثل هذاالذي ينشئ تطبيق الوظائف على Windows في خطة استهلاك.
الخطوات التالية
اعرف المزيد حول كيفية تطوير وتكوين وظائف Azure.