التشغيل السريع: إحضار التخزين الخاص بك لإنشاء تعريف تطبيق مدار من Azure ونشره

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

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

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

إذا كان تعريف التطبيق المدار أقل من 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> بما في ذلك أقواس الزاوية (<>)، باسم حساب التخزين الفريد الخاص بك.

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

استخدم الأمر التالي لتخزين URI لملف الحزمة في متغير يسمى packageuri. يمكنك استخدام قيمة المتغير عند نشر تعريف التطبيق المدار.

$packageuri=(Get-AzStorageBlob -Container appcontainer -Blob app.zip -Context $ctx).ICloudBlob.StorageUri.PrimaryUri.AbsoluteUri

استحضر سعة التخزين لتعريف التطبيق المدار

يمكنك تخزين تعريف التطبيق المدار في حساب التخزين الخاص بك بحيث يمكن إدارة موقعه والوصول إليه من قبلك لتلبية الاحتياجات التنظيمية لمؤسستك. يتيح لك استخدام حساب التخزين الخاص بك الحصول على تطبيق يتجاوز حد 120 ميغابايت لتعريف التطبيق المدار لكتالوج الخدمة.

إشعار

يُدعم توفير سعة التخزين فقط عند استخدام قالب ARM أو عمليات نشر واجهة برمجة تطبيقات REST API لتعريف التطبيق المدار.

إنشاء حساب التخزين

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

ينشئ هذا المثال مجموعة موارد جديدة باسم byosDefinitionStorageGroup. في الأمر ، استبدل العنصر النائب <definitionstorage> بما في ذلك أقواس الزاوية (<>)، باسم حساب التخزين الفريد الخاص بك.

New-AzResourceGroup -Name byosDefinitionStorageGroup -Location westus3

