نظرة عامة: أتمتة النشر لتطبيقات Azure Logic باستخدام قوالب Azure Resource Manager

وينطبق ذلك على: Azure Logic Apps (الاستهلاك)

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

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

تصف هذه النظرة العامة السمات في قالب Resource Manager الذي يتضمن تعريف مسار عمل تطبيق منطقي. يستخدم كل من القالب وتعريف سير العمل الخاص بك بناء جملة JSON، ولكن توجد بعض الاختلافات لأن تعريف سير العمل يتبع أيضًا مخطط لغة تعريف سير العمل . على سبيل المثال، تختلف تعبيرات القوالب وتعبيرات تعريف مسار العمل في كيفية الإشارة إلى المعلمات والقيم التي يمكن قبولها.

تلميح

للحصول على أسهل طريقة للحصول على قالب تطبيق منطقي ذي معلمات صالح يكون جاهزًا في الغالب للنشر، استخدم Visual Studio (إصدار مجتمع مجاني أو إصدار أحدث) وAzure Logic Apps Tools لـ Visual Studio. يمكنك بعد ذلك إما إنشاء تطبيقك المنطقي في Visual Studio أو البحث عن تطبيق منطق موجود وتنزيله من Azure إلى Visual Studio .

أو يمكنك إنشاء قوالب تطبيق منطقي باستخدام Azure PowerShell مع الوحدة النمطية LogicAppTemplate .

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

لمزيد من المعلومات حول قوالب إدارة الموارد، راجع هذه الموضوعات:

للحصول على معلومات موارد القوالب الخاصة بالتطبيقات المنطقية وحسابات التكامل وعناصر حساب التكامل وبيئات خدمة التكامل، راجع أنواع موارد Microsoft.Logic .

للحصول على نماذج قوالب التطبيق المنطقي، راجع هذه الأمثلة:

بالنسبة إلى واجهة برمجة تطبيقات Logic Apps REST، ابدأ بـ نظرة عامة على Azure Logic Apps REST API .

هيكل القالب

في المستوى الأعلى، يتبع قالب Resource Manager هذه البنية الموصوفة بالكامل في موضوع بنية قالب Azure Resource Manager وبناء الجملة :

{
   "$schema": "https://schema.management.azure.com/schemas/2015-01-01/deploymentTemplate.json#",
   "contentVersion": "1.0.0.0",
   "parameters": {},
   "variables": {},
   "functions": [],
   "resources": [],
   "outputs": {}
}

بالنسبة إلى قالب التطبيق المنطقي، فأنت تعمل بشكل أساسي مع كائنات القالب هذه:

السمة الوصف
parameters يعلن عن معلمات القالب لقبول القيم التي يجب استخدامها عند إنشاء الموارد وتخصيصها للنشر في Azure. على سبيل المثال، تقبل هذه المعلمات قيم اسم تطبيقك المنطقي وموقعه والاتصالات والموارد الأخرى اللازمة للنشر. يمكنك تخزين قيم المعلمات هذه في ملف المعلمات ، الموضح لاحقًا في هذا الموضوع. للحصول على تفاصيل عامة، راجع المعلمات - بنية قالب مدير الموارد وبناء الجملة .
resources يحدد الموارد لإنشاء مجموعة موارد Azure أو تحديثها ونشرها، مثل تطبيق المنطق، والاتصالات، وحسابات التخزين في Azure، وما إلى ذلك. للحصول على تفاصيل عامة، راجع الموارد - بنية قالب مدير الموارد وبناء الجملة .

يستخدم قالب التطبيق المنطقي تنسيق اسم الملف هذا:

<logic-app-name>.json

هام

يعتبر بناء جملة القالب حساسًا لحالة الأحرف، لذا تأكد من استخدام غلاف متسق.

معلمات القالب

يحتوي قالب التطبيق المنطقي على عدة كائنات parameters موجودة في مستويات مختلفة وتؤدي وظائف مختلفة. على سبيل المثال، في المستوى الأعلى، يمكنك تعريف معلمات القالب للقيم لقبولها واستخدامها عند النشر عند إنشاء الموارد ونشرها في Azure، على سبيل المثال:

  • تطبيق المنطق الخاص بك

  • الاتصالات التي يستخدمها تطبيق المنطق للوصول إلى الخدمات والأنظمة الأخرى من خلال الموصلات المدارة

  • الموارد الأخرى التي يحتاجها تطبيقك المنطقي للنشر

    على سبيل المثال، إذا كان تطبيقك المنطقي يستخدم حساب تكامل لسيناريوهات الأعمال التجارية (B2B)، فإن كائن المستوى الأعلى للقالب parameters يعلن المعلمة التي تقبل معرف المورد لحساب التكامل هذا.

فيما يلي البنية العامة وبناء الجملة لتعريف المعلمة، والذي تم وصفه بالكامل بواسطة المعلمات - بنية قالب مدير الموارد وبناء الجملة :

"<parameter-name>": {
   "type": "<parameter-type>",
   "defaultValue": <default-parameter-value>,
   <other-parameter-attributes>,
   "metadata": {
      "description": "<parameter-description>"
   }
},

يوضح هذا المثال فقط معلمات القالب للقيم المستخدمة لإنشاء ونشر هذه الموارد في Azure:

  • اسم وموقع تطبيق المنطق الخاص بك
  • معرف لاستخدامه لحساب التكامل المرتبط بتطبيق المنطق
{
   "$schema": "https://schema.management.azure.com/schemas/2015-01-01/deploymentTemplate.json#",
   "contentVersion": "1.0.0.0",
   // Template parameters
   "parameters": {
      "LogicAppName": {
         "type": "string",
         "minLength": 1,
         "maxLength": 80,
         "defaultValue": "MyLogicApp",
         "metadata": {
            "description": "The resource name for the logic app"
         }
      },
      "LogicAppLocation": {
         "type": "string",
         "minLength": 1,
         "defaultValue": "[resourceGroup().location]",
         "metadata": {
            "description": "The resource location for the logic app"
         }
      },
      "LogicAppIntegrationAccount": {
         "type":"string",
         "minLength": 1,
         "defaultValue": "/subscriptions/<Azure-subscription-ID>/resourceGroups/fabrikam-integration-account-rg/providers/Microsoft.Logic/integrationAccounts/fabrikam-integration-account",
         "metadata": {
            "description": "The ID to use for the integration account"
         }
      }
   },
   "variables": {},
   "functions": [],
   "resources": [],
   "outputs": {}
}

