Tutorial: criar um aplicativo gerenciado com ações e recursos personalizados

Neste tutorial, você cria seu próprio aplicativo gerenciado com ações e recursos personalizados. O aplicativo gerenciado conterá uma ação personalizada na página de Overview, um tipo de recurso personalizado exibido como um item de menu separado em Table of Content e uma ação de contexto personalizada na página de recursos personalizados.

Este tutorial inclui as seguintes etapas:

  • Criar um arquivo de definição da interface do usuário para criar uma instância de aplicativo gerenciado
  • Criar um modelo de implantação com o Provedor Personalizado do Azure, uma conta de armazenamento do Azure e uma função do Azure
  • Criar artefato de definição de exibição com ações e recursos personalizados
  • Implantar uma definição de aplicativo gerenciado
  • Implantar uma instância do aplicativo gerenciado
  • Executar ações personalizadas e criar recursos personalizados

Pré-requisitos

Para concluir este tutorial, você precisará saber:

Definição da interface do usuário

Neste tutorial, você criará um aplicativo gerenciado e o grupo de recursos gerenciados dele conterá a instância do provedor personalizado, a conta de armazenamento e a função. A função do Azure usada neste exemplo implementa uma API que trata operações de provedor personalizadas para ações e recursos. A conta de armazenamento do Azure é usada como armazenamento básico para os recursos do provedor personalizado.

A definição da interface do usuário para criar uma instância de aplicativo gerenciado inclui os elementos de entrada funcname e storagename. O nome da conta de armazenamento e o nome da função devem ser globalmente exclusivos. Por padrão, os arquivos de função serão implantados do pacote de funções de amostra. No entanto, é possível alterar isso adicionando um elemento de entrada a um link de pacote em createUiDefinition.json:

{
  "name": "funcname",
  "type": "Microsoft.Common.TextBox",
  "label": "Name of the function to be created",
  "toolTip": "Name of the function to be created",
  "visible": true,
  "constraints": {
    "required": true
  }
},
{
  "name": "storagename",
  "type": "Microsoft.Common.TextBox",
  "label": "Name of the storage to be created",
  "toolTip": "Name of the storage to be created",
  "visible": true,
  "constraints": {
    "required": true
  }
},
{
  "name": "zipFileBlobUri",
  "type": "Microsoft.Common.TextBox",
  "defaultValue": "https://github.com/Azure/azure-quickstart-templates/tree/master/quickstarts/microsoft.customproviders/custom-rp-with-function/artifacts/functionzip/functionpackage.zip",
  "label": "The Uri to the uploaded function zip file",
  "toolTip": "The Uri to the uploaded function zip file",
  "visible": true
}

e uma saída em createUiDefinition.json:

  "funcname": "[steps('applicationSettings').funcname]",
  "storageName": "[steps('applicationSettings').storagename]",
  "zipFileBlobUri": "[steps('applicationSettings').zipFileBlobUri]"

a amostra createUiDefinition.json completa pode ser encontrada em Referência: artefatos de elementos da interface do usuário.

Modelo com provedor personalizado

Para criar uma instância de aplicativo gerenciado com provedor personalizado, você precisa definir um recurso de provedor personalizado com nome público e digitar Microsoft.CustomProviders/resourceProviders em seu mainTemplate.json. Nesse recurso, você define os tipos de recursos e as ações para o serviço. Para implantar instâncias da função do Azure e da conta de armazenamento do Azure, defina recursos do tipo Microsoft.Web/sites e Microsoft.Storage/storageAccounts, respectivamente.

Neste tutorial, você criará um tipo de recurso users, a ação personalizada ping e a ação personalizada users/contextAction que será executada no contexto de um recurso personalizado users. Para cada tipo de recurso e ação, forneça um ponto de extremidade que aponte para a função com o nome fornecido em createUiDefinition.json. Especifique o routingType como Proxy,Cache para os tipos de recurso e como Proxy para ações:

