برنامج تعليمي: توزيع تطبيق Dapr إلى Azure Container Apps باستخدام Azure CLI

يساعد Dapr (وقت تشغيل التطبيق الموزع) المطورين على بناء خدمات مصغرة مرنة وموثوقة. في هذا البرنامج التعليمي، يتم توزيع نموذج تطبيق Dapr إلى Azure Container Apps.

‏‫ستتعلم كيفية:

  • إنشاء بيئة Container Apps لتوزيع تطبيقات الحاوية
  • إنشاء مخزن حالة Azure Blob Storage لتطبيق الحاوية
  • توزيع تطبيقين ينتجان الرسائل ويستهلكانها ويستمران في تخزين الحالة
  • التحقق من التفاعل بين الخدمة المصغرة.

باستخدام Azure Container Apps، يمكنك الحصول على إصدار مدار بالكامل من واجهات برمجة تطبيقات Dapr عند إنشاء خدمات مصغرة. عند استخدام Dapr في تطبيقات حاويات Azure، يمكنك تمكين sidecars من التشغيل بجوار الخدمات الصغيرة التي توفر مجموعة غنية من القدرات. تتضمن واجهات برمجة تطبيقات Dapr المتوفرة مكالمات الخدمة إلى الخدمة و Pub/Sub و Event Bindings و State Stores و Actors.

في هذا البرنامج التعليمي، يمكنك توزيع نفس التطبيقات من التشغيل السريع لـ Dapr مرحبًا بالعالم.

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

  • تطبيق حاوية العميل (Python) لإنشاء الرسائل.
  • تطبيق حاوية خدمة (عقدة) لاستهلاك تلك الرسائل واستمرارها في مخزن الحالة

يوضح الرسم التخطيطي للبنية التالية المكونات التي تشكل هذا البرنامج التعليمي:

رسم تخطيطي للبنية ل Dapr مرحبًا بالعالم الخدمات المصغرة على Azure Container Apps

الإعداد

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

az login

للتأكد من تشغيل أحدث إصدار من CLI، قم بتشغيل أمر الترقية.

az upgrade

بعد ذلك، قم بتثبيت أو تحديث ملحق Azure Container Apps ل CLI.

az extension add --name containerapp --upgrade

الآن بعد تثبيت الملحق أو الوحدة النمطية Microsoft.App الحالية، قم بتسجيل مساحات الأسماء و Microsoft.OperationalInsights .

إشعار

رٌحِّلت موارد Azure Container Apps من مساحة الاسم Microsoft.Web إلى مساحة الاسم Microsoft.App. راجع ترحيل مساحة الاسم من Microsoft.Web إلى Microsoft.App في مارس 2022 للحصول على مزيدٍ من التفاصيل.

az provider register --namespace Microsoft.App
az provider register --namespace Microsoft.OperationalInsights

تعيين متغيرات البيئة

تعيين متغيرات البيئة التالية. استبدل <العناصر النائبة> بالقيم الخاصة بك:

RESOURCE_GROUP="<RESOURCE_GROUP>"
LOCATION="<LOCATION>"
CONTAINERAPPS_ENVIRONMENT="<CONTAINERAPPS_ENVIRONMENT>"

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

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

az group create \
  --name $RESOURCE_GROUP \
  --location "$LOCATION"

إنشاء بيئة

يمكن لبيئة Azure Container Apps إنشاء حدود آمنة حول مجموعة من تطبيقات الحاويات. يتم توزيع Container Apps المنتشرة في نفس البيئة في نفس الشبكة الظاهرية وكتابة سجلات إلى نفس مساحة عمل Log Analytics.

لإنشاء البيئة، قم بتشغيل الأمر التالي:

az containerapp env create \
  --name $CONTAINERAPPS_ENVIRONMENT \
  --resource-group $RESOURCE_GROUP \
  --location "$LOCATION"

قم بإعداد حالة التخزين

2. قم بإنشاء حساب تخزين Azure Blob

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

STORAGE_ACCOUNT_NAME="<storage account name>"

استخدم الأمر التالي لإنشاء حساب Azure Storage.

az storage account create \
  --name $STORAGE_ACCOUNT_NAME \
  --resource-group $RESOURCE_GROUP \
  --location "$LOCATION" \
  --sku Standard_RAGRS \
  --kind StorageV2

تكوين هوية معينة من قبل المستخدم لتطبيق العقدة

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

  1. قم بإنشاء هوية معينة من قِبل المستخدم .
az identity create --resource-group $RESOURCE_GROUP --name "nodeAppIdentity" --output json

استرداد خصائص principalId و id وتخزينها في المتغيرات.

