إنشاء تطبيق دالة في حاوية مخصصة على Azure Container Apps

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

إكمال هذه البداية السريعة يكلفك تكلفة صغيرة في حساب Azure الخاص بك، ويمكنك تقليلها بتنظيف الموارد عند الانتهاء.

اختيار لغة التطوير التي تستخدمها

أولا، تستخدم أدوات دالات Azure لإنشاء كود مشروعك كتطبيق دالة في حاوية Docker باستخدام صورة قاعدة لينكس خاصة باللغة. تأكد من تحديد اللغة التي تختارها في أعلى المقالة.

تنشئ Core Tools تلقائيا Dockerfile لمشروعك الذي يستخدم أحدث إصدار من الصورة الأساسية الصحيحة للغة الوظائف الخاصة بك. يجب تحديث الحاوية بانتظام من أحدث صورة أساسية وإعادة النشر من الإصدار المحدث من الحاوية الخاصة بك. لمزيد من المعلومات، راجع إنشاء تطبيقات الوظائف الحاوية.

Prerequisites

قبل أن تبدأ، يجب أن تتوفر لديك المتطلبات التالية:

  • قم بتثبيت Azure CLI الإصدار 2.4 أو أحدث.

في حال لم يكن لديك اشتراك Azure، فأنشئ حساباً مجانيّاً قبل البدء.

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

تحتاج أيضا إلى إكمال قسم إنشاء سجل حاويات في البدء السريع لسجل الحاويات. دون اسم خادم تسجيل الدخول المؤهل بالكامل.

إنشاء وتنشيط البيئة الظاهرية

في مجلد مناسب، شغل الأوامر التالية لإنشاء وتنشيط بيئة ظاهرية باسم .venv. تأكد من استخدام أحد إصدارات Python التي تدعمها دالات Azure.

python -m venv .venv
source .venv/bin/activate

إذا لم يثبت Python حزمة venv على توزيع Linux الخاص بك، فشغل الأمر التالي:

sudo apt-get install python3-venv

شغل جميع الأوامر اللاحقة في هذه البيئة الافتراضية النشطة.

إنشاء واختبار مشروع الدالات المحلية.

في Terminal أو موجه الأوامر، قم بتشغيل الأمر التالي للغة التي اخترتها لإنشاء مشروع تطبيق وظيفي في المجلد الحالي:

func init --worker-runtime dotnet-isolated --docker
func init --worker-runtime node --language javascript --docker
func init --worker-runtime powershell --docker
func init --worker-runtime python --docker
func init --worker-runtime node --language typescript --docker

في مجلد فارغ، قم بتشغيل الأمر التالي لإنشاء مشروع Functions من نموذج أصلي لـ Maven:

mvn archetype:generate -DarchetypeGroupId=com.microsoft.azure -DarchetypeArtifactId=azure-functions-archetype -DjavaVersion=8 -Ddocker

-DjavaVersionتحدد المعلمة لوقت تشغيل الدالات إصدار Java الواجب استخدامه. استخدم -DjavaVersion=11 إذا كنت تريد تشغيل دالاتك على Java 11. عندما لا تحدد-DjavaVersion، يتم تعيين Maven افتراضًّيا على Java 8. لمزيد من المعلومات، راجع إصدارات Java.

Important

JAVA_HOMEيجب تعيين متغير البيئة إلى موقع تثبيت الإصدار الصحيح من JDK لإكمال هذه المقالة.

يطلب منك Maven القيم اللازمة لإنهاء إنشاء المشروع عند النشر. اتبع المطالبات وأدخل المعلومات التالية:

Prompt Value Description
معرف المجموعة com.fabrikam قيمة تُعرّف المشروع الخاص بك بشكل فريد عبر جميع المشاريع، باتباع قواعد تسمية الحزمة لـ Java التالية.
معرف البيانات الاصطناعية fabrikam-functions قيمة تمثل اسم jar، بدون رقم إصدار.
إصدار 1.0-SNAPSHOT حدد القيمة الافتراضية.
الحزمة com.fabrikam.functions قيمة تمثل حزمة Java للتعليمات البرمجية للدالة التي تم إنشاؤها. استخدم الافتراضي.

