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

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

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

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

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

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

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

لإكمال المهام في هذه المقالة، تحتاج إلى العناصر التالية:

إنشاء ملف Bicep

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

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

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

param location string = resourceGroup().location

@description('App Service plan name.')
@maxLength(40)
param appServicePlanName string

@description('App Service name prefix.')
@maxLength(47)
param appServiceNamePrefix string

@description('Storage account name prefix.')
@maxLength(11)
param storageAccountNamePrefix string

@description('Storage account type allowed values')
@allowed([
  'Premium_LRS'
  'Standard_LRS'
  'Standard_GRS'
])
param storageAccountType string

var appServicePlanSku = 'F1'
var appServicePlanCapacity = 1
var appServiceName = '${appServiceNamePrefix}${uniqueString(resourceGroup().id)}'
var storageAccountName = '${storageAccountNamePrefix}${uniqueString(resourceGroup().id)}'
var appServiceStorageConnectionString = 'DefaultEndpointsProtocol=https;AccountName=${storageAccount.name};EndpointSuffix=${environment().suffixes.storage};Key=${storageAccount.listKeys().keys[0].value}'

resource appServicePlan 'Microsoft.Web/serverfarms@2022-03-01' = {
  name: appServicePlanName
  location: location
  sku: {
    name: appServicePlanSku
    capacity: appServicePlanCapacity
  }
}

resource appServiceApp 'Microsoft.Web/sites@2022-03-01' = {
  name: appServiceName
  location: location
  properties: {
    serverFarmId: appServicePlan.id
    httpsOnly: true
    siteConfig: {
      appSettings: [
        {
          name: 'AppServiceStorageConnectionString'
          value: appServiceStorageConnectionString
        }
      ]
    }
  }
}

resource storageAccount 'Microsoft.Storage/storageAccounts@2022-09-01' = {
  name: storageAccountName
  location: location
  sku: {
    name: storageAccountType
  }
  kind: 'StorageV2'
  properties: {
    accessTier: 'Hot'
  }
}

output appServicePlan string = appServicePlan.name
output appServiceApp string = appServiceApp.properties.defaultHostName
output storageAccount string = storageAccount.properties.primaryEndpoints.blob

التحويل من Bicep إلى JSON

استخدم PowerShell أو Azure CLI لإنشاء ملف mainTemplate.json . انتقل إلى الدليل حيث قمت بحفظ ملف Bicep الخاص بك وقم بتشغيل build الأمر .

bicep build mainTemplate.bicep

لمعرفة المزيد، انتقل إلى Bicep build.

بعد تحويل ملف Bicep إلى JSON، يجب أن يتطابق ملف mainTemplate.json مع المثال التالي. قد يكون لديك قيم مختلفة في خصائص metadataversion و templateHash.

{
  "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
  "contentVersion": "1.0.0.0",
  "metadata": {
    "_generator": {
      "name": "bicep",
      "version": "0.17.1.54307",
      "templateHash": "1234567891234567890"
    }
  },
  "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 packageStorageRG -Location westus3

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

$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

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

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

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

الخطوة التالية هي تحديد مستخدم أو مجموعة أمان أو تطبيق لإدارة الموارد للعميل. هذه الهوية لديها أذونات على مجموعة الموارد المدارة وفقا للدور المعين. يمكن أن يكون الدور أي دور مدمج في 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('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 Bicep managed application'
var definitionDescription = 'Sample Bicep 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
    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": "sampleBicepManagedApplication"
    },
    "packageFileUri": {
      "value": "<placeholder for the packageFileUri>"
    },
    "principalId": {
      "value": "<placeholder for principalid value>"
    },
    "roleId": {
      "value": "<placeholder for roleid value>"
    }
  }
}

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

المعلمة القيمة
managedApplicationDefinitionName اسم تعريف التطبيق المدار. على سبيل المثال، استخدم sampleBicepManagedApplication.
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 لعرض قيمة متغير.

نشر التعريف

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

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

New-AzResourceGroup -Name bicepDefinitionRG -Location westus3

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

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

قم بتشغيل الأمر التالي للتحقق من نشر التعريف في كتالوج الخدمة.

Get-AzManagedApplicationDefinition -ResourceGroupName bicepDefinitionRG

Get-AzManagedApplicationDefinition يسرد جميع التعريفات المتوفرة في مجموعة الموارد المحددة، مثل sampleBicepManagedApplication.

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

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

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

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

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

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

Remove-AzResourceGroup -Name packageStorageRG

Remove-AzResourceGroup -Name bicepDefinitionRG

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

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