PRINCIPAL_ID=$(az identity show -n "nodeAppIdentity" --resource-group $RESOURCE_GROUP --query principalId | tr -d \")
IDENTITY_ID=$(az identity show -n "nodeAppIdentity" --resource-group $RESOURCE_GROUP --query id | tr -d \")
CLIENT_ID=$(az identity show -n "nodeAppIdentity" --resource-group $RESOURCE_GROUP --query clientId | tr -d \")
  1. Storage Blob Data Contributor تعيين الدور إلى الهوية المعينة من قبل المستخدم

استرداد معرف الاشتراك لاشتراكك الحالي.

SUBSCRIPTION_ID=$(az account show --query id --output tsv)
az role assignment create --assignee $PRINCIPAL_ID  \
--role "Storage Blob Data Contributor" \
--scope "/subscriptions/$SUBSCRIPTION_ID/resourceGroups/$RESOURCE_GROUP/providers/Microsoft.Storage/storageAccounts/$STORAGE_ACCOUNT_NAME"

تكوين مكون مخزن الحالة

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

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

# statestore.yaml for Azure Blob storage component
componentType: state.azure.blobstorage
version: v1
metadata:
  - name: accountName
    value: "<STORAGE_ACCOUNT_NAME>"
  - name: containerName
    value: mycontainer
  - name: azureClientId
    value: "<MANAGED_IDENTITY_CLIENT_ID>"
scopes:
  - nodeapp

لاستخدام هذا الملف، قم بتحديث العناصر النائبة:

  • استبدل <STORAGE_ACCOUNT_NAME> بقيمة المتغير STORAGE_ACCOUNT_NAME الذي قمت بتعريفه. للحصول على قيمته، قم بتشغيل الأمر التالي:
echo $STORAGE_ACCOUNT_NAME
  • استبدل <MANAGED_IDENTITY_CLIENT_ID> بقيمة المتغير CLIENT_ID الذي قمت بتعريفه. للحصول على قيمته، قم بتشغيل الأمر التالي:
echo $CLIENT_ID

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

az containerapp env dapr-component set \
    --name $CONTAINERAPPS_ENVIRONMENT --resource-group $RESOURCE_GROUP \
    --dapr-component-name statestore \
    --yaml statestore.yaml

توزيع تطبيق الخدمة (خادم ويب HTTP)

az containerapp create \
  --name nodeapp \
  --resource-group $RESOURCE_GROUP \
  --user-assigned $IDENTITY_ID \
  --environment $CONTAINERAPPS_ENVIRONMENT \
  --image dapriosamples/hello-k8s-node:latest \
  --min-replicas 1 \
  --max-replicas 1 \
  --enable-dapr \
  --dapr-app-id nodeapp \
  --dapr-app-port 3000 \
  --env-vars 'APP_PORT=3000'

بشكل افتراضي، يتم سحب الصورة من Docker Hub.

توزيع تطبيق العميل (عميل بدون أجهزة ملحقة)

قم بتشغيل الأمر التالي لتوزيع تطبيق حاوية العميل.

az containerapp create \
  --name pythonapp \
  --resource-group $RESOURCE_GROUP \
  --environment $CONTAINERAPPS_ENVIRONMENT \
  --image dapriosamples/hello-k8s-python:latest \
  --min-replicas 1 \
  --max-replicas 1 \
  --enable-dapr \
  --dapr-app-id pythonapp

تحقق من النتائج

تأكيد استمرار الحالة الناجحة

يمكنك التأكد من أن الخدمات تعمل بشكل صحيح عن طريق عرض البيانات في حساب تخزين Azure الخاص بك.

  1. افتح مدخل Microsoft Azure في المستعرض وانتقل إلى حساب التخزين الخاص بك.

  2. حدد قائمة الحاويات على الجانب الأيسر.

  3. حدد الحاويات.

  4. تحقق من أنه يمكنك مشاهدة الملف المسمى order في الحاوية.

  5. حدد الملف.

  6. قم بتحديد علامة التبويب تحرير .

  7. حدد الزر تحديث لمراقبة كيفية تحديث البيانات تلقائيا.

عرض السجلات

يتم تخزين السجلات من تطبيقات الحاوية ContainerAppConsoleLogs_CL في الجدول المخصص في مساحة عمل Log Analytics. يمكنك عرض السجلات من خلال مدخل Microsoft Azure أو عبر CLI. قد يكون هناك تأخير صغير في البداية حتى يظهر الجدول في مساحة العمل.

استخدم أمر CLI التالي لعرض السجلات باستخدام سطر الأوامر.

LOG_ANALYTICS_WORKSPACE_CLIENT_ID=`az containerapp env show --name $CONTAINERAPPS_ENVIRONMENT --resource-group $RESOURCE_GROUP --query properties.appLogsConfiguration.logAnalyticsConfiguration.customerId --out tsv`

az monitor log-analytics query \
  --workspace $LOG_ANALYTICS_WORKSPACE_CLIENT_ID \
  --analytics-query "ContainerAppConsoleLogs_CL | where ContainerAppName_s == 'nodeapp' and (Log_s contains 'persisted' or Log_s contains 'order') | project ContainerAppName_s, Log_s, TimeGenerated | sort by TimeGenerated | take 5" \
  --out table

يوضح الإخراج التالي نوع الاستجابة المتوقعة من الأمر CLI.

ContainerAppName_s    Log_s                            TableName      TimeGenerated
--------------------  -------------------------------  -------------  ------------------------
nodeapp               Got a new order! Order ID: 61    PrimaryResult  2021-10-22T21:31:46.184Z
nodeapp               Successfully persisted state.    PrimaryResult  2021-10-22T21:31:46.184Z
nodeapp               Got a new order! Order ID: 62    PrimaryResult  2021-10-22T22:01:57.174Z
nodeapp               Successfully persisted state.    PrimaryResult  2021-10-22T22:01:57.174Z
nodeapp               Got a new order! Order ID: 63    PrimaryResult  2021-10-22T22:45:44.618Z

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

تهانينا! لقد أكملت هذا البرنامج التعليمي. إذا كنت ترغب في حذف الموارد التي تم إنشاؤها كجزء من هذه المعاينة، فقم بتشغيل الأمر التالي.

تنبيه

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

az group delete --resource-group $RESOURCE_GROUP

إشعار

نظرا لأن pythonapp إجراء المكالمات باستمرار nodeapp مع الرسائل التي تستمر في مخزن الحالة الذي تم تكوينه، فمن المهم إكمال خطوات التنظيف هذه لتجنب العمليات الجارية القابلة للفوترة.

تلميح

هل تواجه مشكلات؟ اسمحوا لنا أن نعرف على GitHub عن طريق فتح مشكلة في Azure Container Apps repo.

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