التشغيل السريع: إنشاء ونشر تعريف تطبيق Azure المدار

يوفر هذا التشغيل السريع مقدمة للعمل مع تطبيقات Azure المدارة. يمكنك إنشاء ونشر تعريف تطبيق مدار مخزن في كتالوج الخدمة الخاص بك ومخصصة لأعضاء مؤسستك.

لنشر تطبيق مدار إلى كتالوج الخدمة، يجب تنفيذ المهام التالية:

  • إنشاء قالب Azure Resource Manager (قالب ARM) الذي يحدد الموارد لتوزيعها مع التطبيق المدار.
  • تعريف عناصر واجهة المستخدم للمدخل عند نشر التطبيق المدار.
  • إنشاء حزمة .zip تحتوي على ملفات JSON المطلوبة. يحتوي ملف حزمة .zip على حد 120 ميغابايت لتعريف التطبيق المدار بواسطة كتالوج الخدمة.
  • نشر تعريف التطبيق المدار بحيث يكون متوفرا في كتالوج الخدمة.

إذا كان تعريف التطبيق المدار أكثر من 120 ميغابايت أو إذا كنت تريد استخدام حساب التخزين الخاص بك لأسباب تتعلق بتوافق مؤسستك، فانتقل إلى التشغيل السريع: إحضار التخزين الخاص بك لإنشاء تعريف تطبيق مدار من Azure ونشره.

يمكنك استخدام Bicep لتطوير تعريف تطبيق مدار ولكن يجب تحويله إلى قالب ARM JSON قبل أن تتمكن من نشر التعريف في Azure. لمزيد من المعلومات، انتقل إلى التشغيل السريع: استخدم Bicep لإنشاء تعريف تطبيق مدار من Azure ونشره.

يمكنك أيضا استخدام Bicep لنشر تعريف تطبيق مدار من كتالوج الخدمة. لمزيد من المعلومات، انتقل إلى التشغيل السريع: استخدم Bicep لنشر تعريف تطبيق Azure المدار.

المتطلبات الأساسية

لاستكمال هذا التشغيل السريع، ستحتاج إلى العناصر التالية:

إنشاء قالب ARM

يتضمن كل تعريف تطبيق مدار ملفا يسمى mainTemplate.json. يحدد القالب موارد Azure المراد نشرها ولا يختلف عن قالب ARM العادي.

افتح Visual Studio Code، وأنشئ ملفا يحمل الاسم الحساس لحالة الأحرف mainTemplate.json واحفظه.

إضافة JSON التالي وحفظ الملف. وهو يحدد الموارد لنشر App Service وخطة App Service وحساب التخزين للتطبيق. لا يتم استخدام حساب التخزين هذا لتخزين تعريف التطبيق المدار.

{
  "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
  "contentVersion": "1.0.0.0",
  "parameters": {
    "location": {
      "type": "string",
      "defaultValue": "[resourceGroup().location]"
    },
    "appServicePlanName": {
      "type": "string",
      "maxLength": 40,
      "metadata": {
        "description": "App Service plan name."
      }
    },
    "appServiceNamePrefix": {
      "type": "string",
      "maxLength": 47,
      "metadata": {
        "description": "App Service name prefix."
      }
    },
    "storageAccountNamePrefix": {
      "type": "string",
      "maxLength": 11,
      "metadata": {
        "description": "Storage account name prefix."
      }
    },
    "storageAccountType": {
      "type": "string",
      "allowedValues": [
        "Premium_LRS",
        "Standard_LRS",
        "Standard_GRS"
      ],
      "metadata": {
        "description": "Storage account type allowed values"
      }
    }
  },
  "variables": {
    "appServicePlanSku": "F1",
    "appServicePlanCapacity": 1,
    "appServiceName": "[format('{0}{1}', parameters('appServiceNamePrefix'), uniqueString(resourceGroup().id))]",
    "storageAccountName": "[format('{0}{1}', parameters('storageAccountNamePrefix'), uniqueString(resourceGroup().id))]"
  },
  "resources": [
    {
      "type": "Microsoft.Web/serverfarms",
      "apiVersion": "2022-03-01",
      "name": "[parameters('appServicePlanName')]",
      "location": "[parameters('location')]",
      "sku": {
        "name": "[variables('appServicePlanSku')]",
        "capacity": "[variables('appServicePlanCapacity')]"
      }
    },
    {
      "type": "Microsoft.Web/sites",
      "apiVersion": "2022-03-01",
      "name": "[variables('appServiceName')]",
      "location": "[parameters('location')]",
      "properties": {
        "serverFarmId": "[resourceId('Microsoft.Web/serverfarms', parameters('appServicePlanName'))]",
        "httpsOnly": true,
        "siteConfig": {
          "appSettings": [
            {
              "name": "AppServiceStorageConnectionString",
              "value": "[format('DefaultEndpointsProtocol=https;AccountName={0};EndpointSuffix={1};Key={2}', variables('storageAccountName'), environment().suffixes.storage, listKeys(resourceId('Microsoft.Storage/storageAccounts', variables('storageAccountName')), '2022-09-01').keys[0].value)]"
            }
          ]
        }
      },
      "dependsOn": [
        "[resourceId('Microsoft.Web/serverfarms', parameters('appServicePlanName'))]",
        "[resourceId('Microsoft.Storage/storageAccounts', variables('storageAccountName'))]"
      ]
    },
    {
      "type": "Microsoft.Storage/storageAccounts",
      "apiVersion": "2022-09-01",
      "name": "[variables('storageAccountName')]",
      "location": "[parameters('location')]",
      "sku": {
        "name": "[parameters('storageAccountType')]"
      },
      "kind": "StorageV2",
      "properties": {
        "accessTier": "Hot"
      }
    }
  ],
  "outputs": {
    "appServicePlan": {
      "type": "string",
      "value": "[parameters('appServicePlanName')]"
    },
    "appServiceApp": {
      "type": "string",
      "value": "[reference(resourceId('Microsoft.Web/sites', variables('appServiceName')), '2022-03-01').defaultHostName]"
    },
    "storageAccount": {
      "type": "string",
      "value": "[reference(resourceId('Microsoft.Storage/storageAccounts', variables('storageAccountName')), '2022-09-01').primaryEndpoints.blob]"
    }
  }
}

