Resolver erros de recurso não encontrado

Este artigo descreve os erros com que você pode ver quando um recurso não é encontrado durante uma operação. Normalmente, você vê esse erro ao implantar recursos com um arquivo Bicep ou um modelo do ARM (Azure Resource Manager). Você também verá esse erro quando realizar tarefas de gerenciamento e o Azure Resource Manager não conseguir localizar o recurso necessário. Por exemplo, se tentar adicionar marcas a um recurso que não existe, você receberá esse erro.

Sintoma

Há dois códigos de erro que indicam que o recurso não foi encontrado. O erro NotFound retorna um resultado semelhante a:

Code=NotFound;
Message=Cannot find ServerFarm with name exampleplan.

O erro ResourceNotFound retorna um resultado semelhante a:

Code=ResourceNotFound;
Message=The Resource 'Microsoft.Storage/storageAccounts/{storage name}' under resource
group {resource group name} was not found.

Causa

O Resource Manager precisa recuperar as propriedades de um recurso, mas não consegue identificar o recurso em suas assinaturas.

Solução 1 - verificar as propriedades do recurso

Quando você receber esse erro durante uma tarefa de gerenciamento, verifique os valores fornecidos para o recurso. Os três valores a serem verificados são:

  • Nome do recurso
  • Nome do grupo de recursos
  • Subscription

Se você estiver usando o PowerShell ou a CLI do Azure, verifique se está executando os comandos na assinatura que contém o recurso. Você pode alterar a assinatura com Set-AzContext ou az account set. Muitos comandos fornecem um parâmetro de assinatura que permite especificar uma assinatura diferente do contexto atual.

Se você não puder verificar as propriedades, entre no portal do Microsoft Azure. Localize o recurso que você está tentando usar e examine o nome do recurso, o grupo de recursos e a assinatura.

Solução 2 - definir dependências

Se você receber esse erro ao implantar um modelo, talvez seja necessário adicionar uma dependência. O Resource Manager otimiza as implantações criando recursos em paralelo, quando possível.

Por exemplo, ao implantar um aplicativo Web, o plano do Serviço de Aplicativo deve existir. Se você não tiver especificado que o aplicativo Web depende do plano do Serviço de Aplicativo, o Gerenciador de Recursos criará os dois recursos ao mesmo tempo. O aplicativo Web falha com um erro de que o recurso de Plano do Serviço de Aplicativo não pode ser encontrado porque ele ainda não existe. Você evita esse erro configurando a dependência no aplicativo Web.

Use uma dependência implícita em vez da função resourceId. A dependência é criada usando o nome simbólico e a propriedade ID de um recurso.

Por exemplo, a propriedade serverFarmId do aplicativo Web usa servicePlan.id para criar uma dependência no Plano do Serviço de Aplicativo.

resource webApp 'Microsoft.Web/sites@2021-02-01' = {
  properties: {
    serverFarmId: servicePlan.id
  }
}

resource servicePlan 'Microsoft.Web/serverfarms@2021-02-01' = {
  name: hostingPlanName
  ...

Para a maioria das implantações, não é necessário usar dependsOn para criar uma dependsOn.

Evite definir dependências desnecessárias. Dependências desnecessárias prolongam a duração da implantação porque os recursos não são implantados em paralelo. Além disso, você pode criar dependências circulares que bloqueiam a implantação.

Ordem de implantação

Quando você vir os problemas de dependência, você precisa obter informações sobre a ordem de implantação de recursos. Você pode usar o portal para exibir a ordem das operações de implantação:

  1. Entre no portal.

  2. Na Visão Geral do grupo de recursos, selecione o link para o histórico de implantação.

    Screenshot that highlights the link to a resource group's deployment history.

  3. Para o Nome da implantação que você deseja revisar, selecione Eventos relacionados.

    Screenshot that highlights the link to a deployment's related events.

  4. Examine a sequência de eventos de cada recurso. Preste atenção ao status de cada operação e ao carimbo de data/hora. Por exemplo, a imagem a seguir mostra três contas de armazenamento implantadas em paralelo. Observe que as três contas de armazenamento são iniciadas ao mesmo tempo.

    Screenshot of activity log for resources deployed in parallel.

    A imagem a seguir mostra três contas de armazenamento que não são implantadas em paralelo. A segunda conta de armazenamento depende da primeira conta de armazenamento e a terceira conta de armazenamento depende da segunda conta de armazenamento. A primeira conta de armazenamento é rotulada como Iniciada, Aceita e Exitosa antes que a próxima seja iniciada.

    Screenshot of activity log for resources deployed in sequential order.

Solução 3 - obter recurso externo

O Bicep usa o nome simbólico para criar uma dependência implícita em outro recurso. A palavra-chave existente faz referência a um recurso implantado. Se um recurso existente estiver em um grupo de recursos diferente do recurso que você deseja implantar, inclua escopo e use a função resourceGroup.

Neste exemplo, é implantado um aplicativo Web que usa um Plano do Serviço de Aplicativo existente de outro grupo de recursos.

resource servicePlan 'Microsoft.Web/serverfarms@2021-02-01' existing = {
  name: hostingPlanName
  scope: resourceGroup(rgname)
}

resource webApp 'Microsoft.Web/sites@2021-02-01' = {
  name: siteName
  properties: {
    serverFarmId: servicePlan.id
  }
}

Solução 4 – obter a identidade gerenciada do recurso

Se você estiver implantando um recurso com uma identidade gerenciada, deverá aguardar até que esse recurso seja implantado antes de recuperar os valores na identidade gerenciada. Use uma dependência implícita para o recurso ao qual a identidade é aplicada. Essa abordagem garante que o recurso e a identidade gerenciada sejam implantados antes que o Resource Manager use a dependência.

Você pode obter a ID da entidade de segurança e a ID do locatário para uma identidade gerenciada aplicada a uma máquina virtua. Por exemplo, se um recurso de máquina virtual tiver um nome simbólico de vm, use a seguinte sintaxe:

vm.identity.principalId

vm.identity.tenantId

Solução 5 - verificar funções

Você pode usar o nome simbólico de um recurso para obter valores de um recurso. Você pode fazer referência a uma conta de armazenamento no mesmo grupo de recursos ou em outro grupo de recursos usando um nome simbólico. Para obter um valor de um recurso implantado, use a palavra-chave existente. Se um recurso estiver em um grupo de recursos diferente, use scope com a função scope. Para a maioria dos casos, a função de referência não é necessária.

O exemplo a seguir faz referência a uma conta de armazenamento existente em um grupo de recursos diferente.

resource stgAcct 'Microsoft.Storage/storageAccounts@2021-06-01' existing = {
  name: stgname
  scope: resourceGroup(rgname)
}

Solução 6 - após a exclusão do recurso

Quando você exclui um recurso, pode haver um curto período de tempo em que o recurso aparece no portal, mas não está disponível. Se selecionar o recurso, você receberá a informação de erro Não encontrado.

Screenshot of deleted resource in portal that shows resource not found.

Atualize o portal e o recurso excluído deve ser removido da lista de recursos disponíveis. Se um recurso excluído continuar a ser mostrado como disponível por mais de alguns minutos, contate o suporte.