Guia de início rápido: traga seu próprio armazenamento para criar e publicar uma definição de Aplicativo Gerenciado do Azure

Este guia de início rápido fornece uma introdução para trazer seu próprio armazenamento (BYOS) para um Aplicativo Gerenciado do Azure. Você cria e publica uma definição de aplicativo gerenciado em seu catálogo de serviços para membros da sua organização. Quando você usa sua própria conta de armazenamento, sua definição de aplicativo gerenciado pode exceder o limite de 120 MB do catálogo de serviços.

Para publicar uma definição de aplicativo gerenciado em seu catálogo de serviços, execute as seguintes tarefas:

  • Crie um modelo do Azure Resource Manager (modelo ARM) que define os recursos do Azure implantados pelo aplicativo gerenciado.
  • Defina os elementos de interface de utilizador para o portal quando implementar a aplicação gerida.
  • Crie um pacote .zip que contenha os arquivos JSON necessários.
  • Crie uma conta de armazenamento onde você armazena a definição de aplicativo gerenciado.
  • Implante a definição de aplicativo gerenciado em sua própria conta de armazenamento para que ela esteja disponível em seu catálogo de serviços.

Se sua definição de aplicativo gerenciado tiver menos de 120 MB e você não quiser usar sua própria conta de armazenamento, vá para Guia de início rápido: criar e publicar uma definição de aplicativo gerenciado do Azure.

Você pode usar o Bicep para desenvolver uma definição de aplicativo gerenciado, mas ele deve ser convertido em JSON de modelo ARM antes de publicar a definição no Azure. Para obter mais informações, vá para Guia de início rápido: usar o Bicep para criar e publicar uma definição de Aplicativo Gerenciado do Azure.

Você também pode usar o Bicep para implantar uma definição de aplicativo gerenciado do seu catálogo de serviços. Para obter mais informações, vá para Guia de início rápido: usar o Bicep para implantar uma definição de Aplicativo Gerenciado do Azure.

Pré-requisitos

Para concluir este início rápido, você precisa dos seguintes itens:

  • Uma conta do Azure com uma assinatura ativa e permissões para recursos do Microsoft Entra, como usuários, grupos ou entidades de serviço. Se você não tiver uma conta, crie uma conta gratuita antes de começar.
  • Código do Visual Studio com a extensão mais recente das Ferramentas do Azure Resource Manager. Para arquivos Bicep, instale a extensão Bicep para Visual Studio Code.
  • Instale a versão mais recente do Azure PowerShell ou da CLI do Azure.

Criar o modelo ARM

Cada definição de aplicação gerida inclui um ficheiro denominado mainTemplate.json. O modelo define os recursos do Azure a serem implantados e não é diferente de um modelo ARM normal.

Abra o Visual Studio Code, crie um arquivo com o nome mainTemplate.json que diferencia maiúsculas de minúsculas e salve-o.

Adicione o JSON a seguir e salve o arquivo. Ele define os recursos do aplicativo gerenciado para implantar um Serviço de Aplicativo, um plano do Serviço de Aplicativo e uma conta de armazenamento.

{
  "$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]"
    }
  }
}

Defina a sua experiência no portal

Como editor, você define a experiência do portal para criar o aplicativo gerenciado. O arquivo createUiDefinition.json gera a interface do usuário do portal. Você define como os usuários fornecem entrada para cada parâmetro usando elementos de controle, como menus suspensos e caixas de texto.

Neste exemplo, a interface do usuário solicita que você insira o prefixo do nome do Serviço de Aplicativo, o nome do plano do Serviço de Aplicativo, o prefixo da conta de armazenamento e o tipo de conta de armazenamento. Durante a implantação, as variáveis em mainTemplate.json usam a uniqueString função para acrescentar uma cadeia de caracteres de 13 caracteres aos prefixos de nome para que os nomes sejam globalmente exclusivos no Azure.

Abra o Visual Studio Code, crie um arquivo com o nome createUiDefinition.json que diferencia maiúsculas de minúsculas e salve-o.

Adicione o seguinte código JSON ao arquivo e salve-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, vá para Introdução a CreateUiDefinition.

Empacote os ficheiros

Adicione os dois arquivos a um arquivo de pacote chamado app.zip. Os dois arquivos devem estar no nível raiz do arquivo .zip . Se os arquivos estiverem em uma pasta, quando você criar a definição de aplicativo gerenciado, receberá um erro informando que os arquivos necessários não estão presentes.

Carregue app.zip em uma conta de armazenamento do Azure para que você possa usá-lo ao implantar a definição do aplicativo gerenciado. O nome da conta de armazenamento deve ser globalmente exclusivo no Azure e o comprimento deve ser de 3 a 24 caracteres com apenas letras minúsculas e números. No comando, substitua o espaço reservado <demostorageaccount> , incluindo os colchetes angulares (<>), pelo nome exclusivo da conta de armazenamento.

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

