Udostępnij za pośrednictwem


Usuwanie błędów dotyczących nie odnalezionych 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 występuje również 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

Usługa Resource Manager musi pobrać właściwości zasobu, ale nie może znaleźć zasobu w ramach 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 uruchamiasz polecenia w subskrypcji zawierającej zasób. Można zmienić subskrypcję, używając 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. Usługa Resource Manager optymalizuje wdrożenia, tworząc zasoby równolegle, gdy jest to możliwe.

Na przykład podczas wdrażania aplikacji internetowej plan usługi App Service musi istnieć. Jeśli nie określono, że aplikacja internetowa zależy od planu usługi App Service, usługa Resource Manager tworzy oba zasoby jednocześnie. Aplikacja internetowa kończy się niepowodzeniem z powodu błędu, że nie można odnaleźć zasobu planu usługi 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 nazwy symbolicznej i właściwości identyfikatora zasobu.

Na przykład właściwość aplikacji serverFarmId internetowej używa servicePlan.id do utworzenia zależności od planu usługi 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 większości przypadków przy wdrożeniach 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 utworzyć 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 witryny Azure Portal z wyróżnionym linkiem do historii wdrożenia grupy zasobów w sekcji Przegląd.

  3. Aby przejrzeć Nazwę wdrożenia, wybierz Powiązane zdarzenia.

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

  4. Sprawdź sekwencję zdarzeń dla każdego zasobu. Zwróć uwagę na stan każdej operacji i sygnaturę czasową. Na przykład, na poniższym obrazie przedstawiono trzy konta magazynowe wdrożone równolegle. Zwróć uwagę, że trzy wdrożenia konta przechowywania rozpoczęły się równocześnie.

    Zrzut ekranu dziennika aktywności portalu Azure pokazujący trzy konta magazynowe wdrożone równolegle, wraz ze znacznikami czasu i stanami.

    Następny obraz przedstawia trzy kontenery magazynowe, 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 jest oznaczone jako Rozpoczęte, Zaakceptowane i Zakończone zanim zostanie uruchomione następne.

    Zrzut ekranu dziennika aktywności portalu Azure pokazujący trzy konta przechowywania wdrożone w sekwencji wraz ze znacznikami czasu i stanami.

Rozwiązanie 3. Pobieranie zasobu zewnętrznego

Bicep używa nazwy symbolicznej do tworzenia 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 usługi 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 przy użyciu tożsamości zarządzanej, 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 zarządzana tożsamość są wdrożone, zanim Resource Manager użyje zależności.

Identyfikator główny i identyfikator dzierżawy można uzyskać dla tożsamości zarządzanej przypisanej 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 uzyskać wartości z zasobu. Możesz odwołać 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 funkcji scoperesourceGroup . 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

Istnieje krótki okres po usunięciu zasobu, gdy zasób jest nadal wyświetlany w portalu, ale nie jest dostępny. Jeśli wybierzesz zasób, zostanie wyświetlony błąd, że zasób nie zostanie znaleziony.

Zrzut ekranu witryny 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ą.