اكتب Y أو اضغط إدخال للتأكيد.

ينشئ Maven ملفات المشروع في مجلد جديد يسمى artifactId، وهو في هذا المثال fabrikam-functions.

--docker ينشئ الخيار Dockerfile للمشروع، والذي يحدد حاوية مناسبة للاستخدام مع دالات Azure ووقت التشغيل المحدد.

انتقل إلى مجلد المشروع:

cd fabrikam-functions

استخدم الأمر التالي لإضافة دالة إلى مشروعك، حيث تكون --name الوسيطة هي الاسم الفريد لوظيفتك وتحدد الوسيطة --template مشغل الوظيفة. func new إنشاء ملف تعليمات برمجية C# في مشروعك.

func new --name HttpExample --template "HTTP trigger"

استخدم الأمر التالي لإضافة دالة إلى مشروعك، حيث تكون --name الوسيطة هي الاسم الفريد لوظيفتك وتحدد الوسيطة --template مشغل الوظيفة. func new أنشئ مجلدًا فرعيًّا يطابق اسم الدالة الذي يحتوي على ملف تهيئة باسم function.json.

func new --name HttpExample --template "HTTP trigger"

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

func start  
func start  
npm install
npm start
mvn clean package  
mvn azure-functions:run

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

بعد أن ترى HttpExample نقطة النهاية مكتوبة إلى الإخراج، انتقل إلى http://localhost:7071/api/HttpExample?name=Functions. يجب أن يعرض المتصفح رسالة "مرحبًا" تردد صدى Functions، القيمة التي تم توفيرها name لمعامل الاستعلام.

اضغط على Ctrl+C (Command+C على macOS) لإيقاف المضيف.

إنشاء صورة الحاوية والتحقق محليا

(اختياري) افحص Dockerfile في جذر مجلد المشروع. يصف Dockerfile البيئة المطلوبة لتشغيل تطبيق الدالة على Linux. يمكن العثور على القائمة الكاملة للصور الأساسية المعتمدة لوظائف Azure في صفحة الصورة الأساسية لوظائف Azure.

وفي مجلد المشروع الجذر، قم بتشغيل الأمر docker build، وتوفير الاسم، azurefunctionsimage، وعلامة، v1.0.0. استبدل <DOCKER-ID> بمعرف حساب Docker Hub الخاص بك. ينشئ هذا الأمر صورة Docker للحاوية.

docker build --tag <DOCKER-ID>/azurefunctionsimage:v1.0.0 .

عند اكتمال الأمر، يمكنك تشغيل الحاوية الجديدة محليًا.

للتحقق من البنية، قم بتشغيل الصورة في حاوية محلية باستخدام الأمر docker run ، واستبدل <DOCKER-ID> مرة أخرى بمعرف حساب Docker Hub الخاص بك، وأضف وسيطة المنافذ ك -p 8080:80:

docker run -p 8080:80 -it <DOCKER-ID>/azurefunctionsimage:v1.0.0

بعد بدء تشغيل الصورة في الحاوية المحلية، استعرض إلى http://localhost:8080/api/HttpExample، الذي يجب أن يعرض نفس رسالة الترحيب كما كان من قبل. لأن الدالة HTTP المشغلة التي قمت بإنشائها تستخدم تخويل مجهول، يمكنك استدعاء الدالة قيد التشغيل في الحاوية دون الحاجة إلى الحصول على مفتاح وصول. لمزيد من المعلومات، راجع مفاتيح للتخويل.

وبعد بدء تشغيل الصورة في الحاوية المحلية، استعرض إلى http://localhost:8080/api/HttpExample?name=Functions، والتي يجب أن تعرض نفس رسالة "hello" كما كان من قبل. لأن الدالة HTTP المشغلة التي قمت بإنشائها تستخدم تخويل مجهول، يمكنك استدعاء الدالة قيد التشغيل في الحاوية دون الحاجة إلى الحصول على مفتاح وصول. لمزيد من المعلومات، راجع مفاتيح للتخويل.

