Usuwanie błędów dotyczących nieznalezionych zasobów

W tym artykule opisano błąd, który występuje, gdy nie można odnaleźć zasobu podczas operacji. Zazwyczaj ten błąd występuje podczas wdrażania zasobów przy użyciu pliku Bicep lub szablonu usługi Azure Resource Manager (szablon usługi ARM). Ten błąd jest również wyświetlany podczas wykonywania zadań zarządzania, a usługa Azure Resource Manager nie może odnaleźć wymaganego zasobu. Jeśli na przykład spróbujesz dodać tagi do zasobu, który nie istnieje, zostanie wyświetlony ten błąd.

Objawy

Istnieją dwa kody błędów wskazujące, że nie można odnaleźć zasobu. Błąd NotFound zwraca wynik podobny do następującego:

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

Błąd ResourceNotFound zwraca wynik podobny do następującego:

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

Przyczyna

Resource Manager musi pobrać właściwości zasobu, ale nie może znaleźć zasobu w subskrypcji.

Rozwiązanie 1. Sprawdzanie właściwości zasobu

Po wystąpieniu tego błędu podczas wykonywania zadania zarządzania sprawdź wartości podane dla zasobu. Trzy wartości do sprawdzenia to:

  • Nazwa zasobu
  • Nazwa grupy zasobów
  • Subskrypcja

Jeśli używasz programu PowerShell lub interfejsu wiersza polecenia platformy Azure, sprawdź, czy używasz poleceń w subskrypcji zawierającej zasób. Subskrypcję można zmienić za pomocą polecenia Set-AzContext lub az account set. Wiele poleceń udostępnia parametr subskrypcji, który umożliwia określenie innej subskrypcji niż bieżący kontekst.

Jeśli nie możesz zweryfikować właściwości, zaloguj się do witryny Microsoft Azure Portal. Znajdź zasób, którego próbujesz użyć, i sprawdź nazwę zasobu, grupę zasobów oraz subskrypcję.

Rozwiązanie 2. Ustawianie zależności

Jeśli ten błąd występuje podczas wdrażania szablonu, może być konieczne dodanie zależności. Resource Manager optymalizuje wdrożenia, tworząc zasoby równolegle, gdy jest to możliwe.

Na przykład podczas wdrażania aplikacji internetowej musi istnieć plan App Service. Jeśli nie określono, że aplikacja internetowa zależy od planu App Service, Resource Manager tworzy oba zasoby w tym samym czasie. Aplikacja internetowa kończy się niepowodzeniem z powodu błędu, że nie można odnaleźć zasobu planu App Service, ponieważ jeszcze nie istnieje. Ten błąd można zapobiec, ustawiając zależność w aplikacji internetowej.

Użyj niejawnej zależności , a nie funkcji resourceId . Zależność jest tworzona przy użyciu symbolicznej nazwy zasobu i właściwości ID.

Na przykład właściwość aplikacji internetowej używa servicePlan.id metody do utworzenia serverFarmId zależności od planu App Service.

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

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

W przypadku większości wdrożeń nie jest konieczne utworzenie dependsOnjawnej zależności.

Unikaj ustawiania zależności, które nie są potrzebne. Niepotrzebne zależności wydłużają czas trwania wdrożenia, ponieważ zasoby nie są wdrażane równolegle. Ponadto można tworzyć zależności cykliczne, które blokują wdrożenie.

Kolejność wdrażania

