Compartilhar via


Início Rápido: use o seu próprio armazenamento para criar e publicar uma definição de Aplicativo Gerenciado do Azure

Este 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 um aplicativo gerenciado que é armazenado no 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 um aplicativo gerenciado no catálogo de serviços, execute as seguintes tarefas:

  • Crie um modelo do ARM (Azure Resource Manager) que defina os recursos a serem implantados pelo aplicativo gerenciado.
  • Defina os elementos da interface do usuário para o portal ao implantar o aplicativo gerenciado.
  • Crie um pacote .zip que contenha os arquivos JSON necessários.
  • Crie uma conta de armazenamento na qual você armazena a definição de aplicativo gerenciado.
  • Implante a definição de aplicativo gerenciado na sua própria conta de armazenamento para que ela esteja disponível no seu catálogo de serviços.

Se a definição de aplicativo gerenciado for inferior a 120 MB e você não quiser usar sua própria conta de armazenamento, acesse 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 ela deve ser convertida em um modelo do ARM JSON antes de publicar a definição no Azure. Para obter mais informações, vá para 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 catálogo de serviços. Para obter mais informações, vá para 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ê precisará dos seguintes itens:

Criar um modelo do ARM

Cada definição de aplicativo gerenciado contém um arquivo chamado mainTemplate.json. O modelo define os recursos do Azure a serem implantados e não é diferente de um modelo normal do ARM.

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

Adicione o JSON a seguir e salve o arquivo. Ela define os recursos do aplicativo gerenciado para implantar um plano de Serviço de Aplicativo, 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-09-01",
      "name": "[parameters('appServicePlanName')]",
      "location": "[parameters('location')]",
      "sku": {
        "name": "[variables('appServicePlanSku')]",
        "capacity": "[variables('appServicePlanCapacity')]"
      }
    },
    {
      "type": "Microsoft.Web/sites",
      "apiVersion": "2022-09-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')), '2023-01-01').keys[0].value)]"
            }
          ]
        }
      },
      "dependsOn": [
        "[resourceId('Microsoft.Web/serverfarms', parameters('appServicePlanName'))]",
        "[resourceId('Microsoft.Storage/storageAccounts', variables('storageAccountName'))]"
      ]
    },
    {
      "type": "Microsoft.Storage/storageAccounts",
      "apiVersion": "2023-01-01",
      "name": "[variables('storageAccountName')]",
      "location": "[parameters('location')]",
      "sku": {
        "name": "[parameters('storageAccountType')]"
      },
      "kind": "StorageV2",
      "properties": {
        "accessTier": "Hot",
        "allowSharedKeyAccess": false,
        "minimumTlsVersion": "TLS1_2"
      }
    }
  ],
  "outputs": {
    "appServicePlan": {
      "type": "string",
      "value": "[parameters('appServicePlanName')]"
    },
    "appServiceApp": {
      "type": "string",
      "value": "[reference(resourceId('Microsoft.Web/sites', variables('appServiceName')), '2022-09-01').defaultHostName]"
    },
    "storageAccount": {
      "type": "string",
      "value": "[reference(resourceId('Microsoft.Storage/storageAccounts', variables('storageAccountName')), '2023-01-01').primaryEndpoints.blob]"
    }
  }
}

Definir a sua experiência do portal

Como publicador, 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 a entrada para cada parâmetro usando elementos de controle, incluindo menus suspensos e caixas de texto.

Nesse 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 diferenciando maiúsculas de minúsculas e salve-o.

Adicione ao arquivo o código JSON a seguir 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, consulte Introdução a CreateUiDefinition.

Empacote os arquivos

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

Carregue o arquivo app.zip em uma conta de armazenamento do Azure para que você possa usá-la 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 <pkgstorageaccountname>, incluindo os colchetes angulares (<>), pelo nome exclusivo da conta de armazenamento.

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

A variável $pkgstorageparms usa o fracionamento do PowerShell para melhorar a legibilidade dos valores de parâmetro usados no comando para criar um novo armazenamento. O fracionamento é usado em outros comandos do PowerShell que usam vários valores de parâmetro.

Após criar a conta de armazenamento, adicione a atribuição de função Colaborador de Dados de Blob de Armazenamento ao escopo da conta de armazenamento. Atribua o acesso à sua conta de usuário do Microsoft Entra. Dependendo do seu nível de acesso no Azure, talvez você precise de outras permissões atribuídas pelo administrador. Para saber mais, consulte Atribuir uma função do Azure para acesso a dados de blob.

Após adicionar a função à conta de armazenamento, leva alguns minutos para ficar ativa no Azure. Em seguida, você pode criar o contexto necessário para criar o contêiner e carregar o arquivo.

$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

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

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

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

É possível armazenar a definição de aplicativo gerenciado na sua própria conta de armazenamento para que a localização dessa definição e o acesso a ela possam ser gerenciados por você para suas necessidades regulatórias. 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.

Observação

O modelo "traga seu próprio armazenamento" só é compatível com as implantações de modelo do ARM ou da 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.

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

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

Após criar a conta de armazenamento, adicione a atribuição de função Colaborador de Dados de Blob de Armazenamento ao escopo da conta de armazenamento. Atribua o acesso à sua conta de usuário do Microsoft Entra. Você precisa de acesso para uma etapa posterior no processo.

Após adicionar a função à conta de armazenamento, leva alguns minutos para ficar ativa no Azure. Em seguida, você pode criar o contexto necessário para criar o contêiner e carregar o arquivo.

$byosstoragecontext = New-AzStorageContext -StorageAccountName $byosstorageaccount.StorageAccountName -UseConnectedAccount

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