بعد التحقق من تطبيق الوظائف في الحاوية، اضغط على Ctrl+C (Command+C على macOS) لإيقاف التنفيذ.

نشر صورة الحاوية إلى سجل

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

Azure Container Registry هي خدمة تسجيل خاصة لإنشاء صور الحاوية والبيانات الاصطناعية ذات الصلة وتخزينها وإدارتها. يجب استخدام خدمة تسجيل خاصة لنشر الحاويات الخاصة بك إلى خدمات Azure.

  1. استخدم هذا الأمر لتسجيل الدخول إلى نسخة السجل باستخدام بيانات اعتماد Azure الحالية الخاصة بك. استبداله <REGISTRY-NAME> باسم نسخة سجل الحاويات الخاص بك.

    az acr login --name <REGISTRY-NAME>
    
  2. استخدم هذا الأمر لوضع علامة على صورتك بالاسم المؤهل الكامل لخادم تسجيل الدخول الخاص بك. استبدل <LOGIN-SERVER> بالاسم المؤهل بالكامل لخادم تسجيل الدخول إلى السجل الخاص بك و <DOCKER-ID> بمعرف Docker الخاص بك.

    docker tag <DOCKER-ID>/azurefunctionsimage:v1.0.0 <LOGIN-SERVER>/azurefunctionsimage:v1.0.0 
    
  3. استخدم هذا الأمر لدفع الحاوية إلى مثيل السجل الخاص بك:

    docker push <LOGIN-SERVER>/azurefunctionsimage:v1.0.0
    

إنشاء موارد Azure الداعمة للدالة

قبل أن تتمكن من نشر الحاوية الخاصة بك إلى Azure، تحتاج إلى إنشاء ثلاثة موارد:

  • مجموعة موارد، وهي حاوية منطقية للموارد ذات الصلة.

  • حساب تخزين أزور، يستخدم للحفاظ على معلومات الحالة وغيرها من وظائفك.

  • بيئة Azure Container Apps مع مساحة عمل Log Analytics.

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

    ملاحظة

    لا يدعم Docker Hub الهويات المدارة.