Use o comando a seguir para armazenar o URI do arquivo de pacote em uma variável chamada packageuri. Você usa o valor da variável ao implantar a definição de aplicativo gerenciado.

$packageuri=(Get-AzStorageBlob -Container appcontainer -Blob app.zip -Context $ctx).ICloudBlob.StorageUri.PrimaryUri.AbsoluteUri

Traga seu próprio armazenamento para a definição de aplicativo gerenciado

Você armazena sua definição de aplicativo gerenciado em sua própria conta de armazenamento para que sua localização e acesso possam ser gerenciados por você para as necessidades regulatórias da sua organização. Usar sua própria conta de armazenamento permite que você tenha um aplicativo que exceda o limite de 120 MB para a definição de aplicativo gerenciado de um catálogo de serviços.

Nota

Traga seu próprio armazenamento só é suportado com implantações de modelo ARM ou API REST da definição de aplicativo gerenciado.

Criar a conta de armazenamento

Crie a conta de armazenamento para sua definição de aplicativo gerenciado. O nome da conta de armazenamento deve ser globalmente exclusivo no Azure e o comprimento deve ser de 3 a 24 caracteres com apenas letras minúsculas e números.

Este exemplo cria um novo grupo de recursos chamado byosDefinitionStorageGroup. No comando, substitua o espaço reservado <definitionstorage> , incluindo os colchetes angulares (<>), pelo nome exclusivo da conta de armazenamento.

New-AzResourceGroup -Name byosDefinitionStorageGroup -Location westus3