تحديد تجربة المدخل

بصفتك ناشرا، يمكنك تحديد تجربة المدخل لإنشاء التطبيق المدار. ينشئ ملف createUiDefinition.json واجهة مستخدم المدخل. يمكنك تحديد كيفية توفير المستخدمين الإدخال لكل معلمة باستخدام عناصر التحكم مثل القوائم المنسدلة ومربعات النص.

في هذا المثال، تطالبك واجهة المستخدم بإدخال بادئة اسم App Service واسم خطة App Service وبادئة حساب التخزين ونوع حساب التخزين. أثناء النشر، تستخدم المتغيرات في mainTemplate.json الدالة uniqueString لإلحاق سلسلة مكونة من 13 حرفا ببادئات الاسم بحيث تكون الأسماء فريدة عالميا عبر Azure.

افتح Visual Studio Code، وأنشئ ملفا يحمل الاسم الحساس لحالة الأحرف createUiDefinition.json واحفظه.

أضف التعليمة البرمجية JSON التالية إلى الملف واحفظه.

{
  "$schema": "https://schema.management.azure.com/schemas/0.1.2-preview/CreateUIDefinition.MultiVm.json#",
  "handler": "Microsoft.Azure.CreateUIDef",
  "version": "0.1.2-preview",
  "parameters": {
    "basics": [
      {}
    ],
    "steps": [
      {
        "name": "webAppSettings",
        "label": "Web App settings",
        "subLabel": {
          "preValidation": "Configure the web app settings",
          "postValidation": "Completed"
        },
        "elements": [
          {
            "name": "appServicePlanName",
            "type": "Microsoft.Common.TextBox",
            "label": "App Service plan name",
            "placeholder": "App Service plan name",
            "defaultValue": "",
            "toolTip": "Use alphanumeric characters or hyphens with a maximum of 40 characters.",
            "constraints": {
              "required": true,
              "regex": "^[a-z0-9A-Z-]{1,40}$",
              "validationMessage": "Only alphanumeric characters or hyphens are allowed, with a maximum of 40 characters."
            },
            "visible": true
          },
          {
            "name": "appServiceName",
            "type": "Microsoft.Common.TextBox",
            "label": "App Service name prefix",
            "placeholder": "App Service name prefix",
            "defaultValue": "",
            "toolTip": "Use alphanumeric characters or hyphens with minimum of 2 characters and maximum of 47 characters.",
            "constraints": {
              "required": true,
              "regex": "^[a-z0-9A-Z-]{2,47}$",
              "validationMessage": "Only alphanumeric characters or hyphens are allowed, with a minimum of 2 characters and maximum of 47 characters."
            },
            "visible": true
          }
        ]
      },
      {
        "name": "storageConfig",
        "label": "Storage settings",
        "subLabel": {
          "preValidation": "Configure the storage settings",
          "postValidation": "Completed"
        },
        "elements": [
          {
            "name": "storageAccounts",
            "type": "Microsoft.Storage.MultiStorageAccountCombo",
            "label": {
              "prefix": "Storage account name prefix",
              "type": "Storage account type"
            },
            "toolTip": {
              "prefix": "Enter maximum of 11 lowercase letters or numbers.",
              "type": "Available choices are Standard_LRS, Standard_GRS, and Premium_LRS."
            },
            "defaultValue": {
              "type": "Standard_LRS"
            },
            "constraints": {
              "allowedTypes": [
                "Premium_LRS",
                "Standard_LRS",
                "Standard_GRS"
              ]
            },
            "visible": true
          }
        ]
      }
    ],
    "outputs": {
      "location": "[location()]",
      "appServicePlanName": "[steps('webAppSettings').appServicePlanName]",
      "appServiceNamePrefix": "[steps('webAppSettings').appServiceName]",
      "storageAccountNamePrefix": "[steps('storageConfig').storageAccounts.prefix]",
      "storageAccountType": "[steps('storageConfig').storageAccounts.type]"
    }
  }
}