باستثناء المعلمات التي تتعامل مع القيم الحساسة أو التي يجب تأمينها، مثل أسماء المستخدمين وكلمات المرور والأسرار، تشتمل جميع هذه المعلمات على سمات defaultValue، على الرغم من أن القيم الافتراضية في بعض الحالات تكون قيمًا فارغة. يتم توفير قيم النشر التي سيتم استخدامها لمعلمات القالب هذه من خلال قالب ملف المعلمات الموضح لاحقًا في هذا الموضوع.

لمزيد من المعلومات حول تأمين معلمات القالب، راجع هذه الموضوعات:

غالبًا ما تشير كائنات القوالب الأخرى إلى معلمات القالب بحيث يمكنها استخدام القيم التي تمر عبر معلمات القالب، على سبيل المثال:

  • يحدد كائن موارد القالب ، الموضح لاحقًا في هذا الموضوع، كل مورد في Azure تريد إنشاءه ونشره، مثل تعريف مورد تطبيق المنطق . غالبًا ما تستخدم هذه الموارد قيم معلمات القالب، مثل اسم التطبيق المنطقي والموقع ومعلومات الاتصال.

  • على مستوى أعمق في تعريف مورد تطبيقك المنطقي، يعلن كائن معلمات تعريف سير العمل معلمات للقيم لاستخدامها في وقت تشغيل تطبيقك المنطقي. على سبيل المثال، يمكنك إعلان معلمات تعريف سير العمل لاسم المستخدم وكلمة المرور اللذين يستخدمهما مشغل HTTP للمصادقة. لتحديد قيم معلمات تعريف سير العمل، استخدم الكائن parameters الذي يقع خارج تعريف سير العمل ولكنه لا يزال داخل تعريف مورد التطبيق المنطقي. في هذا الكائن الخارجي parameters، يمكنك الرجوع إلى معاملات القالب المعلنة مسبقًا، والتي يمكن أن تقبل القيم عند النشر من ملف المعلمات.

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

أفضل الممارسات - معلمات القالب

فيما يلي بعض أفضل الممارسات لتحديد المعلمات:

  • قم بتعريف المعلمات فقط للقيم التي تختلف، بناءً على احتياجات النشر الخاصة بك. لا تعلن عن معلمات القيم التي تظل كما هي عبر متطلبات النشر المختلفة.

  • قم بتضمين السمة defaultValue، التي يمكنها تحديد القيم الفارغة، لجميع المعلمات باستثناء القيم الحساسة أو التي يجب تأمينها. استخدم دائمًا المعلمات المؤمنة لأسماء المستخدمين وكلمات المرور والأسرار. لإخفاء قيم المعلمات الحساسة أو حمايتها، اتبع الإرشادات الواردة في هذه الموضوعات:

  • للتمييز بين أسماء معلمات القالب وأسماء معلمات تعريف مسار العمل، يمكنك استخدام أسماء معلمات القالب الوصفية، على سبيل المثال: TemplateFabrikamPassword

لمزيد من أفضل ممارسات النماذج، راجع أفضل الممارسات لمعلمات النماذج .

ملف معلمات القالب

لتوفير قيم معلمات القالب، قم بتخزين هذه القيم في ملف المعلمات . بهذه الطريقة، يمكنك استخدام ملفات معلمات مختلفة بناءً على احتياجات النشر الخاصة بك. فيما يلي تنسيق اسم الملف المراد استخدامه:

  • اسم ملف تطبيق المنطق: <logic-app-name>.json
  • اسم ملف المعلمات: < logic-app-name > .parameters.json

فيما يلي البنية داخل ملف المعلمات، والذي يتضمن مرجع خزنة المفاتيح لتمرير قيمة معلمة مؤمنة باستخدام Azure Key Vault :

{
   "$schema": "https://schema.management.azure.com/schemas/2015-01-01/deploymentParameters.json#",
   "contentVersion": "1.0.0.0",
   // Template parameter values
   "parameters": {
      "<parameter-name-1>": {
         "value": "<parameter-value>"
      },
      "<parameter-name-2>": {
         "value": "<parameter-value>"
      },
      "<secured-parameter-name>": {
         "reference": {
            "keyVault": {
               "id": "/subscriptions/<Azure-subscription-ID>/resourceGroups/<Azure-resource-group-name>/Microsoft.KeyVault/vaults/<key-vault-name>"
            },
            "secretName: "<secret-name>"
         }
      },
      <other-parameter-values>
   }
}

يحدد ملف المعلمات المثال هذا القيم لمعلمات القالب التي تم الإعلان عنها مسبقًا في هذا الموضوع:

{
   "$schema": "https://schema.management.azure.com/schemas/2015-01-01/deploymentParameters.json#",
   "contentVersion": "1.0.0.0",
   // Template parameter values
   "parameters": {
      "LogicAppName": {
         "value": "Email-Processor-Logic-App"
      },
      "LogicAppLocation": {
         "value": "westeurope"
      }
   }
}

موارد القالب

يحتوي القالب على كائن resources، وهو عبارة عن مصفوفة تحتوي على تعريفات لكل مورد يتم إنشاؤه ونشره في Azure، مثل تعريف مورد التطبيق المنطقي ، و تعريفات موارد الاتصال ، وأي موارد أخرى يحتاجها تطبيقك المنطقي للنشر.

{
   "$schema": "https://schema.management.azure.com/schemas/2015-01-01/deploymentTemplate.json#",
   "contentVersion": "1.0.0.0",
   "parameters": {<template-parameters>},
   "variables": {},
   "functions": [],
   "resources": [
      {
         <logic-app-resource-definition>
      },
      // Start connection resource definitions
      {
         <connection-resource-definition-1>
      },
      {
         <connection-resource-definition-2>
      }
   ],
   "outputs": {}
}

ملاحظة

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

عرض تعريفات الموارد

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

للحصول على معلومات عامة حول موارد القوالب والسمات الخاصة بها، راجع هذه الموضوعات:

تعريف مورد تطبيق المنطق