{
  "apiVersion": "[variables('customrpApiversion')]",
  "type": "Microsoft.CustomProviders/resourceProviders",
  "name": "[variables('customProviderName')]",
  "location": "[parameters('location')]",
  "properties": {
    "actions": [
      {
        "name": "ping",
        "routingType": "Proxy",
        "endpoint": "[listSecrets(resourceId('Microsoft.Web/sites/functions', parameters('funcname'), 'HttpTrigger1'), '2018-02-01').trigger_url]"
      },
      {
        "name": "users/contextAction",
        "routingType": "Proxy",
        "endpoint": "[listSecrets(resourceId('Microsoft.Web/sites/functions', parameters('funcname'), 'HttpTrigger1'), '2018-02-01').trigger_url]"
      }
    ],
    "resourceTypes": [
      {
        "name": "users",
        "routingType": "Proxy,Cache",
        "endpoint": "[listSecrets(resourceId('Microsoft.Web/sites/functions', parameters('funcname'), 'HttpTrigger1'), '2018-02-01').trigger_url]"
      }
    ]
  },
  "dependsOn": [
    "[concat('Microsoft.Web/sites/',parameters('funcname'))]"
  ]
}

A amostra mainTemplate.json completa pode ser encontrada na Referência: artefato do modelo de implantação.

Exibir artefato de definição

Para definir a interface do usuário que inclui ações personalizadas e recursos personalizados em seu aplicativo gerenciado, você precisa criar o artefato viewDefinition.json. Para obter mais informações sobre o artefato de definição de exibição, consulte Exibir artefato de definição em Aplicativos Gerenciados do Azure.

Neste tutorial, você definirá:

  • Uma página de Visão geral com botão de barra de ferramentas que representa uma ação personalizada TestAction com entrada de texto básico.
  • Uma página de Usuários que representa um tipo de recurso personalizado users.
  • Uma ação de recurso personalizada users/contextAction na página de Usuários que será executada no contexto de recurso personalizado do tipo users.

O exemplo a seguir mostra a configuração de exibição para uma página de "Visão geral":

{
    "kind": "Overview",
    "properties": {
      "header": "Welcome to your Demo Azure Managed Application",
      "description": "This Managed application with Custom Provider is for demo purposes only.",
      "commands": [{
          "displayName": "Ping Action",
          "path": "/customping",
          "icon": "LaunchCurrent"
      }]
    }
  }

O exemplo abaixo inclui a configuração da página de recursos de "Usuários" com ação de recurso personalizado:

{
    "kind": "CustomResources",
    "properties": {
      "displayName": "Users",
      "version": "1.0.0.0",
      "resourceType": "users",
      "createUIDefinition": {
      },
      "commands": [{
        "displayName": "Custom Context Action",
        "path": "users/contextAction",
        "icon": "Start"
      }],
      "columns": [
        { "key": "properties.FullName", "displayName": "Full Name" },
        { "key": "properties.Location", "displayName": "Location", "optional": true }
      ]
    }
  }

A amostra viewDefinition.json completa pode ser encontrada na Referência: exibir artefato de definição.

Definição do aplicativo gerenciado

Empacote os seguintes artefatos de aplicativo gerenciado em um arquivo morto zip e carregue-o no armazenamento:

  • createUiDefinition.json
  • mainTemplate.json
  • viewDefinition.json

Todos os arquivos devem estar no nível da raiz. O pacote com artefatos pode ser armazenado em qualquer armazenamento, por exemplo, blob do GitHub ou blob da conta de armazenamento do Azure. Eis um script para carregar o pacote de aplicativos na conta de armazenamento:

$resourceGroup="appResourcesGroup"
$storageName="mystorageaccount$RANDOM"

# Sign in to your Azure subscription
Connect-AzAccount
# Create resource group for managed application definition and application package
New-AzResourceGroup -Name $resourceGroup -Location eastus

