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:

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: o lockLevel 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.