يبدأ تعريف مورد سير العمل لتطبيقك المنطقي في قالب بالكائن properties، والذي يتضمن هذه المعلومات:

  • حالة تطبيقك المنطقي عند النشر
  • معرّف أي حساب تكامل يستخدمه تطبيق المنطق الخاص بك
  • تعريف سير عمل تطبيق المنطق الخاص بك
  • عنصر parameters يحدد القيم التي يجب استخدامها في وقت التشغيل
  • معلومات الموارد الأخرى حول تطبيق المنطق الخاص بك، مثل الاسم والنوع والموقع وأي إعدادات تكوين وقت التشغيل وما إلى ذلك
{
   "$schema": "https://schema.management.azure.com/schemas/2015-01-01/deploymentTemplate.json#",
   "contentVersion": "1.0.0.0",
   "parameters": {<template-parameters>},
   "variables": {},
   "functions": [],
   "resources": [
      {
         // Start logic app resource definition
         "properties": {
            "state": "<Enabled or Disabled>",
            "integrationAccount": {
               "id": "[parameters('LogicAppIntegrationAccount')]" // Template parameter reference
            },
            "definition": {<workflow-definition>},
            "parameters": {<workflow-definition-parameter-values>},
            "accessControl": {},
            "runtimeConfiguration": {}
         },
         "name": "[parameters('LogicAppName')]", // Template parameter reference
         "type": "Microsoft.Logic/workflows",
         "location": "[parameters('LogicAppLocation')]", // Template parameter reference
         "tags": {
           "displayName": "LogicApp"
         },
         "apiVersion": "2019-05-01",
         "dependsOn": [
         ]
      }
      // End logic app resource definition
   ],
   "outputs": {}
}

فيما يلي السمات الخاصة بتعريف مورد التطبيق المنطقي:

السمة مطلوب النوع الوصف
state نعم سلسلة حالة تطبيق المنطق الخاص بك عند النشر حيث يعني Enabled أن تطبيق المنطق الخاص بك نشط وDisabled يعني أن تطبيق المنطق الخاص بك غير نشط. على سبيل المثال، إذا لم تكن جاهزًا لنشر تطبيق المنطق الخاص بك ولكنك تريد نشر نسخة مسودة، فإنه يمكنك استخدام الخيار Disabled.
integrationAccount لا عنصر إذا كان تطبيقك المنطقي يستخدم حساب تكامل، والذي يخزن العناصر الفنية لسيناريوهات الأعمال التجارية (B2B)، فإن هذا الكائن يتضمن السمة id، التي تحدد المعرف لحساب التكامل.
definition نعم عنصر في تعريف سير العمل هذا، يعلن الكائن معلمات للقيم لاستخدامها في وقت تشغيل تطبيق المنطق. في تعريف سير العمل هذا، يعلن الكائن parameters معلمات للقيم لاستخدامها في وقت تشغيل تطبيق المنطق. لمزيد من المعلومات، راجع تعريف سير العمل والمعلمات.

لعرض السمات في تعريف سير عمل تطبيق المنطق الخاص بك، قم بالتبديل من "عرض التصميم" إلى "عرض التعليمات البرمجية" في مدخل Azure أو Visual Studio، أو باستخدام أداة مثل Azure Resource Explorer .

parameters لا عنصر قيم معلمات تعريف سير العمل لاستخدامها في وقت تشغيل التطبيق المنطقي. تظهر تعريفات المعلمات لهذه القيم داخل كائن معلمات تعريف مسار العمل . أيضًا، إذا كان تطبيقك المنطقي يستخدم موصلات مُدارة للوصول إلى الخدمات والأنظمة الأخرى، فإن هذا الكائن يتضمن كائنًا $connections يعيّن قيم الاتصال لاستخدامها في وقت التشغيل.
accessControl لا عنصر لتحديد سمات الأمان لتطبيقك المنطقي، مثل تقييد الوصول إلى IP لطلب المشغلات أو تشغيل إدخالات ومخرجات المحفوظات. لمزيد من المعلومات، راجع الوصول الآمن إلى التطبيقات المنطقية .
runtimeConfiguration لا عنصر لتحديد أي operationOptions خصائص تتحكم في الطريقة التي يتصرف بها تطبيقك المنطقي في وقت التشغيل. على سبيل المثال، يمكنك تشغيل تطبيق المنطق في وضع الإنتاجية العالية .

لمزيد من المعلومات حول تعريفات الموارد لكائنات Logic Apps هذه، راجع أنواع موارد Microsoft.Logic :

تعريف سير العمل والمعلمات

يظهر تعريف سير عمل تطبيقك المنطقي في الكائن definition، الذي يظهر في الكائن properties داخل تعريف مورد تطبيق المنطق. هذا الكائن definition هو نفس الكائن الذي يظهر في عرض التعليمات البرمجية ويتم وصفه بالكامل في موضوع مرجع المخطط للغة تعريف سير العمل . يتضمن تعريف سير العمل الخاص بك كائن تعريف داخلي parameters حيث يمكنك تحديد معلمات جديدة أو تحريرها للقيم التي يستخدمها تعريف سير العمل الخاص بك في وقت التشغيل. يمكنك بعد ذلك الرجوع إلى هذه المعلمات داخل المشغل أو الإجراءات في سير عملك. بشكل افتراضي، يكون هذا الكائن parameters فارغًا ما لم ينشئ تطبيق المنطق اتصالات بخدمات وأنظمة أخرى من خلال موصلات مُدارة .

لتعيين قيم معلمات تعريف سير العمل، استخدم parameters الكائن الذي يقع خارج تعريف سير العمل الخاص بك ولكنه لا يزال داخل تعريف مورد تطبيق المنطق. في الكائن parametersالخارجي هذا، يمكنك بعد ذلك الرجوع إلى معلمات القالب المعلنة مسبقًا، والتي يمكن أن تقبل القيم عند النشر من ملف المعلمات.

تلميح

كأفضل ممارسة، لا ترجع مباشرة إلى معلمات القوالب، التي يتم تقييمها عند النشر، من داخل تعريف سير العمل. بدلاً من ذلك، قم بالإعلان عن معلمة تعريف سير العمل، والتي يمكنك تعيينها بعد ذلك في parameters الكائن الذي خارج تعريف سير العمل الخاص بك ولكنه لا يزال داخل تعريف مورد التطبيق المنطقي. لمزيد من المعلومات، راجع مراجع إلى المعلمات .

يوضح بناء الجملة هذا المكان الذي يمكنك فيه إعلان المعلمات في كل من مستويات تعريف القالب وسير العمل جنبًا إلى جنب مع المكان الذي يمكنك فيه تعيين قيم المعلمات هذه من خلال الرجوع إلى معلمات تعريف القالب وسير العمل:

