Краткое руководство. Создание и публикация определения управляемого приложения Azure с помощью собственного хранилища
В этом кратком руководстве приведены общие сведения о том, как использовать собственное хранилище (BYOS) для управляемого приложения Azure. Вы создаете и публикуете определение управляемого приложения в каталоге служб для членов вашей организации. При использовании собственной учетной записи хранения определение управляемого приложения может превышать ограничение каталога служб в 120 МБ.
Чтобы опубликовать определение управляемого приложения в каталоге служб, выполните следующие задачи:
- Создайте шаблон Azure Resource Manager (шаблон ARM), определяющий ресурсы Azure, развернутые управляемым приложением.
- Определите элементы пользовательского интерфейса для портала при развертывании управляемого приложения.
- Создайте пакет .zip, содержащий необходимые JSON-файлы.
- Создайте учетную запись хранения, в которой хранится определение управляемого приложения.
- Разверните определение управляемого приложения в собственной учетной записи хранения, чтобы она была доступна в каталоге служб.
Если определение управляемого приложения меньше 120 МБ, и вы не хотите использовать собственную учетную запись хранения, перейдите в краткое руководство. Создание и публикация определения управляемого приложения Azure.
Вы можете использовать Bicep для разработки определения управляемого приложения, но его необходимо преобразовать в json шаблона ARM, прежде чем опубликовать определение в Azure. Дополнительные сведения см. в кратком руководстве. Использование Bicep для создания и публикации определения управляемого приложения Azure.
Вы также можете использовать Bicep для развертывания определения управляемого приложения из каталога служб. Дополнительные сведения см. в кратком руководстве. Использование Bicep для развертывания определения управляемого приложения Azure.
Необходимые компоненты
Для работы с этим кратким руководством вам потребуется следующее:
- Учетная запись Azure с активной подпиской и разрешениями для ресурсов Microsoft Entra, таких как пользователи, группы или субъекты-службы. Если у вас нет учетной записи, создайте бесплатную учетную запись, прежде чем начинать работу.
- Visual Studio Code с последней версией расширения средств Resource Manager. Для файлов Bicep установите расширение Bicep для Visual Studio Code.
- Установите последнюю версию Azure PowerShell или Azure CLI.
Создание шаблона ARM
В каждом определении управляемого приложения указан файл с именем mainTemplate.json. Шаблон определяет ресурсы Azure для развертывания и не отличается от обычного шаблона ARM.
Откройте Visual Studio Code, создайте файл с именем mainTemplate.json (с учетом регистра) и сохраните его.
Добавьте следующие данные JSON и сохраните файл. Он определяет ресурсы управляемого приложения для развертывания Служба приложений, плана Служба приложений и учетной записи хранения.
{
"$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."
}
}
},
"variables": {
"appServicePlanSku": "B1",
"appServicePlanCapacity": 1,
"appServiceName": "[format('{0}{1}', parameters('appServiceNamePrefix'), uniqueString(resourceGroup().id))]",
"linuxFxVersion": "DOTNETCORE|8.0"
},
"resources": [
{
"type": "Microsoft.Web/serverfarms",
"apiVersion": "2023-01-01",
"name": "[parameters('appServicePlanName')]",
"location": "[parameters('location')]",
"sku": {
"name": "[variables('appServicePlanSku')]",
"capacity": "[variables('appServicePlanCapacity')]"
},
"kind": "linux",
"properties": {
"zoneRedundant": false,
"reserved": true
}
},
{
"type": "Microsoft.Web/sites",
"apiVersion": "2023-01-01",
"name": "[variables('appServiceName')]",
"location": "[parameters('location')]",
"properties": {
"serverFarmId": "[resourceId('Microsoft.Web/serverfarms', parameters('appServicePlanName'))]",
"httpsOnly": true,
"redundancyMode": "None",
"siteConfig": {
"linuxFxVersion": "[variables('linuxFxVersion')]",
"minTlsVersion": "1.2",
"ftpsState": "Disabled"
}
},
"dependsOn": [
"[resourceId('Microsoft.Web/serverfarms', parameters('appServicePlanName'))]"
]
}
],
"outputs": {
"appServicePlan": {
"type": "string",
"value": "[parameters('appServicePlanName')]"
},
"appServiceApp": {
"type": "string",
"value": "[reference(resourceId('Microsoft.Web/sites', variables('appServiceName')), '2023-01-01').defaultHostName]"
}
}
}
Определение интерфейса портала
В качестве издателя вы определяете интерфейс портала для создания управляемого приложения. Файл createUiDefinition.json создает пользовательский интерфейс портала. Вы определяете, как пользователи предоставляют входные данные для каждого параметра с помощью элементов управления, таких как раскрывающийся список и текстовые поля.
В этом примере пользовательский интерфейс запрашивает ввод префикса имени Служба приложений и имени плана Служба приложений. Во время развертывания mainTemplate.json appServiceName
переменные используют 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
}
]
}
],
"outputs": {
"location": "[location()]",
"appServicePlanName": "[steps('webAppSettings').appServicePlanName]",
"appServiceNamePrefix": "[steps('webAppSettings').appServiceName]"
}
}
}
Дополнительные сведения см. в разделе "Начало работы с CreateUiDefinition".
Упаковка файлов
Добавьте два файла в файл пакета с именем app.zip. Приведенные выше два файла должны быть расположены на корневом уровне ZIP-файла. Если файлы находятся в папке, при создании определения управляемого приложения вы получите сообщение об ошибке, которое указывает, что необходимые файлы отсутствуют.
Отправьте app.zip в учетную запись хранения Azure, чтобы ее можно было использовать при развертывании определения управляемого приложения. Имя учетной записи хранения должно быть глобально уникальным в Azure, а его длина должна составлять 3–24 символа (допускаются только строчные буквы и цифры). В команде замените заполнитель <pkgstorageaccountname>
, включая угловые скобки (<>
), на имя уникальной учетной записи хранения.
New-AzResourceGroup -Name packageStorageGroup -Location westus
$pkgstorageparms = @{
ResourceGroupName = "packageStorageGroup"
Name = "<pkgstorageaccountname>"
Location = "westus"
SkuName = "Standard_LRS"
Kind = "StorageV2"
MinimumTlsVersion = "TLS1_2"
AllowBlobPublicAccess = $true
AllowSharedKeyAccess = $false
}
$pkgstorageaccount = New-AzStorageAccount @pkgstorageparms
Переменная $pkgstorageparms
использует splatting PowerShell для улучшения удобочитаемости значений параметров, используемых в команде для создания новой учетной записи хранения. Splatting используется в других командах PowerShell, использующих несколько значений параметров.
После создания учетной записи хранения добавьте участника данных BLOB-объектов хранилища ролей в область учетной записи хранения. Назначьте доступ к учетной записи пользователя Microsoft Entra. В зависимости от уровня доступа в Azure может потребоваться другие разрешения, назначенные администратором. Дополнительные сведения см. в статье "Назначение роли Azure для доступа к данным BLOB-объектов" и назначение ролей Azure с помощью портал Azure.
После добавления роли в учетную запись хранения потребуется несколько минут, чтобы стать активным в Azure. Затем можно создать контекст, необходимый для создания контейнера и отправки файла.
$pkgstoragecontext = New-AzStorageContext -StorageAccountName $pkgstorageaccount.StorageAccountName -UseConnectedAccount
New-AzStorageContainer -Name appcontainer -Context $pkgstoragecontext -Permission blob
$blobparms = @{
File = "app.zip"
Container = "appcontainer"
Blob = "app.zip"
Context = $pkgstoragecontext
}
Set-AzStorageBlobContent @blobparms
Используйте следующую команду, чтобы сохранить универсальный код ресурса (URI) файла пакета в переменной с именем packageuri
. Значение переменной используется при развертывании определения управляемого приложения.
$packageuri=(Get-AzStorageBlob -Container appcontainer -Blob app.zip -Context $pkgstoragecontext).ICloudBlob.StorageUri.PrimaryUri.AbsoluteUri
Предоставление собственного хранилища для определения управляемого приложения
Вы храните определение управляемого приложения в собственной учетной записи хранения, чтобы его расположение и доступ можно было управлять вами для нормативных потребностей вашей организации. Использование собственной учетной записи хранения позволяет иметь приложение, превышающее ограничение в 120 МБ для определения управляемого приложения каталога служб.
Примечание.
Подключение к собственному хранилищу поддерживается только с шаблоном ARM или развертываниями REST API для определения управляемого приложения.
Создание учетной записи хранения
Создайте учетную запись хранения для определения управляемого приложения. Имя учетной записи хранения должно быть глобально уникальным в Azure, а его длина должна составлять 3–24 символа (допускаются только строчные буквы и цифры).
В этом примере показано создание группы ресурсов с именем byosDefinitionStorageGroup
. В команде замените заполнитель <byosaccountname>
, включая угловые скобки (<>
), на имя уникальной учетной записи хранения.
New-AzResourceGroup -Name byosDefinitionStorageGroup -Location westus
$byostorageparms = @{
ResourceGroupName = "byosDefinitionStorageGroup"
Name = "<byosaccountname>"
Location = "westus"
SkuName = "Standard_LRS"
Kind = "StorageV2"
MinimumTlsVersion = "TLS1_2"
AllowBlobPublicAccess = $true
AllowSharedKeyAccess = $true
}
$byosstorageaccount = New-AzStorageAccount @byostorageparms
После создания учетной записи хранения добавьте участника данных BLOB-объектов хранилища ролей в область учетной записи хранения. Назначьте доступ к учетной записи пользователя Microsoft Entra. Вам потребуется доступ к шагу позже в процессе.
После добавления роли в учетную запись хранения потребуется несколько минут, чтобы стать активным в Azure. Затем можно создать контекст, необходимый для создания контейнера и отправки файла.
$byosstoragecontext = New-AzStorageContext -StorageAccountName $byosstorageaccount.StorageAccountName -UseConnectedAccount
Используйте следующую команду для хранения идентификатора ресурса учетной записи хранения в переменной с именем byosstorageid
. Значение переменной используется при развертывании определения управляемого приложения.
$byosstorageid = (Get-AzStorageAccount -ResourceGroupName $byosstorageaccount.ResourceGroupName -Name $byosstorageaccount.StorageAccountName).Id
Назначение ролей для учетной записи хранения
Перед развертыванием определения управляемого приложения в учетной записи хранения назначьте роль участника пользователю поставщика ресурсов устройства в области учетной записи хранения. Это назначение позволяет удостоверению записывать файлы определений в контейнер вашей учетной записи хранения.
Для настройки назначения роли можно использовать переменные. В этом примере используется переменная $byosstorageid
, созданная на предыдущем шаге, и создается $arpid
переменная.
$arpid = (Get-AzADServicePrincipal -SearchString "Appliance Resource Provider").Id
New-AzRoleAssignment -ObjectId $arpid -RoleDefinitionName Contributor -Scope $byosstorageid
Поставщик ресурсов устройства — это субъект-служба в клиенте Microsoft Entra. В портал Azure можно проверить, зарегистрировано ли оно, перейдя в приложения Microsoft Entra ID>Enterprise и изменив фильтр поиска на приложения Майкрософт. Найдите Поставщик ресурсов устройства. Если он не найден, зарегистрируйте 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.bicepparam и сохраните его.
Добавьте следующий код в файл параметров и сохраните его. Затем замените <placeholder values>
включаемые угловые скобки (<>
) значениями.
using './deployDefinition.bicep'
param managedApplicationDefinitionName = 'sampleByosManagedApplication'
param definitionStorageResourceID = '<placeholder for you BYOS storage account ID>'
param packageFileUri = '<placeholder for the packageFileUri>'
param principalId = '<placeholder for principalid value>'
param roleId = '<placeholder for roleid value>'
В следующей таблице описываются значения параметров для определения управляемого приложения.
Параметр | Значение |
---|---|
managedApplicationDefinitionName |
Имя определения управляемого приложения. В этом примере используйте sampleByosManagedApplication. |
definitionStorageResourceID |
Идентификатор ресурса для учетной записи хранения, в которой хранится определение. byosstorageid Используйте значение переменной. |
packageFileUri |
Введите универсальный код ресурса (URI) для файла пакета .zip . packageuri Используйте значение переменной. |
principalId |
Идентификатор субъекта-издателя, которому требуются разрешения на управление ресурсами в управляемой группе ресурсов. principalid Используйте значение переменной. |
roleId |
Идентификатор роли для разрешений для управляемой группы ресурсов. Например, владелец, участник, читатель. roleid Используйте значение переменной. |
Чтобы получить значения переменных, выполните следующие действия:
- Azure PowerShell: в PowerShell введите
$variableName
значение переменной. - Azure CLI: в Bash введите
echo $variableName
значение переменной.
Развертывание определения
При развертывании определения управляемого приложения он становится доступным в каталоге служб. Этот процесс не развертывает ресурсы управляемого приложения.
Создайте группу ресурсов с именем byosAppDefinitionGroup и разверните определение управляемого приложения в учетной записи хранения.
New-AzResourceGroup -Name byosAppDefinitionGroup -Location westus
$deployparms = @{
ResourceGroupName = "byosAppDefinitionGroup"
TemplateFile = "deployDefinition.bicep"
TemplateParameterFile = "deployDefinition-parameters.bicepparam"
Name = "deployDefinition"
}
New-AzResourceGroupDeployment @deployparms
Проверка хранилища файлов определений
Во время развертывания свойство шаблона storageAccountId
использует идентификатор ресурса учетной записи хранения и создает контейнер с именем applicationdefinitions
(с учетом регистра). Файлы из ZIP-файла пакета, указанного во время развертывания, хранятся в новом контейнере.
Чтобы убедиться, что файлы определения управляемого приложения хранятся в контейнере учетной записи хранения, можно использовать следующие команды.
Get-AzStorageContainer -Name applicationdefinitions -Context $byosstoragecontext |
Get-AzStorageBlob | Select-Object -Property Name | Format-List
Примечание.
Для повышения безопасности можно создать определение управляемых приложений и сохранить его в большом двоичном объекте учетной записи хранения Azure, где включено шифрование. Содержимое определений шифруется с помощью параметров шифрования учетной записи хранения. Доступ к определению в каталоге служб может получить только пользователи с разрешениями на файл.
Обновление безопасности учетной записи хранения
После успешного развертывания для повышения безопасности учетной записи хранения отключите свойство ключа общего доступа. При создании учетной записи хранения вы добавили назначение роли для участника данных BLOB-объектов хранилища, который предоставляет доступ к контейнеру и BLOB-объектам без использования ключей хранения.
Чтобы просмотреть и обновить параметры общего ключа доступа учетной записи хранения, используйте следующие команды:
(Get-AzStorageAccount -ResourceGroupName $byosstorageaccount.ResourceGroupName -Name $byosstorageaccount.StorageAccountName).AllowSharedKeyAccess
Set-AzStorageAccount -ResourceGroupName $byosstorageaccount.ResourceGroupName -Name $byosstorageaccount.StorageAccountName -AllowSharedKeyAccess $false
Убедитесь, что пользователи могут получить доступ к определению
У вас есть доступ к определению управляемого приложения, но вы хотите, чтобы другие пользователи в вашей организации могли получить к нему доступ. Предоставьте им роль читателя в определении. Они могли наследовать этот уровень доступа из подписки или группы ресурсов. Чтобы проверить, кто имеет доступ к определению и добавить пользователей или группы, перейдите к разделу "Назначение ролей Azure" с помощью портал Azure.
Очистка ресурсов
Если вы собираетесь развернуть определение, перейдите к разделу "Дальнейшие действия ", который ссылается на статью для развертывания определения.
Если вы завершите работу с определением управляемого приложения, можно удалить группы ресурсов, созданные с именем packageStorageGroup, byosDefinitionStorageGroup и byosAppDefinitionGroup.
В командной строке вы убедитесь, что вы хотите удалить группу ресурсов.
Remove-AzResourceGroup -Name packageStorageGroup
Remove-AzResourceGroup -Name byosDefinitionStorageGroup
Remove-AzResourceGroup -Name byosAppDefinitionGroup
Следующие шаги
Вы опубликовали определение управляемого приложения. Теперь можно приступать к развертыванию экземпляра этого определения.