Início Rápido: Criar e publicar uma definição da Aplicação Gerida do Azure
Este início rápido fornece uma introdução ao trabalho com as Aplicações Geridas do Azure. Cria e publica uma definição de aplicação gerida armazenada no catálogo de serviços e destina-se a membros da sua organização.
Para publicar uma aplicação gerida no seu catálogo de serviços, efetue as seguintes tarefas:
- Crie um modelo do Azure Resource Manager (modelo arm) que defina os recursos a implementar com a aplicação gerida.
- Defina os elementos de interface de utilizador para o portal quando implementar a aplicação gerida.
- Crie um pacote de.zip que contenha os ficheiros JSON necessários. O ficheiro de pacote .zip tem um limite de 120 MB para a definição de aplicação gerida de um catálogo de serviços.
- Publique a definição da aplicação gerida para que fique disponível no catálogo de serviços.
Se a definição da aplicação gerida for superior a 120 MB ou se quiser utilizar a sua própria conta de armazenamento por motivos de conformidade da sua organização, aceda a Início Rápido: Traga o seu próprio armazenamento para criar e publicar uma definição de Aplicação Gerida do Azure.
Nota
Pode utilizar o Bicep para desenvolver uma definição de aplicação gerida, mas esta tem de ser convertida em JSON de modelo do ARM antes de poder publicar a definição no Azure. Para converter o Bicep em JSON, utilize o comando de compilação Bicep. Depois de o ficheiro ser convertido em JSON, é recomendado verificar a precisão do código.
Os ficheiros bicep podem ser utilizados para implementar uma definição de aplicação gerida existente.
Pré-requisitos
Para concluir este início rápido, precisa dos seguintes itens:
- Uma conta do Azure com uma subscrição ativa e permissões para recursos do Azure Active Directory, como utilizadores, grupos ou principais de serviço. Se não tiver uma conta, crie uma conta gratuita antes de começar.
- Visual Studio Code com a extensão mais recente do Azure Resource Manager Tools. Para ficheiros Bicep, instale a extensão Bicep para o Visual Studio Code.
- Instale a versão mais recente do Azure PowerShell ou da CLI do Azure.
Criar um modelo do ARM
Cada definição de aplicação gerida inclui um ficheiro denominado mainTemplate.json. O modelo define os recursos do Azure a implementar e não é diferente de um modelo do ARM normal.
Abra o Visual Studio Code, crie um ficheiro com o nome sensível a maiúsculas e minúsculas mainTemplate.json e guarde-o .
Adicione o seguinte JSON e guarde o ficheiro. Define os recursos para implementar uma conta de armazenamento Serviço de Aplicações, Serviço de Aplicações e de armazenamento para a aplicação. Esta conta de armazenamento não é utilizada para armazenar a definição de aplicação gerida.
{
"$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]"
}
}
}
Definir a experiência do portal
Enquanto publicador, define a experiência do portal para criar a aplicação gerida. O ficheiro createUiDefinition.json gera a interface de utilizador do portal. Define a forma como os utilizadores fornecem entradas para cada parâmetro através de elementos de controlo , como listas pendentes e caixas de texto.
Abra o Visual Studio Code, crie um ficheiro com o nome sensível a maiúsculas e minúsculas createUiDefinition.json e guarde-o. A interface de utilizador permite que o utilizador introduza o prefixo de nome Serviço de Aplicações, Serviço de Aplicações nome do plano, o prefixo da conta de armazenamento e o tipo de conta de armazenamento. Durante a implementação, as variáveis em mainTemplate.json utilizam a uniqueString
função para acrescentar uma cadeia de 13 carateres aos prefixos de nome para que os nomes sejam globalmente exclusivos em todo o Azure.
Adicione o seguinte JSON ao ficheiro e guarde-o.
{
"$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]"
}
}
}
Para saber mais, veja Introdução a CreateUiDefinition.
Empacote os ficheiros
Adicione os dois ficheiros a um ficheiro de pacote com o nome app.zip. Os dois ficheiros têm de estar ao nível da raiz do ficheiro .zip . Se os ficheiros estiverem numa pasta, quando cria a definição da aplicação gerida, recebe um erro que indica que os ficheiros necessários não estão presentes.
Carregue app.zip para uma conta de armazenamento do Azure para que possa utilizá-la quando implementar a definição da aplicação gerida. O nome da conta de armazenamento tem de ser globalmente exclusivo em todo o Azure e o comprimento tem de ser de 3 a 24 carateres com apenas letras minúsculas e números. No comando, substitua o marcador <demostorageaccount>
de posição, incluindo os parênteses angulares (<>
), pelo nome exclusivo da conta de armazenamento.
No Visual Studio Code, abra um novo terminal do PowerShell e inicie sessão na sua subscrição do Azure.
Connect-AzAccount
O comando abre o browser predefinido e pede-lhe para iniciar sessão no Azure. Para obter mais informações, aceda a Iniciar sessão com 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
Criar a definição da aplicação gerida
Nesta secção, irá obter informações de identidade do Azure Active Directory, criar um grupo de recursos e implementar a definição de aplicação gerida.
Obter ID de grupo e ID de definição de função
O próximo passo é selecionar um utilizador, grupo de segurança ou aplicação para gerir os recursos do cliente. Esta identidade tem permissões no grupo de recursos gerido de acordo com a função atribuída. A função pode ser qualquer função incorporada do Azure, como Proprietário ou Contribuidor.
Este exemplo utiliza um grupo de segurança e a sua conta do Azure Active Directory deve ser um membro do grupo. Para obter o ID de objeto do grupo, substitua o marcador <managedAppDemo>
de posição, incluindo os parênteses angulares (<>
), pelo nome do grupo. Utilize o valor desta variável quando implementar a definição da aplicação gerida.
Para criar um novo grupo do Azure Active Directory, aceda a Gerir grupos do Azure Active Directory e associação a grupos.
$principalid=(Get-AzADGroup -DisplayName <managedAppDemo>).Id
Em seguida, obtenha o ID de definição de função da função incorporada do Azure que pretende conceder acesso ao utilizador, grupo ou aplicação. Utilize o valor desta variável quando implementar a definição da aplicação gerida.
$roleid=(Get-AzRoleDefinition -Name Owner).Id
Publicar a definição da aplicação gerida
Crie um grupo de recursos para a definição da aplicação gerida.
New-AzResourceGroup -Name appDefinitionGroup -Location westus3
O blob
comando cria uma variável para armazenar o URL do pacote .zip ficheiro. Essa variável é utilizada no comando que cria a definição da aplicação gerida.
$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
Após a conclusão do comando, terá uma definição de aplicação gerida no seu grupo de recursos.
Alguns dos parâmetros utilizados no exemplo anterior são:
ResourceGroupName
: o nome do grupo de recursos onde a definição da aplicação gerida é criada.LockLevel
: olockLevel
no grupo de recursos gerido impede o cliente de realizar operações indesejáveis neste grupo de recursos. Atualmente,ReadOnly
é o único nível de bloqueio suportado.ReadOnly
especifica que o cliente só pode ler os recursos presentes no grupo de recursos gerido. As identidades do publicador que têm acesso ao grupo de recursos gerido estão isentas do nível de bloqueio.Authorization
: descreve o ID do principal e o ID de definição de função que são utilizados para conceder permissão ao grupo de recursos gerido."${principalid}:$roleid"
ou pode utilizar chavetas para cada variável"${principalid}:${roleid}"
.- Utilize uma vírgula para separar vários valores:
"${principalid1}:$roleid1", "${principalid2}:$roleid2"
.
PackageFileUri
: a localização de um ficheiro de pacote .zip que contém os ficheiros necessários.
Confirmar que os utilizadores podem ver a definição
Tem acesso à definição de aplicação gerida, mas deve verificar se outros utilizadores na sua organização podem aceder à mesma. Conceda-lhes, pelo menos, a função de Leitor na definição. Estes podem ter herdado este nível de acesso através da subscrição ou do grupo de recursos. Para verificar quem tem acesso à definição e adicionar utilizadores ou grupos, veja Atribuir funções do Azure com o portal do Azure.
Passos seguintes
Publicou a definição da aplicação gerida. O próximo passo é saber como implementar uma instância dessa definição.