{
   "$schema": "https://schema.management.azure.com/schemas/2015-01-01/deploymentTemplate.json#",
   "contentVersion": "1.0.0.0",
   // Template parameters
   "parameters": {
      "<template-parameter-name>": {
         "type": "<parameter-type>",
         "defaultValue": "<parameter-default-value>",
         "metadata": {
            "description": "<parameter-description>"
         }
      }
   },
   "variables": {},
   "functions": [],
   "resources": [
      {
         // Start logic app resource definition
         "properties": {
            <other-logic-app-resource-properties>,
            "definition": {
               "$schema": "https://schema.management.azure.com/providers/Microsoft.Logic/schemas/2016-06-01/workflowdefinition.json#",
               "actions": {<action-definitions>},
               // Workflow definition parameters
               "parameters": {
                  "<workflow-definition-parameter-name>": {
                     "type": "<parameter-type>",
                     "defaultValue": "<parameter-default-value>",
                     "metadata": {
                        "description": "<parameter-description>"
                     }
                  }
               },
               "triggers": {
                  "<trigger-name>": {
                     "type": "<trigger-type>",
                     "inputs": {
                         // Workflow definition parameter reference
                         "<attribute-name>": "@parameters('<workflow-definition-parameter-name')"
                     }
                  }
               },
               <...>
            },
            // Workflow definition parameter value
            "parameters": {
               "<workflow-definition-parameter-name>": { 
                  "value": "[parameters('<template-parameter-name>')]"
               }
            },
            "accessControl": {}
         },
         <other-logic-app-resource-definition-attributes>
      }
      // End logic app resource definition
   ],
   "outputs": {}
}

تأمين معلمات تعريف سير العمل

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

لتعيين قيمة معلمة تعريف سير العمل، استخدم parameters الكائن خارج تعريف سير العمل الخاص بك ولكنه لا يزال داخل تعريف مورد التطبيق المنطقي للإشارة إلى معلمة القالب. أخيرًا، لتمرير القيمة إلى معلمة القالب عند النشر، قم بتخزين هذه القيمة في Azure Key Vault وقم بالإشارة إلى مخزن المفاتيح هذا في ملف المعلمات الذي يستخدمه قالبك عند النشر.

يوضح هذا القالب القالبي كيف يمكنك إكمال هذه المهام عن طريق تحديد المعلمات المؤمنة عند الضرورة حتى تتمكن من تخزين قيمها في Azure Key Vault:

  • قم بتعريف المعلمات المؤمنة للقيم المستخدمة لمصادقة الوصول.
  • استخدم هذه القيم في كل من مستويات تعريف القالب وسير العمل.
  • قم بتوفير هذه القيم باستخدام ملف المعلمات.

القالب

{
   "$schema": "https://schema.management.azure.com/schemas/2015-01-01/deploymentTemplate.json#",
   "contentVersion": "1.0.0.0",
   "parameters": {
      <previously-defined-template-parameters>,
      // Additional template parameters for passing values to use in workflow definition
      "TemplateAuthenticationType": {
         "type": "string",
         "defaultValue": "",
         "metadata": {
            "description": "The type of authentication used for the Fabrikam portal"
         }
      },
      "TemplateFabrikamPassword": {
         "type": "securestring",
         "metadata": {
            "description": "The password for the Fabrikam portal"
         }
      },
      "TemplateFabrikamUserName": {
         "type": "securestring",
         "metadata": {
            "description": "The username for the Fabrikam portal"
         }
      }
   },
   "variables": {},
   "functions": [],
   "resources": [
      {
         // Start logic app resource definition
         "properties": {
            <other-logic-app-resource-properties>,
            // Start workflow definition
            "definition": {
               "$schema": "https://schema.management.azure.com/providers/Microsoft.Logic/schemas/2016-06-01/workflowdefinition.json#",
               "actions": {<action-definitions>},
               // Workflow definition parameters
               "parameters": {
                  "authenticationType": {
                     "type": "string",
                     "defaultValue": "",
                     "metadata": {
                        "description": "The type of authentication used for the Fabrikam portal"
                     }
                  },
                  "fabrikamPassword": {
                     "type": "securestring",
                     "metadata": {
                        "description": "The password for the Fabrikam portal"
                     }
                  },
                  "fabrikamUserName": {
                     "type": "securestring",
                     "metadata": {
                        "description": "The username for the Fabrikam portal"
                     }
                  }
               },
               "triggers": {
                  "HTTP": {
                     "inputs": {
                        "authentication": {
                           // Reference workflow definition parameters
                           "password": "@parameters('fabrikamPassword')",
                           "type": "@parameters('authenticationType')",
                           "username": "@parameters('fabrikamUserName')"
                        }
                     },
                     "recurrence": {<...>},
                     "type": "Http"
                  }
               },
               <...>
            },
            // End workflow definition
            // Start workflow definition parameter values
            "parameters": {
               "authenticationType": {
                  "value": "[parameters('TemplateAuthenticationType')]" // Template parameter reference
               },
               "fabrikamPassword": {                  
                  "value": "[parameters('TemplateFabrikamPassword')]" // Template parameter reference
               },
               "fabrikamUserName": {
                  "value": "[parameters('TemplateFabrikamUserName')]" // Template parameter reference
               }
            },
            "accessControl": {}
         },
         <other-logic-app-resource-attributes>
      }
      // End logic app resource definition
   ],
   "outputs": {}
}

ملف المعلمات

{
   "$schema": "https://schema.management.azure.com/schemas/2015-01-01/deploymentParameters.json#",
   "contentVersion": "1.0.0.0",
   // Template parameter values
   "parameters": {
      <previously-defined-template-parameter-values>,
     "TemplateAuthenticationType": {
        "value": "Basic"
     },
     "TemplateFabrikamPassword": {
        "reference": {
           "keyVault": {
              "id": "/subscriptions/<Azure-subscription-ID>/resourceGroups/<Azure-resource-group-name>/Microsoft.KeyVault/vaults/fabrikam-key-vault"
           },
           "secretName": "FabrikamPassword"
        }
     },
     "TemplateFabrikamUserName": {
        "reference": {
           "keyVault": {
              "id": "/subscriptions/<Azure-subscription-ID>/resourceGroups/<Azure-resource-group-name>/Microsoft.KeyVault/vaults/fabrikam-key-vault"
           },
           "secretName": "FabrikamUserName"
        }
     }
   }
}

أفضل الممارسات - معلمات تعريف سير العمل

للتأكد من أن Logic App Designer يمكنه عرض معلمات تعريف سير العمل بشكل صحيح، اتبع أفضل الممارسات التالية:

لمزيد من المعلومات حول معلمات تعريف سير العمل، راجع المعلمات - لغة تعريف سير العمل .

تعريفات موارد الاتصال