Gdy widzisz problemy z zależnościami, musisz uzyskać wgląd w kolejność wdrażania zasobów. Za pomocą portalu można wyświetlić kolejność operacji wdrażania:

  1. Zaloguj się do portalu.

  2. W obszarze Przegląd grupy zasobów wybierz link do historii wdrożenia.

    Zrzut ekranu przedstawiający Azure Portal wyróżnianie linku do historii wdrożenia grupy zasobów w sekcji Przegląd.

  3. W polu Nazwa wdrożenia , którą chcesz przejrzeć, wybierz pozycję Powiązane zdarzenia.

    Zrzut ekranu przedstawiający Azure Portal nazwę wdrożenia z wyróżnionym linkiem Powiązane zdarzenia w historii wdrożenia.

  4. Przeanalizuj sekwencję zdarzeń dla każdego zasobu. Zwróć uwagę na stan każdej operacji i sygnaturę czasową. Na przykład na poniższej ilustracji przedstawiono trzy konta magazynu wdrożone równolegle. Zwróć uwagę, że trzy wdrożenia konta magazynu rozpoczęły się w tym samym czasie.

    Zrzut ekranu przedstawiający Azure Portal dziennik aktywności przedstawiający trzy konta magazynu wdrożone równolegle ze znacznikami czasu i stanami.

    Następny obraz przedstawia trzy konta magazynu, które nie są wdrażane równolegle. Drugie konto magazynu zależy od pierwszego konta magazynu, a trzecie konto magazynu zależy od drugiego konta magazynu. Pierwsze konto magazynu ma etykietę Started (Uruchomione), Accepted (Zaakceptowane) i Succeeded (Powodzenie ) przed rozpoczęciem następnego.

    Zrzut ekranu przedstawiający Azure Portal dziennika aktywności z wyświetlonymi trzema kontami magazynu wdrożonych w kolejności sekwencyjnej ze znacznikami czasu i stanami.

Rozwiązanie 3. Pobieranie zasobu zewnętrznego

Bicep używa nazwy symbolicznej do utworzenia niejawnej zależności od innego zasobu. Istniejące słowo kluczowe odwołuje się do wdrożonego zasobu. Jeśli istniejący zasób znajduje się w innej grupie zasobów niż zasób, który chcesz wdrożyć, dołącz zakres i użyj funkcji resourceGroup .

W tym przykładzie wdrożono aplikację internetową, która korzysta z istniejącego planu App Service z innej grupy zasobów.

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

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

Rozwiązanie 4. Uzyskiwanie tożsamości zarządzanej z zasobu

Jeśli wdrażasz zasób z tożsamością zarządzaną, musisz poczekać, aż ten zasób zostanie wdrożony przed pobraniem wartości w tożsamości zarządzanej. Użyj niejawnej zależności dla zasobu, do którego jest stosowana tożsamość. Takie podejście zapewnia, że zasób i tożsamość zarządzana są wdrażane przed Resource Manager używa zależności.

Możesz uzyskać identyfikator podmiotu zabezpieczeń i identyfikator dzierżawy dla tożsamości zarządzanej zastosowanej do maszyny wirtualnej. Jeśli na przykład zasób maszyny wirtualnej ma symboliczną nazwę vm, użyj następującej składni:

vm.identity.principalId

vm.identity.tenantId

Rozwiązanie 5. Sprawdzanie funkcji

Możesz użyć symbolicznej nazwy zasobu, aby pobrać wartości z zasobu. Możesz odwoływać się do konta magazynu w tej samej grupie zasobów lub innej grupie zasobów przy użyciu nazwy symbolicznej. Aby uzyskać wartość z wdrożonego zasobu, użyj istniejącego słowa kluczowego. Jeśli zasób znajduje się w innej grupie zasobów, użyj jej scope z funkcją resourceGroup . W większości przypadków funkcja referencyjna nie jest potrzebna.

Poniższy przykład odwołuje się do istniejącego konta magazynu w innej grupie zasobów.

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

Rozwiązanie 6. Po usunięciu zasobu

Po usunięciu zasobu może wystąpić krótki czas wyświetlania zasobu w portalu, ale nie jest dostępny. Jeśli wybierzesz zasób, zostanie wyświetlony komunikat o błędzie, że zasób nie został znaleziony.

Zrzut ekranu przedstawiający Azure Portal przedstawiający usunięty zasób z komunikatem o błędzie

Odśwież portal i usunięty zasób powinien zostać usunięty z listy dostępnych zasobów. Jeśli usunięty zasób będzie nadal wyświetlany jako dostępny przez więcej niż kilka minut, skontaktuj się z pomocą techniczną.