# Create storage account for a package with application artifacts
$storageAccount=New-AzStorageAccount `
  -ResourceGroupName $resourceGroup `
  -Name $storageName `
  -SkuName Standard_LRS `
  -Location eastus `
$ctx=$storageAccount.Context

# Create storage container and upload zip to blob
New-AzStorageContainer -Name appcontainer -Context $ctx -Permission blob
Set-AzStorageBlobContent `
  -File "path_to_your_zip_package" `
  -Container appcontainer `
  -Blob app.zip `
  -Context $ctx

# Get blob absolute uri
$blobUri=(Get-AzureStorageBlob -Container appcontainer -Blob app.zip -Context $ctx).ICloudBlob.uri.AbsoluteUri

Execute o script da CLI do Azure abaixo ou siga as etapas no portal do Azure para implantar uma definição de aplicativo gerenciado do catálogo de serviços:

Para executar esta amostra, instale a última versão da CLI do Azure. Para iniciar, execute az login para criar uma conexão com o Azure.

As amostras da CLI do Azure são escritas para o shell bash. Para executar esta amostra no prompt de comando ou no Windows PowerShell, talvez você precise alterar os elementos do script.

resourceGroup="appResourcesGroup"
# Select subscription and create resource group (if you have not created yet)
az account set --subscription <subscriptionID>
az group create --name $resourceGroup --location eastus

# Get object ID of your identity
userid=$(az ad user list --upn example@contoso.org --query [0].id --output tsv)
# Get role definition ID for the Owner role
roleid=$(az role definition list --name Owner --query [].name --output tsv)

# Create managed application definition resource
az managedapp definition create \
  --name "ManagedUsersAppDefinition" \
  --location "eastus" \
  --resource-group $resourceGroup \
  --lock-level ReadOnly \
  --display-name "Managed users app definition" \
  --description "Managed application with Azure Custom Provider" \
  --authorizations "$userid:$roleid" \
  --package-file-uri "path to your app.zip package"

Instância do aplicativo gerenciado

Quando a definição do aplicativo gerenciado for implantada, execute o script abaixo ou siga as etapas no portal do Azure para implantar a instância do seu aplicativo gerenciado com provedor personalizado:

appResourcesGroup="appResourcesGroup"
applicationGroup="usersApplicationGroup"

# Create resource group for managed application instance
az group create --name $applicationGroup --location eastus

# Get ID of managed application definition
appid=$(az managedapp definition show --name ManagedUsersAppDefinition --resource-group $appResourcesGroup --query id --output tsv)

# Create the managed application
az managedapp create \
  --name ManagedUsersApp \
  --location "eastus" \
  --kind "Servicecatalog" \
  --resource-group $applicationGroup \
  --managedapp-definition-id $appid \
  --managed-rg-id "managedResourcesGroup" \
  --parameters "{\"funcname\": {\"value\": \"managedusersappfunction\"}, \"storageName\": {\"value\": \"managedusersappstorage\"}}"

Ações e recursos personalizados

Depois que a instância do aplicativo do catálogo de serviços tiver sido implantada, você terá dois novos grupos de recursos. O primeiro grupo de recursos, applicationGroup, contém uma instância do aplicativo gerenciado; o segundo grupo de recursos, managedResourceGroup, mantém os recursos do aplicativo gerenciado, incluindo o provedor personalizado.

Application resource groups

Você pode ir para a instância do aplicativo gerenciado e executar a ação personalizada na página de "Visão geral", criar o recurso personalizado usuários na página de "Usuários" e executar a ação de contexto personalizado no recurso personalizado.

  • Vá para a página de "Visão geral" e clique no botão "Ação de ping":

Perform custom action

  • Vá para a página de "Usuários" e clique no botão "Adicionar". Forneça entradas para criar um recurso e enviar o formulário:

Screenshot shows the Add button selected from Users.

  • Vá para a página de "Usuários", selecione um recurso "usuários" e clique em "Ação de contexto personalizado":

Screenshot shows Custom Context Action selected.

Limpar os recursos

Nas etapas anteriores, você criou os recursos do Azure em um grupo de recursos. Se você não espera precisar desses recursos no futuro, poderá excluí-los ao excluir o grupo de recursos.

No menu do portal do Azure ou na Página inicial, selecione Grupos de recursos. Em seguida, na página Grupos de recursos, selecione myResourceGroup.

Na página myResourceGroup, certifique-se de que os recursos listados são aqueles que deseja excluir.

Selecione Excluir grupo de recursos, digite myResourceGroup na caixa de texto para confirmar e selecione Excluir.

Procurando ajuda

Se tiver dúvidas sobre os Aplicativos Gerenciados do Azure, tente perguntar no Stack Overflow com a marca azure-managed-app ou no Microsoft Q&A com a marca azure-managed-application. Uma pergunta semelhante pode já ter sido feita e respondida. Portanto, verifique primeiro antes de postar. Use as respectivas marcas para ter uma resposta mais rápida.

Próximas etapas

Para publicar o aplicativo gerenciado no Azure Marketplace, veja Aplicativos Gerenciados do Azure no Marketplace.

Saiba mais sobre os Provedores Personalizados do Azure.