عندما ينشئ تطبيقك المنطقي اتصالات بالخدمات والنظام الأخرى ويستخدمها باستخدام موصلات مُدارة ، فإن كائن القالب الخاص بك resources يحتوي على تعريفات الموارد لتلك الاتصالات. على الرغم من أنك تقوم بإنشاء اتصالات من داخل تطبيق منطقي، فإن الاتصالات هي موارد Azure منفصلة مع تعريفات الموارد الخاصة بها. لمراجعة تعريفات موارد الاتصال هذه، نزِّل تطبيقك المنطقي من Azure إلى Visual Studio ، وهي أسهل طريقة لإنشاء قالب تطبيق منطقي ذي معلمات صالح وغالبًا ما يكون جاهزًا للنشر.

{
   "$schema": "https://schema.management.azure.com/schemas/2015-01-01/deploymentTemplate.json#",
   "contentVersion": "1.0.0.0",
   "parameters": {<template-parameters>},
   "variables": {},
   "functions": [],
   "resources": [
      {
         <logic-app-resource-definition>
      },
      // Start connection resource definitions
      {
         <connection-resource-definition-1>
      },
      {
         <connection-resource-definition-2>
      }
   ],
   "outputs": {}
}

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

فيما يلي مثال لتعريف المورد لاتصال Office 365 Outlook ومعلمات القالب المقابلة:

{
   "$schema": "https://schema.management.azure.com/schemas/2015-01-01/deploymentTemplate.json#",
   "contentVersion": "1.0.0.0",
   // Template parameters
   "parameters": {
      "LogicAppName": {<parameter-definition>},
      "LogicAppLocation": {<parameter-definition>},
      "office365_1_Connection_Name": {
         "type": "string",
         "defaultValue": "office365",
         "metadata": {
            "description": "The resource name for the Office 365 Outlook connection"
         }
      },
      "office365_1_Connection_DisplayName": {
         "type": "string",
         "defaultValue": "",
         "metadata": {
            "description": "The display name for the Office 365 Outlook connection"
         }
      }
   },
   "variables": {},
   "functions": [],
   "resources": [
      {
         <logic-app-resource-definition>
      },
      // Office 365 Outlook API connection resource definition
      {
         "type": "Microsoft.Web/connections",
         "apiVersion": "2016-06-01",
         // Template parameter reference for connection name
         "name": "[parameters('office365_1_Connection_Name')]",
         // Template parameter reference for connection resource location. Must match logic app location.
         "location": "[parameters('LogicAppLocation')]",
         "properties": {
            "api": {
               // Connector ID
               "id": "[concat(subscription().id, '/providers/Microsoft.Web/locations/', parameters('LogicAppLocation'), '/managedApis/', 'office365')]"
            },
            // Template parameter reference for connection display name
            "displayName": "[parameters('office365_1_Connection_DisplayName')]"
         }
      }
   ],
   "outputs": {}
}

يعمل تعريف مورد تطبيقك المنطقي أيضًا مع تعريفات موارد الاتصال بهذه الطرق:

  • داخل تعريف سير العمل الخاص بك، يعلن الكائن parameters عن معلمة $connections لقيم الاتصال لاستخدامها في وقت تشغيل تطبيق المنطق. أيضًا، يستخدم المشغل أو الإجراء الذي ينشئ اتصال القيم المناظرة التي تمر عبر معلمة $connections هذه.

  • خارج تعريف سير العمل الخاص بك ولكن لا يزال داخل تعريف مورد تطبيقك المنطقي، يعيّن كائن parameters آخر القيم لاستخدامها في وقت التشغيل للمعلمة $connections من خلال الرجوع إلى معلمات القالب المقابلة. تستخدم هذه القيم تعبيرات القالب للإشارة إلى الموارد التي تخزن بشكل آمن البيانات الوصفية للاتصالات في تطبيق المنطق الخاص بك.

    على سبيل المثال، يمكن أن تتضمن البيانات الوصفية سلاسل الاتصال ورموز الوصول، والتي يمكنك تخزينها في Azure Key Vault . لتمرير هذه القيم إلى معلمات القالب، قم بالإشارة إلى مخزن المفاتيح هذا في ملف المعلمات الذي يستخدمه قالبك عند النشر. لمزيد من المعلومات حول الاختلافات في الإشارة إلى المعلمات، راجع مراجع المعلمات لاحقًا في هذا الموضوع.

    عندما تفتح تعريف سير عمل تطبيق المنطق الخاص بك في عرض التعليمات البرمجية من خلال مدخل Azure أو Visual Studio، يظهر الكائن $connections خارج تعريف سير العمل الخاص بك ولكن على نفس المستوى. يسهّل هذا الترتيب في عرض التعليمات البرمجية الرجوع إلى هذه المعلمات عند تحديث تعريف سير العمل يدويًا:

    {
       "$connections": {<workflow-definition-parameter-connection-values-runtime},
       "definition": {<workflow-definition>}
    }
    
  • يحتوي تعريف مورد تطبيق المنطق على كائن dependsOn يحدد التبعيات على الاتصالات التي يستخدمها تطبيق المنطق.

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

يوضح هذا المثال التفاعلات بين تعريف مورد التطبيق المنطقي وتعريف مورد الاتصال لـ Office 365 Outlook:

{
   "$schema": "https://schema.management.azure.com/schemas/2015-01-01/deploymentTemplate.json#",
   "contentVersion": "1.0.0.0",
   // Template parameters
   "parameters": {
      "LogicAppName": {<parameter-definition>},
      "LogicAppLocation": {<parameter-definition>},
      "office365_1_Connection_Name": {<parameter-definition>},
      "office365_1_Connection_DisplayName": {<parameter-definition>}
   },
   "variables": {},
   "functions": [],
   "resources": [
      {
         // Start logic app resource definition
         "properties": {
            <...>,
            "definition": {
               <...>,
               "parameters": {
                  // Workflow definition "$connections" parameter
                  "$connections": {
                     "defaultValue": {},
                     "type": "Object"
                  }
               },
               <...>
            },
            "parameters": {
               // Workflow definition "$connections" parameter values to use at runtime
               "$connections": {
                  "value": {
                     "office365": {
                        // Template parameter references
                        "id": "[concat(subscription().id, '/providers/Microsoft.Web/locations/', parameters('LogicAppLocation'), '/managedApis/', 'office365')]",
                        "connectionId": "[resourceId('Microsoft.Web/connections', parameters('office365_1_Connection_Name'))]",
                        "connectionName": "[parameters('office365_1_Connection_Name')]"
                     }
                  }
               }
            }
         },
         <other-logic-app-resource-information>,
         "dependsOn": [
            "[resourceId('Microsoft.Web/connections', parameters('office365_1_Connection_Name'))]"
         ]
         // End logic app resource definition
      },
      // Office 365 Outlook API connection resource definition
      {
         "type": "Microsoft.Web/connections",
         "apiVersion": "2016-06-01",
         // Template parameter reference for connection name
         "name": "[parameters('office365_1_Connection_Name')]",
         // Template parameter reference for connection resource location. Must match logic app location.
         "location": "[parameters('LogicAppLocation')]",
         "properties": {
            "api": {
               // Connector ID
               "id": "[concat(subscription().id, '/providers/Microsoft.Web/locations/', parameters('LogicAppLocation'), '/managedApis/', 'office365')]"
            },
            // Template parameter reference for connection display name
            "displayName": "[parameters('office365_1_Connection_DisplayName')]"
         }
      }
   ],
   "outputs": {}
}