استخدم هذه الأوامر لإنشاء موارد Azure المطلوبة:

  1. إذا لزم الأمر، فسجل الدخول إلى Azure:

    az login يسجل لك الأمر الدخول إلى حساب Azure الخاص بك. استخدم az account set عندما يكون لديك أكثر من اشتراك واحد مقترن بحسابك.

  2. قم بتشغيل الأمر التالي لتحديث Azure CLI إلى أحدث إصدار:

    az upgrade
    

    إذا لم يكن إصدار Azure CLI هو الأحدث، يبدأ التثبيت. تعتمد طريقة الترقية على نظام التشغيل الخاص بك. يمكنك المتابعة بعد اكتمال الترقية.

  3. قم بتشغيل الأوامر التالية التي تقوم بترقية ملحق Azure Container Apps وتسجيل مساحات الأسماء المطلوبة من قبل Container Apps:

    az extension add --name containerapp --upgrade -y
    az provider register --namespace Microsoft.Web 
    az provider register --namespace Microsoft.App 
    az provider register --namespace Microsoft.OperationalInsights 
    
  4. إنشاء مجموعة موارد باسم AzureFunctionsContainers-rg.

    az group create --name AzureFunctionsContainers-rg --location eastus
    

    ينشئ هذا az group create الأمر مجموعة موارد في منطقة شرق الولايات المتحدة. إذا أردت بدلا من ذلك استخدام منطقة قريبة منك، استخدم رمز منطقة متاح تم إرجاعه من az account list-locations الأمر. يجب تعديل الأوامر اللاحقة لاستخدام منطقتك المخصصة بدلا من eastus.

  5. إنشاء بيئة Azure Container Apps.

    az containerapp env create --name MyContainerappEnvironment --resource-group AzureFunctionsContainers-rg --location eastus
    

    يمكن أن يستغرق هذا الأمر بضع دقائق للانتهاء.

  6. إنشاء حساب تخزين للأغراض العامة في مجموعة الموارد والمنطقة، دون الوصول إلى المفتاح المشترك. في الأمر، استبدل <STORAGE-NAME> باسم مناسب لك وفريد في تخزين Azure. يجب أن تحتوي أسماء التخزين على 3 إلى 24 حرفًا من الأرقام والأحرف الصغيرة فقط.

    az storage account create --name <STORAGE-NAME> --location eastus --resource-group AzureFunctionsContainers-rg --sku Standard_LRS --allow-blob-public-access false --allow-shared-key-access false
    

    ينشئ الأمر az storage account create حساب تخزين يمكن الوصول إليه فقط باستخدام هويات مصادقة من Microsoft Entra ويتم منحها أصلاحيات لموارد محددة.

    يحدد Standard_LRS حساب للأغراض العامة، مدعوم من قبل الدالات.

  7. إنشاء هوية مدارة واستخدام التي تم principalId إرجاعها لمنحها حق الوصول إلى حساب التخزين الخاص بك وسحب الأذونات في مثيل السجل الخاص بك. استبدل <REGISTRY-NAME>و <USER-IDENTITY-NAME>و <STORAGE-NAME> باسم سجل الحاوية الحالي واسم الهوية المدارة واسم حساب التخزين على التوالي.

    principalId=$(az identity create --name <USER-IDENTITY-NAME> --resource-group AzureFunctionsContainers-rg --location eastus --query principalId -o tsv) 
    acrId=$(az acr show --name <REGISTRY-NAME> --query id --output tsv)
    az role assignment create --assignee-object-id $principalId --assignee-principal-type ServicePrincipal --role acrpull --scope $acrId
    storageId=$(az storage account show --resource-group AzureFunctionsContainers-rg --name <STORAGE-NAME> --query 'id' -o tsv)
    az role assignment create --assignee-object-id $principalId --assignee-principal-type ServicePrincipal --role "Storage Blob Data Owner" --scope $storageId
    

    az identity create ينشئ الأمر هوية مدارة معينة من قبل المستخدم، وتضيف الأوامر az role assignment createهويتك إلى الأدوار المطلوبة.

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

إنشاء وتهيئة تطبيق دالة على Azure باستخدام الصورة

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

az containerapp create --kind=functionapp استخدم الأمر لإنشاء تطبيق دالة في البيئة المدارة الجديدة المدعومة من Azure Container Apps. في az containerapp create --kind-functionapp، تحدد المعلمة --environment بيئة Container Apps.

تلميح

للتأكد من أن تطبيق الوظائف يستخدم اتصالا مدارا يستند إلى الهوية بمثيل السجل الخاص بك، لا تقم بتعيين المعلمة --image في az containerapp create --kind=functionapp. عند تعيين --image الاسم المؤهل بالكامل لصورتك في المستودع، يتم الحصول على بيانات الاعتماد السرية المشتركة من السجل الخاص بك وتخزينها في إعدادات التطبيق.

أولا، يجب أن تحصل على قيمة التعريف المؤهلة بالكامل لهويتك المدارة المعينة من قبل المستخدم مع وصول سحب إلى السجل، ثم تستخدم الأمر az containerapp create --kind=functionapp لإنشاء تطبيق دالة باستخدام الصورة الافتراضية ومع تعيين هذه الهوية له.

UAMI_RESOURCE_ID=$(az identity show --name $uami_name --resource-group $group --query id -o tsv)

az containerapp create --name <APP-NAME> --storage-account <STORAGE-NAME> --environment MyContainerappEnvironment --workload-profile-name "Consumption" --resource-group AzureFunctionsContainers-rg --functions-version 4 --assign-identity $UAMI_RESOURCE_ID

في az containerapp create --kind=functionapp، يعين --assign-identity هويتك المدارة إلى التطبيق الجديد. نظرا لأنك لم تقم بتعيين المعلمة --image في az functionapp create، يتم إنشاء التطبيق باستخدام صورة عنصر نائب.

