解決找不到資源的錯誤

本文描述在作業過程中找不到資源時可能會看到的錯誤。 一般來說,當您使用 Bicep 檔案或 Azure Resource Manager 範本 (ARM 範本) 來部署資源時,會看到此錯誤。 當您進行管理工作而 Azure Resource Manager 找不到必要的資源時,也會看到此錯誤。 例如,如果您嘗試新增標記至不存在的資源,您將會收到此錯誤訊息。

徵兆

有兩個錯誤碼指出找不到該資源。 NotFound 錯誤會傳回類似下列的結果:

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

ResourceNotFound 錯誤會傳回類似下列的結果:

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

原因

資源管理員需要擷取資源的屬性,但是其找不到您訂用帳戶中的資源。

解決方案 1:檢查資源屬性

當您在執行管理工作過程中收到此錯誤時,請檢查您為資源提供的值。 要檢查的三個值為:

  • 資源名稱
  • 資源群組名稱
  • 訂用帳戶

如果您使用的是 PowerShell 或 Azure CLI,請檢查您是否在含有資源的訂用帳戶中執行命令。 您可以使用 Set-AzContextaz account set 來變更訂閱。 許多命令都提供訂用帳戶參數,可讓您指定與目前內容不同的訂用帳戶。

如果您無法驗證屬性,請登入 Microsoft Azure 入口網站。 尋找您嘗試使用的資源,並檢查資源名稱、資源群組和訂用帳戶。

解決方案 2:設定相依性

如果您在部署範本時收到此錯誤訊息,您可能需要新增相依性。 資源管理員會在可能的情況下以並行的方式建立資源,將部署最佳化。

例如,在部署 Web 應用程式時,App Service 方案必須存在。 如果您未指定 Web 應用程式相依於 App Service 方案,Resource Manager 就會同時建立這兩個資源。 Web 應用程式失敗並出現錯誤訊息,顯示找不到 App Service 方案資源,因為其尚未存在。 您可設定 Web 應用程式的相依性,以避免此錯誤。

使用隱含相依性,而不是 resourceId 函式。 使用資源的符號名稱和識別碼屬性建立相依性。

例如,Web 應用程式的 serverFarmId 屬性會使用 servicePlan.id 來建立 App Service 方案的相依性。

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

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

在大多數部署中,不需要使用 dependsOn 建立明確相依性

避免設定不必要的相依性。 不必要的相依性會延長部署的持續時間,因為不會以並行方式部署資源。 此外,您可以建立封鎖部署的循環相依性。

部署順序

當您看到相依性問題時,應深入了解資源部署的順序。 您可以使用入口網站來檢視部署作業的順序:

  1. 登入入口網站

  2. 從資源群組的 [概觀] 選取部署歷程記錄的連結。

    Screenshot of Azure portal highlighting the link to a resource group's deployment history in the Overview section.

  3. 針對您想要檢閱的 [部署名稱],選取 [相關事件]

    Screenshot of Azure portal showing a deployment name with the Related events link highlighted in the deployment history.

  4. 檢查每個資源的事件順序。 請留意每項作業的狀態,以及其時間戳記。 例如,下列映像顯示平行部署的三個儲存體帳戶。 請注意,三個儲存體帳戶部署會同時開始。

    Screenshot of Azure portal activity log displaying three storage accounts deployed in parallel, with their timestamps and statuses.

    下圖顯示非平行部署的三個儲存體帳戶。 第二個儲存體帳戶相依於第一個儲存體帳戶,而第三個儲存體帳戶相依於第二個儲存體帳戶。 第一個儲存體帳戶會在下一個儲存體帳戶啟動之前,標示為 [啟動]、[接受] 及 [成功]

    Screenshot of Azure portal activity log displaying three storage accounts deployed in sequential order, with their timestamps and statuses.

解決方案 3:取得外部資源

Bicep 會使用符號名稱來建立另一個資源的隱含相依性現有關鍵字會參考已部署的資源。 如果現有資源位於與您想要部署的資源不同的資源群組中,請附上範圍並使用 resourceGroup 函數。

在此範例中,將使用另一個資源群組中現有的 App Service 方案來部署 Web 應用程式。

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

解決方案 4:從資源取得受控識別

如果您要部署具有受控識別的資源,則必須等到該資源部署完畢之後,您才能擷取受控識別上的值。 對套用身分識別的資源使用隱含相依性。 這種方法可確保在資源管理員使用相依性之前,提前部署資源和受控識別。

您可以針對套用至虛擬機器的受控識別取得主體識別碼和租用戶識別碼。 例如,如果虛擬機器資源具有 vm 的符號名稱,請使用下列語法:

vm.identity.principalId

vm.identity.tenantId

解決方案 5:檢查函式

您可以使用資源的符號名稱來取得資源的值。 您可以使用符號名稱,參考相同資源群組或其他資源群組中的儲存體帳戶。 若要從已部署的資源取得值,請使用現有關鍵字。 如果資源位於不同的資源群組中,請使用 scoperesourceGroup 函數。 在大多數情況下,不需要使用 reference 函數。

下列範例會參考不同資源群組中的現有儲存體帳戶。

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

解決方案 6:刪除資源之後

當您刪除資源時,資源可能會在短暫時間內於入口網站中顯示,但是無法使用。 如果您選取資源,您會收到找不到資源的錯誤訊息。

Screenshot of Azure portal showing a deleted resource with a 'Not found' error message in the resource's Overview section.

請重新整理入口網站頁面,已刪除的資源應該會從您的可用資源清單中移除。 如果已刪除的資源持續顯示為可供使用超過數分鐘,請聯絡支援人員