New-AzStorageAccount `
  -ResourceGroupName byosDefinitionStorageGroup `
  -Name "<definitionstorage>" `
  -Location westus3 `
  -SkuName Standard_LRS `
  -Kind StorageV2

استخدم الأمر التالي لتخزين معرّف مورد حساب التخزين في متغير يسمى storageid. يمكنك استخدام قيمة المتغير عند نشر تعريف التطبيق المدار.

$storageid = (Get-AzStorageAccount -ResourceGroupName byosDefinitionStorageGroup -Name <definitionstorage>).Id

عيّن تعيين الدور إلى حساب التخزين لديك

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

يمكنك استخدام المتغيرات لإعداد تعيين الدور. يستخدم هذا المثال المتغير الذي $storageid قمت بإنشائه في الخطوة السابقة وينشئ $arpid المتغير.

$arpid = (Get-AzADServicePrincipal -SearchString "Appliance Resource Provider").Id

New-AzRoleAssignment -ObjectId $arpid `
-RoleDefinitionName Contributor `
-Scope $storageid

موفر موارد الأجهزة هو كيان خدمة في مستأجر Microsoft Entra. من مدخل Microsoft Azure، يمكنك التحقق مما إذا كان مسجلا بالانتقال إلى تطبيقات Microsoft Entra ID>Enterprise وتغيير عامل تصفية البحث إلى تطبيقات Microsoft. ابحث عن Appliance Resource Provider. إذا لم يتم العثور عليه، فسجلMicrosoft.Solutions موفر الموارد.

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

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

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

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

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

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

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

إنشاء قالب نشر التعريف

استخدم ملف Bicep لنشر تعريف التطبيق المدار في كتالوج الخدمة. بعد التوزيع، يتم تخزين ملفات التعريف في حساب التخزين الخاص بك.

افتح Visual Studio Code، وأنشئ ملفا بالاسم deployDefinition.bicep واحفظه.

أضف تعليمة Bicep البرمجية التالية واحفظ الملف.

param location string = resourceGroup().location

@description('Name of the managed application definition.')
param managedApplicationDefinitionName string

@description('Resource ID for the bring your own storage account where the definition is stored.')
param definitionStorageResourceID string

@description('The URI of the .zip package file.')
param packageFileUri string

@description('Publishers Principal ID that needs permissions to manage resources in the managed resource group.')
param principalId string

@description('Role ID for permissions to the managed resource group.')
param roleId string

var definitionLockLevel = 'ReadOnly'
var definitionDisplayName = 'Sample BYOS managed application'
var definitionDescription = 'Sample BYOS managed application that deploys web resources'

resource managedApplicationDefinition 'Microsoft.Solutions/applicationDefinitions@2021-07-01' = {
  name: managedApplicationDefinitionName
  location: location
  properties: {
    lockLevel: definitionLockLevel
    description: definitionDescription
    displayName: definitionDisplayName
    packageFileUri: packageFileUri
    storageAccountId: definitionStorageResourceID
    authorizations: [
      {
        principalId: principalId
        roleDefinitionId: roleId
      }
    ]
  }
}

لمزيد من المعلومات حول خصائص القالب، انتقل إلى Microsoft.Solutions/applicationDefinitions.

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

إنشاء ملف المعلمة

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

في Visual Studio Code، أنشئ ملفا جديدا باسم deployDefinition.parameters.json واحفظه.

أضف ما يلي إلى ملف المعلمة واحفظه. بعد ذلك، استبدل بما في <placeholder values> ذلك أقواس الزاوية (<>)، بالقيم الخاصة بك.

{
  "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentParameters.json#",
  "contentVersion": "1.0.0.0",
  "parameters": {
    "managedApplicationDefinitionName": {
      "value": "<placeholder for managed application name>"
    },
    "definitionStorageResourceID": {
      "value": "<placeholder for you storage account ID>"
    },
    "packageFileUri": {
      "value": "<placeholder for the packageFileUri>"
    },
    "principalId": {
      "value": "<placeholder for principalid value>"
    },
    "roleId": {
      "value": "<placeholder for roleid value>"
    }
  }
}

يصف الجدول التالي قيم المعلمات لتعريف التطبيق المدار.

المعلمة القيمة
managedApplicationDefinitionName اسم تعريف التطبيق المدار. على سبيل المثال، استخدم sampleByosManagedApplication.
definitionStorageResourceID معرف المورد لحساب التخزين حيث يتم تخزين التعريف. استخدم قيمة المتغير الخاص بك storageid .
packageFileUri أدخل URI لملف حزمة .zip . استخدم قيمة المتغير الخاص بك packageuri . التنسيق هو https://yourStorageAccountName.blob.core.windows.net/appcontainer/app.zip.
principalId المعرف الأساسي للناشرين الذي يحتاج إلى أذونات لإدارة الموارد في مجموعة الموارد المدارة. استخدم قيمة المتغير الخاص بك principalid .
roleId معرف الدور للأذونات لمجموعة الموارد المدارة. على سبيل المثال المالك، المساهم، القارئ. استخدم قيمة المتغير الخاص بك roleid .

للحصول على قيم المتغيرات الخاصة بك:

  • Azure PowerShell: في PowerShell، اكتب $variableName لعرض قيمة متغير.
  • Azure CLI: في Bash، اكتب echo $variableName لعرض قيمة متغير.

نشر التعريف

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

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

New-AzResourceGroup -Name byosAppDefinitionGroup -Location westus3

New-AzResourceGroupDeployment `
  -ResourceGroupName byosAppDefinitionGroup `
  -TemplateFile deployDefinition.bicep `
  -TemplateParameterFile deployDefinition.parameters.json

تحقق من تخزين ملفات التعريف

تستخدم خاصية القالب storageAccountId، أثناء النشر، معرّف مورد حساب التخزين الخاص بك وتنشئ حاوية جديدة تحمل الاسم الحساس لحالة الأحرف applicationdefinitions. يتم تخزين الملفات من حزمة .zip التي حددتها أثناء النشر في الحاوية الجديدة.

يمكنك استخدام الأوامر التالية للتحقق من حفظ ملفات تعريف التطبيق المدار في حاوية حساب التخزين الخاص بك. في الأمر ، استبدل العنصر النائب <definitionstorage> بما في ذلك أقواس الزاوية (<>)، باسم حساب التخزين الفريد الخاص بك.

Get-AzStorageAccount -ResourceGroupName byosDefinitionStorageGroup -Name <definitionstorage> |
Get-AzStorageContainer -Name applicationdefinitions |
Get-AzStorageBlob | Select-Object -Property Name | Format-List

إشعار

لللمزيد من الأمان، يمكنك إنشاء تعريف تطبيقات مدارة مخزنة في Azure storage account blob where encryption is enabled. تُشفر محتويات التعريف من خلال خيارات التشفير الخاصة بحساب التخزين. يمكن فقط للمستخدمين الذين لديهم أذونات للملف الوصول إلى التعريف في كتالوج الخدمة.

تأكد من أن المستخدمين يمكنهم الوصول إلى التعريف الخاص بك

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

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

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

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

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

Remove-AzResourceGroup -Name packageStorageGroup

Remove-AzResourceGroup -Name byosAppDefinitionGroup

Remove-AzResourceGroup -Name byosDefinitionStorageGroup

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

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