معلمات اتصال آمنة

بالنسبة إلى معلمة الاتصال التي تعالج المعلومات الحساسة أو كلمات المرور أو مفاتيح الوصول أو الأسرار، فإن تعريف مورد الاتصال يتضمن كائنًا parameterValues يحدد هذه القيم بتنسيق زوج الاسم والقيمة. لإخفاء هذه المعلومات، يمكنك إعلان أو تحرير معلمات القالب لهذه القيم باستخدام أنواع المعلمات securestring أو secureobject. يمكنك بعد ذلك تخزين هذه المعلومات في Azure Key Vault . لتمرير هذه القيم إلى معلمات القالب، قم بالإشارة إلى مخزن المفاتيح هذا في ملف المعلمات الذي يستخدمه قالبك عند النشر.

فيما يلي مثال يوفر اسم الحساب ومفتاح الوصول لاتصال Azure Blob Storage:

ملف المعلمات

{
   "$schema": "https://schema.management.azure.com/schemas/2015-01-01/deploymentParameters.json#",
   "contentVersion": "1.0.0.0",
   // Template parameter values
   "parameters": {
      "LogicAppName": {
         "value": "Email-Processor-Logic-App"
      },
      "LogicAppLocation": {
         "value": "westeurope"
      },
      "azureblob_1_Connection_Name": {
         "value": "Fabrikam-Azure-Blob-Storage-Connection"
      },
      "azureblob_1_Connection_DisplayName": {
         "value": "Fabrikam-Storage"
      },
      "azureblob_1_accountName": {
         "value": "Fabrikam-Storage-Account"
      },
      "azureblob_1_accessKey": {
         "reference": {
            "keyVault": {
               "id": "/subscriptions/<Azure-subscription-ID>/resourceGroups/<Azure-resource-group-name>/Microsoft.KeyVault/vaults/fabrikam-key-vault"
            },
            "secretName": "FabrikamStorageKey"
         }
      }
   }
}

القالب

{
   "$schema": "https://schema.management.azure.com/schemas/2015-01-01/deploymentTemplate.json#",
   "contentVersion": "1.0.0.0",
   // Template parameters
   "parameters": {
      "LogicAppName": {<parameter-definition>},
      "LogicAppLocation": {<parameter-definition>},
      "azureblob_1_Connection_Name": {<parameter-definition>},
      "azureblob_1_Connection_DisplayName": {<parameter-definition>},
      "azureblob_1_accountName": {
         "type": "string",
         "defaultValue": "",
         "metadata": {
            "description": "Name of the storage account the connector should use."
         }
      },
      "azureblob_1_accessKey": {
         "type": "secureobject",
         "metadata": {
            "description": "Specify a valid primary/secondary storage account access key."
         }
      }
   },
   "variables": {},
   "functions": [],
   "resources": [
      {
         "properties": {
            "state": "Disabled",
            "definition": {
               "$schema": "https://schema.management.azure.com/providers/Microsoft.Logic/schemas/2016-06-01/workflowdefinition.json#",
               "actions": {
                  // Azure Blob Storage action
                  "Create_blob": {
                     "type": "ApiConnection",
                     "inputs": {
                        "host": {
                           "connection": {
                              // Workflow definition parameter reference for values to use at runtime
                              "name": "@parameters('$connections')['azureblob']['connectionId']"
                           }
                        },
                     },
                     "method": "post",
                     "body": "@triggerBody()?['Body']",
                     "path": "/datasets/default/files",
                     "queries": {
                        "folderPath": "/emails",
                        "name": "@triggerBody()?['Subject']",
                        "queryParametersSingleEncoded": true
                     },
                     "runAfter": {},
                     "runtimeConfiguration": {
                        "contentTransfer": {
                           "transferMode": "Chunked"
                        }
                     }
                  }
               },
               "parameters": {
                  // Workflow definition parameter for values to use at runtime
                  "$connections": {
                     "defaultValue": {},
                     "type": "Object"
                  }
               },
               "triggers": {<trigger-definition>},
               "contentVersion": "1.0.0.0",
               "outputs": {}
            },
            "parameters": {
               "$connections": {
                  "value": {
                     // Template parameter references for values to use at runtime
                     "azureblob": {
                        "id": "[concat(subscription().id, '/providers/Microsoft.Web/locations/', parameters('LogicAppLocation'), '/managedApis/', 'azureblob')]",
                        "connectionId": "[resourceId('Microsoft.Web/connections', parameters('azureblob_1_Connection_Name'))]",
                        "connectionName": "[parameters('azureblob_1_Connection_Name')]"
                    }
                  }
               }
            },
            "name": "[parameters('LogicAppName')]",
            "type": "Microsoft.Logic/workflows",
            "location": "[parameters('LogicAppLocation')]",
            "tags": {
               "displayName": "LogicApp"
            },
            "apiVersion": "2019-05-01",
            // Template parameter reference for value to use at deployment
            "dependsOn": [
               "[resourceId('Microsoft.Web/connections', parameters('azureblob_1_Connection_Name'))]"
            ]
         }
      },
      // Azure Blob Storage API connection resource definition
      {
         "type": "Microsoft.Web/connections",
         "apiVersion": "2016-06-01",
         "name": "[parameters('azureblob_1_Connection_Name')]",
         "location": "[parameters('LogicAppLocation')]",
         "properties": {
            "api": {
               "id": "[concat(subscription().id, '/providers/Microsoft.Web/locations/', parameters('LogicAppLocation'), '/managedApis/', 'azureblob')]"
            },
            "displayName": "[parameters('azureblob_1_Connection_DisplayName')]",
            // Template parameter reference for values to use at deployment
            "parameterValues": {
               "accountName": "[parameters('azureblob_1_accountName')]",
               "accessKey": "[parameters('azureblob_1_accessKey')]"
            }
         }
      }
   ],
   "outputs": {}
}