New-AzStorageAccount `
  -ResourceGroupName byosDefinitionStorageGroup `
  -Name "<definitionstorage>" `
  -Location westus3 `
  -SkuName Standard_LRS `
  -Kind StorageV2

Use o comando a seguir para armazenar o ID de recurso da conta de armazenamento em uma variável chamada storageid. Você usa o valor da variável ao implantar a definição de aplicativo gerenciado.

$storageid = (Get-AzStorageAccount -ResourceGroupName byosDefinitionStorageGroup -Name <definitionstorage>).Id

Definir a atribuição de função para sua conta de armazenamento

Antes de implantar sua definição de aplicativo gerenciado em sua conta de armazenamento, atribua a função de Colaborador ao usuário do Provedor de Recursos do Appliance no escopo da conta de armazenamento. Essa atribuição permite que a identidade grave arquivos de definição no contêiner da sua conta de armazenamento.

Você pode usar variáveis para configurar a atribuição de função. Este exemplo usa a variável criada na etapa anterior e cria a $storageid$arpid variável.

$arpid = (Get-AzADServicePrincipal -SearchString "Appliance Resource Provider").Id

New-AzRoleAssignment -ObjectId $arpid `
-RoleDefinitionName Contributor `
-Scope $storageid

O Appliance Resource Provider é uma entidade de serviço no seu locatário do Microsoft Entra. No portal do Azure, você pode verificar se ele está registrado acessando os aplicativos Microsoft Entra ID>Enterprise e altere o filtro de pesquisa para Aplicativos da Microsoft. Pesquise por Appliance Resource Provider. Se não for encontrado, registre o provedor de Microsoft.Solutions recursos.

Obter ID de grupo e ID de definição de função

A próxima etapa é selecionar um usuário, grupo de segurança ou aplicativo para gerenciar os recursos para o cliente. Essa identidade tem permissões no grupo de recursos gerenciado de acordo com a função atribuída. A função pode ser qualquer função interna do Azure, como Proprietário ou Colaborador.

Este exemplo usa um grupo de segurança e sua conta do Microsoft Entra deve ser membro do grupo. Para obter a ID do objeto do grupo, substitua o espaço reservado <managedAppDemo> , incluindo os colchetes angulares (<>), pelo nome do grupo. Você usa o valor da variável ao implantar a definição de aplicativo gerenciado.

Para criar um novo grupo do Microsoft Entra, vá para Gerenciar grupos do Microsoft Entra e associação ao grupo.

$principalid=(Get-AzADGroup -DisplayName <managedAppDemo>).Id

Em seguida, obtenha a ID de definição de função da função interna do Azure que você deseja conceder acesso ao usuário, grupo ou aplicativo. Você usa o valor da variável ao implantar a definição de aplicativo gerenciado.

$roleid=(Get-AzRoleDefinition -Name Owner).Id

Criar o modelo de implantação de definição

Use um arquivo Bicep para implantar a definição de aplicativo gerenciado em seu catálogo de serviços. Após a implantação, os arquivos de definição são armazenados em sua própria conta de armazenamento.

Abra o Visual Studio Code, crie um arquivo com o nome deployDefinition.bicep e salve-o.

Adicione o seguinte código Bicep e salve o arquivo.

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
      }
    ]
  }
}

Para obter mais informações sobre as propriedades do modelo, vá para Microsoft.Solutions/applicationDefinitions.

O lockLevel no grupo de recursos gerenciados impede que o cliente execute operações indesejáveis nesse 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 gerenciados. As identidades de editor às quais é concedido acesso ao grupo de recursos gerenciados são isentas do nível de bloqueio.

Criar o ficheiro de parâmetros

O modelo de implantação da definição de aplicativo gerenciado precisa de entrada para vários parâmetros. O comando deployment solicita os valores ou você pode criar um arquivo de parâmetro para os valores. Neste exemplo, usamos um arquivo de parâmetro para passar os valores de parâmetro para o comando deployment.

No Visual Studio Code, crie um novo arquivo chamado deployDefinition.parameters.json e salve-o.

Adicione o seguinte ao seu arquivo de parâmetros e salve-o. Em seguida, substitua os <placeholder values> colchetes angulares (<>), pelos seus valores.

{
  "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentParameters.json#",
  "contentVersion": "1.0.0.0",
  "parameters": {
    "managedApplicationDefinitionName": {
      "value": "<placeholder for managed application name>"
    },
    "definitionStorageResourceID": {
      "value": "<placeholder for you storage account ID>"
    },
    "packageFileUri": {
      "value": "<placeholder for the packageFileUri>"
    },
    "principalId": {
      "value": "<placeholder for principalid value>"
    },
    "roleId": {
      "value": "<placeholder for roleid value>"
    }
  }
}

A tabela a seguir descreve os valores de parâmetro para a definição de aplicativo gerenciado.

Parâmetro Valor
managedApplicationDefinitionName Nome da definição de aplicativo gerenciado. Para este exemplo, use sampleByosManagedApplication.
definitionStorageResourceID ID do recurso para a conta de armazenamento onde a definição está armazenada. Use o valor da variável storageid .
packageFileUri Insira o URI do arquivo de pacote .zip . Use o valor da variável packageuri . O formato é https://yourStorageAccountName.blob.core.windows.net/appcontainer/app.zip.
principalId A ID Principal dos editores que precisa de permissões para gerenciar recursos no grupo de recursos gerenciados. Use o valor da variável principalid .
roleId ID de função para permissões para o grupo de recursos gerenciados. Por exemplo, Proprietário, Colaborador, Leitor. Use o valor da variável roleid .

Para obter os valores das variáveis:

  • Azure PowerShell: no PowerShell, digite $variableName para exibir o valor de uma variável.
  • CLI do Azure: em Bash, digite echo $variableName para exibir o valor de uma variável.

Implantar a definição

Quando você implanta a definição do aplicativo gerenciado, ele fica disponível em seu catálogo de serviços. Esse processo não implanta os recursos do aplicativo gerenciado.

Crie um grupo de recursos chamado byosAppDefinitionGroup e implante a definição de aplicativo gerenciado em sua conta de armazenamento.

New-AzResourceGroup -Name byosAppDefinitionGroup -Location westus3

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

Verificar o armazenamento de arquivos de definição

Durante a implantação, a propriedade do modelo usa o ID de recurso da sua conta de armazenamento e cria um novo contêiner com o nome applicationdefinitionsque diferencia maiúsculas de minúsculasstorageAccountId. Os arquivos do pacote .zip especificado durante a implantação são armazenados no novo contêiner.

Você pode usar os comandos a seguir para verificar se os arquivos de definição de aplicativo gerenciado estão salvos no contêiner da sua conta de armazenamento. No comando, substitua o espaço reservado <definitionstorage> , incluindo os colchetes angulares (<>), pelo nome exclusivo da conta de armazenamento.

Get-AzStorageAccount -ResourceGroupName byosDefinitionStorageGroup -Name <definitionstorage> |
Get-AzStorageContainer -Name applicationdefinitions |
Get-AzStorageBlob | Select-Object -Property Name | Format-List

Nota

Para maior segurança, você pode criar uma definição de aplicativos gerenciados e armazená-la em um blob de conta de armazenamento do Azure onde a criptografia está habilitada. O conteúdo da definição é criptografado através das opções de criptografia da conta de armazenamento. Somente usuários com permissões para o arquivo podem acessar a definição em seu catálogo de serviços.

Verifique se os usuários podem acessar sua 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 usuários ou grupos, vá para Atribuir funções do Azure usando o portal do Azure.

Clean up resources (Limpar recursos)

Se você vai implantar a definição, continue com a seção Próximas etapas que vincula ao artigo para implantar a definição.

Se você tiver terminado com a definição de aplicativo gerenciado, poderá excluir os grupos de recursos criados chamados packageStorageGroup, byosDefinitionStorageGroup e byosAppDefinitionGroup.

O comando solicita que você confirme que deseja remover o grupo de recursos.

Remove-AzResourceGroup -Name packageStorageGroup

Remove-AzResourceGroup -Name byosAppDefinitionGroup

Remove-AzResourceGroup -Name byosDefinitionStorageGroup

Próximos passos

Publicou a definição da aplicação gerida. Agora, saiba como implementar uma instância dessa definição.