لمعرفة المزيد، راجع بدء استخدام CreateUiDefinition.

حزم الملفات

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

قم بتحميل app.zip إلى حساب تخزين Azure حتى تتمكن من استخدامه عند نشر تعريف التطبيق المدار. يجب أن يكون اسم حساب التخزين فريدا عموميا عبر Azure ويجب أن يكون الطول من 3 إلى 24 حرفا بأحرف صغيرة وأرقام فقط. في الأمر ، استبدل العنصر النائب <demostorageaccount> بما في ذلك أقواس الزاوية (<>)، باسم حساب التخزين الفريد الخاص بك.

في Visual Studio Code، افتح محطة PowerShell طرفية جديدة وسجل الدخول إلى اشتراك Azure الخاص بك.

Connect-AzAccount

يفتح الأمر المستعرض الافتراضي ويطالبك بتسجيل الدخول إلى Azure. لمزيد من المعلومات، انتقل إلى تسجيل الدخول باستخدام Azure PowerShell.

New-AzResourceGroup -Name packageStorageGroup -Location westus3

$storageAccount = New-AzStorageAccount `
  -ResourceGroupName packageStorageGroup `
  -Name "<demostorageaccount>" `
  -Location westus3 `
  -SkuName Standard_LRS `
  -Kind StorageV2

$ctx = $storageAccount.Context

New-AzStorageContainer -Name appcontainer -Context $ctx -Permission blob

Set-AzStorageBlobContent `
  -File "app.zip" `
  -Container appcontainer `
  -Blob "app.zip" `
  -Context $ctx

إنشاء تعريف تطبيق مدار.

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

الحصول على معرف المجموعة ومعرف تعريف الدور

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

يستخدم هذا المثال مجموعة أمان، ويجب أن يكون حساب Microsoft Entra الخاص بك عضوا في المجموعة. للحصول على معرف عنصر المجموعة، استبدل العنصر النائب <managedAppDemo> بما في ذلك أقواس الزاوية (<>)، باسم مجموعتك. يمكنك استخدام قيمة هذا المتغير عند نشر تعريف التطبيق المدار.

لإنشاء مجموعة Microsoft Entra جديدة، انتقل إلى إدارة مجموعات Microsoft Entra وعضوية المجموعة.

$principalid=(Get-AzADGroup -DisplayName <managedAppDemo>).Id

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

$roleid=(Get-AzRoleDefinition -Name Owner).Id

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

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

New-AzResourceGroup -Name appDefinitionGroup -Location westus3

blob ينشئ الأمر متغيرا لتخزين عنوان URL لملف .zip للحزمة. يتم استخدام هذا المتغير في الأمر الذي ينشئ تعريف التطبيق المدار.

$blob = Get-AzStorageBlob -Container appcontainer -Blob app.zip -Context $ctx

New-AzManagedApplicationDefinition `
  -Name "sampleManagedApplication" `
  -Location "westus3" `
  -ResourceGroupName appDefinitionGroup `
  -LockLevel ReadOnly `
  -DisplayName "Sample managed application" `
  -Description "Sample managed application that deploys web resources" `
  -Authorization "${principalid}:$roleid" `
  -PackageFileUri $blob.ICloudBlob.StorageUri.PrimaryUri.AbsoluteUri

عند الانتهاء من الأمر، يكون لديك تعريف تطبيق مدار في مجموعة مواردك.

بعض المعلمات المستخدمة في المثال السابق هي:

  • ResourceGroupName: اسم مجموعة الموارد حيث يتم إنشاء تعريف التطبيق المدار.
  • LockLevellockLevel: في مجموعة الموارد المدارة يمنع العميل من تنفيذ عمليات غير مرغوب فيها على مجموعة الموارد هذه. يُمثل ReadOnly حاليا مستوى القفل المدعوم. ReadOnly يحدد أن العميل يمكنه قراءة الموارد الموجودة في مجموعة الموارد المدارة فقط. يتم إعفاء هويات الناشر التي تم منحها حق الوصول إلى مجموعة الموارد المدارة من مستوى التأمين.
  • Authorization: يصف المعرف الأساسي ومعرف تعريف الدور المستخدم لمنح الإذن لمجموعة الموارد المدارة.
    • "${principalid}:$roleid" أو يمكنك استخدام أقواس متعرجة لكل متغير "${principalid}:${roleid}".
    • استخدم فاصلة لفصل قيم متعددة: "${principalid1}:$roleid1", "${principalid2}:$roleid2".
  • PackageFileUri: موقع ملف حزمة .zip الذي يحتوي على الملفات المطلوبة.

تأكد من رؤية المستخدمين لتعريفك

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

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

إذا كنت تريد نشر التعريف، فتابع مع قسم الخطوات التالية الذي يرتبط بالمقالة لنشر التعريف.

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

يطالبك الأمر بتأكيد رغبتك في إزالة مجموعة الموارد.

Remove-AzResourceGroup -Name packageStorageGroup

Remove-AzResourceGroup -Name appDefinitionGroup

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

لقد نشرت تعريف التطبيق المدار. الخطوة التالية هي معرفة كيفية نشر مثيل لهذا التعريف.