في هذا المثال، استبدل <APP-NAME> و <STORAGE-NAME> باسم تطبيق الوظائف الجديد بالإضافة إلى اسم حساب التخزين الخاص بك.

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

UAMI_RESOURCE_ID=$(az identity show --name <USER-IDENTITY-NAME> --resource-group AzureFunctionsContainers-rg --query id -o tsv)
az resource patch --resource-group AzureFunctionsContainers-rg --name <APP-NAME> --resource-type "Microsoft.Web/sites" --properties "{ \"siteConfig\": { \"linuxFxVersion\": \"DOCKER|<REGISTRY-NAME>.azurecr.io/azurefunctionsimage:v1.0.0\", \"acrUseManagedIdentityCreds\": true, \"acrUserManagedIdentityID\":\"$UAMI_RESOURCE_ID\", \"appSettings\": [{\"name\": \"DOCKER_REGISTRY_SERVER_URL\", \"value\": \"<REGISTRY-NAME>.azurecr.io\"}]}}"

بالإضافة إلى إعدادات الموقع المطلوبة، يقوم az resource patch الأمر أيضا بتحديث DOCKER_REGISTRY_SERVER_URL إعداد التطبيق إلى عنوان URL لخادم التسجيل.

في هذا المثال، استبدل <APP-NAME>و <REGISTRY-NAME>وأسماء <USER-IDENTITY-NAME> تطبيق الوظائف وسجل الحاوية والهوية على التوالي.

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

تحديث إعدادات التطبيق

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

  1. إزالة إعداد سلسلة الاتصال الموجود AzureWebJobsStorage :

    az containerapp config appsettings delete --name <APP-NAME> --resource-group AzureFunctionsContainers-rg --setting-names AzureWebJobsStorage 
    

    az containerapp config appsettings delete الأمر يزيل هذا الإعداد من تطبيقك. استبدل <APP-NAME> باسم تطبيق الدالة الخاص بك.

  2. أضف إعدادات مكافئة AzureWebJobsStorage__ ، مع بادئة، تحدد اتصال هوية مدارة يعينها المستخدم لحساب التخزين الافتراضي:

    clientId=$(az identity show --name <USER-IDENTITY-NAME> --resource-group AzureFunctionsContainers-rg --query 'clientId' -o tsv)
    az containerapp config appsettings set --name <APP-NAME> --resource-group AzureFunctionsContainers-rg --settings AzureWebJobsStorage__accountName=<STORAGE-NAME> AzureWebJobsStorage__credential=managedidentity AzureWebJobsStorage__clientId=$clientId
    

    في هذا المثال، استبدل <APP-NAME>، <USER-IDENTITY-NAME>، <STORAGE-NAME> باسم تطبيق الوظائف واسم هويتك واسم حساب التخزين، على التوالي.

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

تلميح

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

التحقق من دالاتك على Azure

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

    az containerapp function show \
    --resource-group AzureFunctionsContainers-rg \
    --name <APP-NAME> \
    --function-name HttpExample 

استبدل <APP-NAME> باسم تطبيق الدالة الخاص بك. استخدم عنوان URL الذي حصلت عليه للتو لاستدعاء نقطة نهاية الدالة HttpExample ، مع إلحاق سلسلة ?name=Functionsالاستعلام .

يجب أن يبدو عنوان URL للطلب كما يلي:

https://myacafunctionapp.kindtree-796af82b.eastus.azurecontainerapps.io/api/httpexample?name=functions

https://myacafunctionapp.kindtree-796af82b.eastus.azurecontainerapps.io/api/httpexample

لا يدعم Go حاليا هذه الميزة.

تنظيف الموارد

إذا كنت ترغب في متابعة العمل مع Azure Function باستخدام الموارد التي قمت بإنشائها في هذه المقالة، يمكنك ترك جميع هذه الموارد في مكانها.

عند الانتهاء من العمل مع نشر تطبيق الوظائف هذا، احذف AzureFunctionsContainers-rg مجموعة الموارد لتنظيف جميع الموارد في تلك المجموعة:

az group delete --name AzureFunctionsContainers-rg

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