إنشاء أول وظائف حاوية على Azure Container Apps
في هذه المقالة، يمكنك إنشاء تطبيق دالة يعمل في حاوية Linux ونشره في بيئة Azure Container Apps من سجل حاوية. من خلال النشر إلى Container Apps، يمكنك دمج تطبيقات الوظائف الخاصة بك في الخدمات المصغرة الأصلية على السحابة. لمزيد من المعلومات، راجع استضافة Azure Container Apps ل Azure Functions.
توضح هذه المقالة كيفية إنشاء وظائف تعمل في حاوية Linux ونشر الحاوية في بيئة Container Apps.
يتطلب إكمال هذا التشغيل السريع تكلفة صغيرة تبلغ بضعة سنتات أمريكية أو أقل في حساب Azure الخاص بك، والتي يمكنك تقليلها عن طريق تنظيف الموارد عند الانتهاء.
أولا، يمكنك استخدام أدوات Azure Functions لإنشاء التعليمات البرمجية لمشروعك كتطبيق دالة في حاوية Docker باستخدام صورة أساسية ل Linux خاصة باللغة. تأكد من تحديد اللغة التي تختارها في أعلى المقالة.
تنشئ Core Tools تلقائيا Dockerfile لمشروعك الذي يستخدم أحدث إصدار من الصورة الأساسية الصحيحة للغة الوظائف الخاصة بك. يجب تحديث الحاوية بانتظام من أحدث صورة أساسية وإعادة النشر من الإصدار المحدث من الحاوية الخاصة بك. لمزيد من المعلومات، راجع إنشاء تطبيقات الوظائف المعبأة في حاويات.
قبل أن تبدأ، يجب أن تتوفر لديك المتطلبات التالية:
تثبيت Azure Functions Core Tools الإصدار 4.0.5198 أو إصدار أحدث.
- تثبيت Azure Functions Core Tools الإصدار 4.x.
- تثبيت إصدار من Node.jsالتي تدعمها Azure Functions.
- تثبيت إصدار Python الذي تدعمه Azure Functions.
قم بتثبيت إصدار من Java Developer Kitالمدعوم من Azure Functions.
تثبيت Apache Maven الإصدار 3.0 أو أعلى.
- الإصدار 2.4 من Azure CLI أو إصدار أحدث.
إذا لم يكن لديك اشتراك في Azure، فأنشئ حساب Azure مجاني قبل أن تبدأ.
لنشر صورة تطبيق الوظائف الحاوية التي تقوم بإنشائها إلى سجل حاوية، تحتاج إلى معرف Docker وDocker قيد التشغيل على الكمبيوتر المحلي. إذا لم يكن لديك معرف Docker، يمكنك إنشاء حساب Docker.
تحتاج أيضا إلى إكمال قسم إنشاء سجل حاوية في التشغيل السريع ل Container Registry لإنشاء مثيل سجل. دون اسم خادم تسجيل الدخول المؤهل بالكامل.
في مجلد مناسب، شغل الأوامر التالية لإنشاء وتنشيط بيئة ظاهرية باسم .venv
. تأكد من استخدام أحد إصدارات Python التي تدعمها Azure Functions.
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.
هام
JAVA_HOME
يجب تعيين متغير البيئة إلى موقع تثبيت الإصدار الصحيح من JDK لإكمال هذه المقالة.
يطلب منك Maven القيم اللازمة لإنهاء إنشاء المشروع عند النشر. اتبع المطالبات وأدخل المعلومات التالية:
المطالبة | قيمة | الوصف |
---|---|---|
groupId | com.fabrikam |
قيمة تُعرّف المشروع الخاص بك بشكل فريد عبر جميع المشاريع، باتباع قواعد تسمية الحزمة لـ Java التالية. |
artifactId | fabrikam-functions |
قيمة تمثل اسم jar، بدون رقم إصدار. |
إصدار | 1.0-SNAPSHOT |
حدد القيمة الافتراضية. |
الحزمة | com.fabrikam.functions |
قيمة تمثل حزمة Java للتعليمات البرمجية للدالة التي تم إنشاؤها. استخدم الافتراضي. |
اكتب Y
أو اضغط إدخال للتأكيد.
ينشئ Maven ملفات المشروع في مجلد جديد يسمى artifactId، وهو في هذا المثال fabrikam-functions
.
--docker
ينشئ الخيار Dockerfile للمشروع، والذي يحدد حاوية مناسبة للاستخدام مع Azure Functions ووقت التشغيل المحدد.
انتقل إلى مجلد المشروع:
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 Functions المحلي في جذر مجلد المشروع.
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.
استخدم هذا الأمر لتسجيل الدخول إلى مثيل السجل باستخدام بيانات اعتماد Azure الحالية:
az acr login --name <REGISTRY_NAME>
في الأمر السابق، استبدل
<REGISTRY_NAME>
باسم مثيل سجل الحاوية.استخدم هذا الأمر لوضع علامة على صورتك بالاسم المؤهل بالكامل لخادم تسجيل الدخول إلى السجل:
docker tag <DOCKER_ID>/azurefunctionsimage:v1.0.0 <LOGIN_SERVER>/azurefunctionsimage:v1.0.0
استبدل
<LOGIN_SERVER>
بالاسم المؤهل بالكامل لخادم تسجيل الدخول إلى السجل الخاص بك و<DOCKER_ID>
بمعرف Docker الخاص بك.استخدم هذا الأمر لدفع الحاوية إلى مثيل السجل الخاص بك:
docker push <LOGIN_SERVER>/azurefunctionsimage:v1.0.0
قبل أن تتمكن من نشر الحاوية الخاصة بك إلى Azure، تحتاج إلى إنشاء ثلاثة موارد:
- مجموعة الموارد، وهي حاوية منطقية للموارد ذات الصلة.
- حساب تخزين، والذي يستخدم للحفاظ على حالة دالاتك والمعلومات الأخرى المتعلقة بها.
- بيئة Azure Container Apps مع مساحة عمل Log Analytics.
- هوية مدارة يعينها المستخدم، والتي تمكن تطبيق الوظائف من الاتصال بأمان بموارد Azure دون استخدام الأسرار المشتركة. يتم إجراء اتصالات بكل من حساب Azure Storage ومثيل Azure Container Registry بدلا من ذلك باستخدام مصادقة Microsoft Entra مع الهوية، وهو ما يوصى به لهذا السيناريو.
ملاحظة
لا يدعم Docker Hub الهويات المدارة.
استخدم هذه الأوامر لإنشاء موارد Azure المطلوبة:
إذا لزم الأمر، فسجل الدخول إلى Azure:
az login
يسجل لك الأمر الدخول إلى حساب Azure الخاص بك. استخدمaz account set
عندما يكون لديك أكثر من اشتراك واحد مقترن بحسابك.قم بتشغيل الأمر التالي لتحديث Azure CLI إلى أحدث إصدار:
az upgrade
إذا لم يكن إصدار Azure CLI هو أحدث إصدار، يبدأ التثبيت. تعتمد طريقة الترقية على نظام التشغيل الخاص بك. يمكنك المتابعة بعد اكتمال الترقية.
قم بتشغيل الأوامر التالية التي تقوم بترقية ملحق 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
إنشاء مجموعة موارد باسم
AzureFunctionsContainers-rg
.az group create --name AzureFunctionsContainers-rg --location eastus
ينشئ هذا
az group create
الأمر مجموعة موارد في منطقة شرق الولايات المتحدة. إذا كنت تريد بدلا من ذلك استخدام منطقة قريبة منك، باستخدام رمز منطقة متوفر تم إرجاعه من الأمر az account list-locations . يجب تعديل الأوامر اللاحقة لاستخدام منطقتك المخصصة بدلا منeastus
.إنشاء بيئة Azure Container App مع تمكين ملفات تعريف حمل العمل.
az containerapp env create --name MyContainerappEnvironment --enable-workload-profiles --resource-group AzureFunctionsContainers-rg --location eastus
يمكن أن يستغرق هذا الأمر بضع دقائق للانتهاء.
إنشاء حساب تخزين للأغراض العامة في مجموعة الموارد والمنطقة، دون الوصول إلى المفتاح المشترك.
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 المصادق عليها والتي تم منحها أذونات لموارد معينة.في المثال السابق، استبدل
<STORAGE_NAME>
باسم مناسب لك وفريد في تخزين Azure. يجب أن تحتوي أسماء التخزين على 3 إلى 24 حرفًا من الأرقام والأحرف الصغيرة فقط. يحددStandard_LRS
حساب للأغراض العامة، مدعوم من قبل الدالات.إنشاء هوية مدارة واستخدام التي تم
principalId
إرجاعها لمنحها حق الوصول إلى حساب التخزين الخاص بك وسحب الأذونات في مثيل السجل الخاص بك.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 glengatestaca2 --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
الأوامر هويتك إلى الأدوار المطلوبة. استبدل<REGISTRY_NAME>
و<USER_IDENTITY_NAME>
و<STORAGE_NAME>
باسم سجل الحاوية الحالي واسم الهوية المدارة واسم حساب التخزين على التوالي. يمكن الآن استخدام الهوية المدارة من قبل تطبيق للوصول إلى كل من حساب التخزين وسجل حاويات Azure دون استخدام الأسرار المشتركة.
يدير تطبيق الوظائف على Azure تنفيذ وظائفك في بيئة Azure Container Apps. في هذا القسم، يمكنك استخدام موارد Azure من القسم السابق لإنشاء تطبيق دالة من صورة في سجل حاوية في بيئة Container Apps. يمكنك أيضا تكوين البيئة الجديدة مع سلسلة الاتصال إلى حساب Azure Storage المطلوب.
az functionapp create
استخدم الأمر لإنشاء تطبيق دالة في البيئة المدارة الجديدة المدعومة من Azure Container Apps. في az functionapp create
، تحدد المعلمة --environment
بيئة Container Apps.
تلميح
للتأكد من أن تطبيق الوظائف يستخدم اتصالا مدارا يستند إلى الهوية بمثيل السجل الخاص بك، لا تقم بتعيين المعلمة --image
في az functionapp create
. عند تعيين --image
الاسم المؤهل بالكامل لصورتك في المستودع، يتم الحصول على بيانات الاعتماد السرية المشتركة من السجل الخاص بك وتخزينها في إعدادات التطبيق.
يجب أولا الحصول على قيمة المعرف المؤهل بالكامل للهوية المدارة المعينة من قبل المستخدم مع سحب الوصول إلى السجل، ثم استخدام az functionapp create
الأمر لإنشاء تطبيق دالة باستخدام الصورة الافتراضية ومع هذه الهوية المعينة له.
UAMI_RESOURCE_ID=$(az identity show --name $uami_name --resource-group $group --query id -o tsv)
az functionapp 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 functionapp create
، يعين --assign-identity
هويتك المدارة إلى التطبيق الجديد. نظرا لأنك لم تقم بتعيين المعلمة --image
في az functionapp create
، يتم إنشاء التطبيق باستخدام صورة عنصر نائب.
في هذا المثال، استبدل <APP_NAME>
و <STORAGE_NAME>
و <USER_IDENTITY_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
إعداد سلسلة الاتصال بإعداد مكافئ يستخدم الهوية المدارة المعينة من قبل المستخدم للاتصال بحساب التخزين.
إزالة إعداد سلسلة الاتصال الموجود
AzureWebJobsStorage
:az functionapp config appsettings delete --name <APP_NAME> --resource-group AzureFunctionsContainers-rg --setting-names AzureWebJobsStorage
يقوم الأمر az functionapp config appsettings delete بإزالة هذا الإعداد من تطبيقك. استبدل
<APP_NAME>
باسم تطبيق الدالة الخاص بك.أضف إعدادات مكافئة
AzureWebJobsStorage__
، مع بادئة، تحدد اتصال هوية مدارة يعينها المستخدم لحساب التخزين الافتراضي:clientId=$(az identity show --name <USER_IDENTITY_NAME> --resource-group AzureFunctionsContainers-rg --query 'clientId' -o tsv) az functionapp 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، يمكنك الآن استدعاء الدالة من خلال طلبات HTTP.
قم بتشغيل الأمر التالي
az functionapp function show
للحصول على عنوان URL للدالة الجديدة:az functionapp function show --resource-group AzureFunctionsContainers-rg --name <APP_NAME> --function-name HttpExample --query invokeUrlTemplate
استبدل
<APP_NAME>
باسم تطبيق الدالة الخاص بك.
- استخدم عنوان URL الذي حصلت عليه للتو لاستدعاء نقطة نهاية الدالة
HttpExample
، مع إلحاق سلسلة?name=Functions
الاستعلام .
- استخدم عنوان URL الذي حصلت عليه للتو لاستدعاء نقطة نهاية الدالة
HttpExample
.
عند الانتقال إلى عنوان URL هذا، يجب أن يعرض المستعرض إخراجًا مشابهًا لما حدث عندما قمت بتشغيل الوظيفة محليًا.
يجب أن يبدو عنوان URL للطلب كما يلي:
https://myacafunctionapp.kindtree-796af82b.eastus.azurecontainerapps.io/api/httpexample?name=functions
https://myacafunctionapp.kindtree-796af82b.eastus.azurecontainerapps.io/api/httpexample
إذا كنت ترغب في متابعة العمل مع Azure Function باستخدام الموارد التي قمت بإنشائها في هذه المقالة، يمكنك ترك جميع هذه الموارد في مكانها.
عند الانتهاء من العمل مع نشر تطبيق الوظائف هذا، احذف AzureFunctionsContainers-rg
مجموعة الموارد لتنظيف جميع الموارد في تلك المجموعة:
az group delete --name AzureFunctionsContainers-rg