$byosstorageid = (Get-AzStorageAccount -ResourceGroupName $byosstorageaccount.ResourceGroupName -Name $byosstorageaccount.StorageAccountName).Id

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

Antes que sua definição de aplicativo gerenciado possa ser implantada na sua conta de armazenamento, atribua a função Colaborador ao usuário do Provedor de Recursos do Dispositivo 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 $byosstorageid que você criou em uma etapa anterior e cria a variável $arpid.

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

New-AzRoleAssignment -ObjectId $arpid -RoleDefinitionName Contributor -Scope $byosstorageid

O Provedor de Recursos de Dispositivo é uma entidade de serviço no seu locatário do Microsoft Entra. No portal do Azure, você pode verificar se ele está registrado acessando ID do Microsoft Entra>Aplicativos Enterprise e alterar o filtro de pesquisa para Microsoft Applications. Procure Provedor de recursos do dispositivo. Se não for encontrado, registre o provedor de recursos Microsoft.Solutions.

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

A próxima etapa é selecionar um grupo de segurança, um usuário ou um aplicativo para gerenciar os recursos para o cliente. Essa identidade tem permissões no grupo de recursos gerenciados 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 um 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ê usará o valor dessa variável ao implantar a definição de aplicativo gerenciado.

Para criar um novo grupo do Microsoft Entra, acesse Gerenciar grupos do Microsoft Entra e associação de grupo.

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

Em seguida, você precisará da ID de definição de função da função interna do Azure para conceder acesso ao usuário, grupo ou aplicativo. Você usará o valor dessa 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 na 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 do 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, confira 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 com suporte. ReadOnly especifica que o cliente pode ler somente os recursos presentes no grupo de recursos gerenciados. As identidades do publicador que concedem acesso ao grupo de recursos gerenciado são isentas de bloqueio.

Criar o arquivo de parâmetros

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

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

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

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>'

A tabela a seguir descreve os valores de parâmetros para a definição do 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 em que a definição é armazenada. Use o valor da variável byosstorageid.
packageFileUri Insira o URI no 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 da entidade de segurança de publicadores que precisa de permissões para gerenciar recursos no grupo de recursos gerenciados. Use o valor da variável principalid.
roleId ID da 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 seus valores variáveis:

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

Implantar a definição

Quando você implanta a definição de aplicativo gerenciado, ela fica disponível no 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 westus

$deployparms = @{
  ResourceGroupName = "byosAppDefinitionGroup"
  TemplateFile = "deployDefinition.bicep"
  TemplateParameterFile = "deployDefinition-parameters.bicepparam"
  Name = "deployDefinition"
}

New-AzResourceGroupDeployment @deployparms

Verificar o armazenamento de arquivos de definição

Durante a implantação, a propriedade storageAccountId do modelo usa a ID de recurso da sua conta de armazenamento e cria um novo contêiner com o nome applicationdefinitions que diferencia maiúsculas de minúsculas. 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 são salvos no contêiner da sua conta de armazenamento. No comando, substitua o espaço reservado <byosaccountname>, incluindo os colchetes angulares (<>), pelo nome exclusivo da conta de armazenamento.

Get-AzStorageContainer -Name applicationdefinitions -Context $byosstoragecontext |
Get-AzStorageBlob | Select-Object -Property Name | Format-List

Observação

Para aumentar a segurança, você pode criar uma definição de aplicativos gerenciados e armazená-la em um blob de conta de Armazenamento do Azure em que a criptografia está habilitada. O conteúdo da definição é criptografado por meio das opções de criptografia da conta de armazenamento. Somente os usuários com permissões de acesso ao arquivo podem ver a definição em seu catálogo de serviços.

Atualizar a segurança da conta de armazenamento

Após uma implantação bem-sucedida, para melhorar a segurança da conta de armazenamento, desabilite a propriedade da chave de acesso compartilhado. Quando a conta de armazenamento foi criada, você adicionou uma atribuição de função para o Colaborador de Dados de Blobs de Armazenamento que fornece para acessar o contêiner e os blobs sem usar chaves de armazenamento.

Para examinar e atualizar as configurações de chave de acesso compartilhado da conta de armazenamento, use os seguintes comandos:

(Get-AzStorageAccount -ResourceGroupName $byosstorageaccount.ResourceGroupName -Name $byosstorageaccount.StorageAccountName).AllowSharedKeyAccess

Set-AzStorageAccount -ResourceGroupName $byosstorageaccount.ResourceGroupName -Name $byosstorageaccount.StorageAccountName -AllowSharedKeyAccess $false

Verifique se os usuários podem ver sua definição

Você tem acesso à definição de aplicativo gerenciado, mas você deve certificar-se de que outros usuários na sua organização podem acessá-lo. Conceda a eles pelo menos a função de Leitor para a definição. Eles podem ter herdado esse nível de acesso da assinatura ou grupo de recursos. Para verificar quem tem acesso à definição e adicionar usuários ou grupos, confira Atribuir funções do Azure usando o portal do Azure.

Limpar recursos

Se estiver planejando implantar a definição, prossiga para a seção Próximas etapas, que inclui um link para o artigo para implantar a definição.

Se tiver terminado a definição do aplicativo gerenciado, você pode excluir os grupos de recursos que criou com os nomes packageStorageGroup, byosDefinitionStorageGroup e byosAppDefinitionGroup.

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

Remove-AzResourceGroup -Name packageStorageGroup

Remove-AzResourceGroup -Name byosDefinitionStorageGroup

Remove-AzResourceGroup -Name byosAppDefinitionGroup

Próximas etapas

Você publicou a definição de aplicativo gerenciado. Agora, saiba como implantar uma instância dessa definição.