مصادقة الاتصالات

بعد التوزيع، يعمل تطبيق المنطق الخاص بك من طرف إلى طرف مع معلمات صالحة. ومع ذلك، لا يزال يتعين عليك تخويل أي اتصالات OAuth لإنشاء رموز وصول صالحة لمصادقة بيانات الاعتماد الخاصة بك. لمزيد من المعلومات، راجع تخويل اتصالات OAuth.

تدعم بعض الاتصالات استخدام كيان خدمة Azure Active Directory (Azure AD) لتخويل الاتصالات لتطبيق منطقي مسجل في Azure AD. على سبيل المثال، يوضح تعريف مورد اتصال Azure Data Lake هذا كيفية الرجوع إلى معلمات القالب التي تتعامل مع معلومات كيان الخدمة وكيفية إعلان القالب لهذه المعلمات:

تعريف مورد الجلسة

{
   <other-template-objects>
   "type": "Microsoft.Web/connections",
   "apiVersion": "2016-06-01",
   "name": "[parameters('azuredatalake_1_Connection_Name')]",
   "location": "[parameters('LogicAppLocation')]",
   "properties": {
      "api": {
         "id": "[concat(subscription().id, '/providers/Microsoft.Web/locations/', 'resourceGroup().location', '/managedApis/', 'azuredatalake')]"
      },
      "displayName": "[parameters('azuredatalake_1_Connection_DisplayName')]",
      "parameterValues": {
         "token:clientId": "[parameters('azuredatalake_1_token:clientId')]",
         "token:clientSecret": "[parameters('azuredatalake_1_token:clientSecret')]",
         "token:TenantId": "[parameters('azuredatalake_1_token:TenantId')]",
         "token:grantType": "[parameters('azuredatalake_1_token:grantType')]"
      }
   }
}
السمة الوصف
token:clientId التطبيق أو معرف العميل المرتبط بكيان الخدمة
token:clientSecret القيمة الرئيسية المقترنة بكيان الخدمة
token:TenantId معرف الدليل لمستأجر Azure AD
token:grantType نوع المنحة المطلوب، والذي يجب أن يكون client_credentials. لمزيد من المعلومات، راجع ⁧⁩النظام الأساسي للهوية في Microsoft، وتدفق بيانات اعتماد عميل OAuth 2.0⁧⁩.

تعريفات معلمات القالب

يعلن عنصر المستوى parameters الأعلى للقالب عن هذه المعلمات لمثال الاتصال:

{
   "$schema": "https://schema.management.azure.com/schemas/2015-01-01/deploymentTemplate.json#",
   "contentVersion": "1.0.0.0",
   "parameters": {
      "azuredatalake_1_Connection_Name": {
        "type": "string",
        "defaultValue": "azuredatalake"
      },
      "azuredatalake_1_Connection_DisplayName": {
        "type": "string",
        "defaultValue": "<connection-name>"
      },
      "azuredatalake_1_token:clientId": {
        "type": "securestring",
        "metadata": {
          "description": "Client (or Application) ID of the Azure Active Directory application."
        }
      },
      "azuredatalake_1_token:clientSecret": {
        "type": "securestring",
        "metadata": {
          "description": "Client secret of the Azure Active Directory application."
        }
      },
      "azuredatalake_1_token:TenantId": {
        "type": "securestring",
        "metadata": {
          "description": "The tenant ID of for the Azure Active Directory application."
        }
      },
      "azuredatalake_1_token:resourceUri": {
        "type": "string",
        "metadata": {
          "description": "The resource you are requesting authorization to use."
        }
      },
      "azuredatalake_1_token:grantType": {
        "type": "string",
        "metadata": {
          "description": "Grant type"
        },
        "defaultValue": "client_credentials",
        "allowedValues": [
          "client_credentials"
        ]
      },
      // Other template parameters
   }
   // Other template objects
}

لمزيد من المعلومات حول العمل مع كيانات الخدمة، راجع هذه المواضيع:

مراجع إلى المعلمات

للإشارة إلى معلمات القالب، يمكنك استخدام تعبيرات القالب مع وظائف القالب، والتي يتم تقييمها عند النشر. تستخدم تعبيرات القالب الأقواس المربعة ([]):

"<attribute-name>": "[parameters('<template-parameter-name>')]"

للإشارة إلى معلمات تعريف سير العمل، يمكنك استخدام تعبيرات ووظائف لغة تعريف سير العمل، والتي يتم تقييمها في وقت التشغيل. قد تلاحظ أن بعض وظائف القالب ووظائف تعريف سير العمل لها نفس الاسم. تبدأ تعبيرات تعريف سير العمل برمز "at" (@):

"<attribute-name>": "@parameters('<workflow-definition-parameter-name>')"

يمكنك تمرير قيم معلمات القالب إلى تعريف سير العمل الخاص بك لتطبيق المنطق الخاص بك لاستخدامه في وقت التشغيل. ومع ذلك، تجنب استخدام معلمات القالب والتعبيرات وبناء الجملة في تعريف سير العمل لأن Logic App Designer لا يدعم عناصر القالب. أيضًا، يمكن أن يعقد بناء جملة القالب والتعبيرات التعليمات البرمجية الخاصة بك بسبب الاختلافات في وقت تقييم التعبيرات.

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

  1. قم بإنشاء القالب الخاص بك وقم بتعريف معلمات القالب للقيم التي يجب قبولها واستخدامها عند النشر.

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

  3. في الكائن parameters خارج تعريف سير العمل الخاص بك ولكن لا يزال داخل تعريف مورد تطبيق المنطق الخاص بك، قم بتعيين قيم معلمات تعريف سير العمل الخاصة بك عن طريق الرجوع إلى معلمات القالب المقابلة. وبهذه الطريقة، يمكنك تمرير قيم معلمات القالب إلى معلمات تعريف سير العمل.

  4. في ملف المعلمات، حدد قيم القالب الخاص بك لاستخدامها عند النشر.

مثال كامل للقالب

فيما يلي قالب العينة ذات المعلمات المستخدمة من قِبل أمثلة هذا الموضوع:

{
  "$schema": "https://schema.management.azure.com/schemas/2015-01-01/deploymentTemplate.json#",
  "contentVersion": "1.0.0.0",
   "parameters": {
      "LogicAppName": {
         "type": "string",
         "minLength": 1,
         "maxLength": 80,
         "defaultValue": "MyLogicApp",
         "metadata": {
            "description": "The resource name to use for the logic app"
         }
      },
      "LogicAppLocation": {
         "type": "string",
         "minLength": 1,
         "defaultValue": "[resourceGroup().location]",
         "metadata": {
            "description": "The resource location to use for the logic app"
         }
      },
      "office365_1_Connection_Name": {
         "type": "string",
         "defaultValue": "office365",
         "metadata": {
            "description": "The resource name to use for the Office 365 Outlook connection"
         }
      },
      "office365_1_Connection_DisplayName": {
         "type": "string",
         "defaultValue": "",
         "metadata": {
            "description": "The display name to use for the Office 365 Outlook connection"
         }
      },
      "azureblob_1_Connection_Name": {
         "type": "string",
         "defaultValue": "azureblob",
         "metadata": {
            "description": "The resource name to use for the Azure Blob storage account connection"
         }
      },
      "azureblob_1_Connection_DisplayName": {
         "type": "string",
         "defaultValue": "",
         "metadata": {
            "description": "Name of the storage account the connector should use."
         }

      },
      "azureblob_1_accountName": {
         "type": "string",
         "defaultValue": "",
         "metadata": {
            "description": "Name of the storage account the connector should use."
         }
      },
      "azureblob_1_accessKey": {
         "type": "securestring",
         "metadata": {
            "description": "Specify a valid primary/secondary storage account access key."
         }
      },
      "LogicAppIntegrationAccount": {
         "type":"string",
         "minLength": 1,
         "defaultValue": "/subscriptions/<Azure-subscription-ID>/resourceGroups/fabrikam-integration-account-rg/providers/Microsoft.Logic/integrationAccounts/fabrikam-integration-account",
         "metadata": {
            "description": "The ID to use for the integration account"
         }
      }
   },
   "variables": {},
   "resources": [
      {
         "properties": {
            "state": "Disabled",
            "integrationAccount": {
              "id": "[parameters('LogicAppIntegrationAccount')]"
            },
            "definition": {
               "$schema": "https://schema.management.azure.com/providers/Microsoft.Logic/schemas/2016-06-01/workflowdefinition.json#",
               "actions": {
                  "Create_blob": {
                     "type": "ApiConnection",
                     "inputs": {
                        "host": {
                           "connection": {
                              "name": "@parameters('$connections')['azureblob']['connectionId']"
                           }
                        }
                     },
                     "method": "post",
                     "body": "@triggerBody()?['Body']",
                     "path": "/datasets/default/files",
                     "queries": {
                        "folderPath": "/emails",
                        "name": "@triggerBody()?['Subject']",
                        "queryParametersSingleEncoded": true
                     },
                     "runAfter": {},
                     "runtimeConfiguration": {
                        "contentTransfer": {
                           "transferMode": "Chunked"
                        }
                     }
                  }
               },
               "parameters": {
                  "$connections": {
                     "defaultValue": {},
                     "type": "Object"
                  }
               },
               "triggers": {
                  "When_a_new_email_arrives": {
                     "type": "ApiConnection",
                     "inputs": {
                        "host": {
                           "connection": {
                              "name": "@parameters('$connections')['office365']['connectionId']"
                           }
                        },
                        "method": "get",
                        "path": "/Mail/OnNewEmail",
                        "queries": {
                           "folderPath": "Inbox",
                           "importance": "Any",
                           "fetchOnlyWithAttachment": false,
                           "includeAttachments": false
                        }
                     },
                     "recurrence": {
                        "frequency": "Day",
                        "interval": 1
                     },
                     "splitOn": "@triggerBody()?['value']"
                  }
               },
               "contentVersion": "1.0.0.0",
               "outputs": {}
            },
            "parameters": {
               "$connections": {
                  "value": {
                     "azureblob": {
                        "id": "[concat(subscription().id, '/providers/Microsoft.Web/locations/', parameters('LogicAppLocation'), '/managedApis/', 'azureblob')]",
                        "connectionId": "[resourceId('Microsoft.Web/connections', parameters('azureblob_1_Connection_Name'))]",
                        "connectionName": "[parameters('azureblob_1_Connection_Name')]"
                     },
                     "office365": {
                        "id": "[concat(subscription().id, '/providers/Microsoft.Web/locations/', parameters('LogicAppLocation'), '/managedApis/', 'office365')]",
                        "connectionId": "[resourceId('Microsoft.Web/connections', parameters('office365_1_Connection_Name'))]",
                        "connectionName": "[parameters('office365_1_Connection_Name')]"
                     }
                  }
               }
            },
            "accessControl": {}
         },
         "name": "[parameters('LogicAppName')]",
         "type": "Microsoft.Logic/workflows",
         "location": "[parameters('LogicAppLocation')]",
         "tags": {
            "displayName": "LogicApp"
         },
         "apiVersion": "2019-05-01",
         "dependsOn": [
            "[resourceId('Microsoft.Web/connections', parameters('azureblob_1_Connection_Name'))]",
            "[resourceId('Microsoft.Web/connections', parameters('office365_1_Connection_Name'))]"
         ]
      },
      {
         "type": "Microsoft.Web/connections",
         "apiVersion": "2016-06-01",
         "name": "[parameters('office365_1_Connection_Name')]",
         "location": "[parameters('LogicAppLocation')]",
         "properties": {
            "api": {
                "id": "[concat(subscription().id, '/providers/Microsoft.Web/locations/', parameters('LogicAppLocation'), '/managedApis/', 'office365')]"
            },
            "displayName": "[parameters('office365_1_Connection_DisplayName')]"
         }
      },
      {
         "type": "Microsoft.Web/connections",
         "apiVersion": "2016-06-01",
         "name": "[parameters('azureblob_1_Connection_Name')]",
         "location": "[parameters('LogicAppLocation')]",
         "properties": {
            "api": {
               "id": "[concat(subscription().id, '/providers/Microsoft.Web/locations/', parameters('LogicAppLocation'), '/managedApis/', 'azureblob')]"
            },
            "displayName": "[parameters('azureblob_1_Connection_DisplayName')]",
            "parameterValues": {
               "accountName": "[parameters('azureblob_1_accountName')]",
               "accessKey": "[parameters('azureblob_1_accessKey')]"
            }
         }
      }
   ],
   "outputs": {}
}

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