أتمتة توزيع الموارد لتطبيق الوظيفة في وظائف 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. يمكنك تحديده باستخدام أو EP1EP2أو 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/siteskind ويتضمن functionapp، كحد أدنى.

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

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

للحصول على قائمة بإعدادات التطبيق المطلوبة عند التشغيل على 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 في القالب الخاص بك:

  • 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 أو خطة مخصصة، يجب عليك:

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

"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: عند إنشاء تطبيق الوظائف والموارد ذات الصلة في المدخل، تحتوي شاشة المراجعة + الإنشاء النهائية على ارتباط تنزيل قالب للأتمتة.

    قم بتنزيل ارتباط القالب من عملية إنشاء Azure Functions في مدخل Microsoft 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.