リソースが見つからないエラーを解決する
この記事では、操作中にリソースが見つからないときに発生するエラーについて説明します。 通常、このエラーは、Bicep ファイルまたは Azure Resource Manager テンプレート (ARM テンプレート) を使ってリソースをデプロイするときに表示されます。 また、管理タスクを実行しているときに、Azure Resource Manager で必要なリソースが見つからない場合にもこのエラーは発生します。 たとえば、存在しないリソースにタグを追加しようとすると、このエラーが発生します。
現象
リソースが見つからないことを示す 2 つのエラー コードがあります。
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.
原因
Resource Manager でリソースのプロパティを取得する必要がありますが、お使いのサブスクリプション内でリソースを見つけることができません。
解決策 1: リソースのプロパティを確認する
管理タスクの実行中にこのエラーが発生した場合は、リソースに指定した値を確認してください。 次の 3 つの値を確認します。
- リソース名
- リソース グループ名
- サブスクリプション
PowerShell または Azure CLI を使用している場合は、リソースが含まれているサブスクリプションでコマンドを実行していることを確認します。 Set-AzContext または az account set を使用して、サブスクリプションを変更できます。 多くのコマンドで、現在のコンテキストとは異なるサブスクリプションを指定できるサブスクリプション パラメーターが用意されています。
プロパティを確認できない場合は、Microsoft Azure portal にサインインします。 使用しようとしているリソースを検索し、リソース名、リソース グループ、およびサブスクリプションを調べます。
解決策 2: 依存関係を設定する
テンプレートをデプロイするときにこのエラーが発生した場合は、依存関係の追加が必要になることがあります。 Resource Manager は、可能であれば複数のリソースを並行して作成することで、デプロイを最適化しています。
たとえば、Web アプリをデプロイする場合は、App Service プランが存在する必要があります。 Web アプリが App Service プランに依存していることを指定しなかった場合、Resource Manager では同時に両方のリソースが作成されます。 Web アプリは、App Service プランのリソースがまだ存在しないため見つからない、というエラーで失敗します。 このエラーは、Web アプリに依存関係を設定することで回避します。
resourceId 関数ではなく、暗黙的な依存関係を使用します。 依存関係は、リソースのシンボリック名と ID プロパティを使用して作成されます。
たとえば、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
を使用して明示的な依存関係を作る必要はありません。
不要な依存関係を設定しないようにします。 不要な依存関係があると、リソースが並行してデプロイされないので、デプロイの期間が長くなります。 また、循環依存関係が作成されてデプロイがブロックされる可能性があります。
デプロイ順
依存関係の問題が発生した場合は、リソースのデプロイ順序を把握する必要があります。 ポータルを使用して、デプロイ操作の順序を確認できます。
ポータルにサインインします。
リソース グループの [概要] から、デプロイ履歴のリンクを選びます。
確認する [デプロイ名] で、[関連イベント] を選びます。
各リソースのイベントの順序を調べます。 各操作の状態とタイムスタンプに注意してください。 たとえば、次の図には、並列でデプロイされた 3 つのストレージ アカウントが示されています。 3 つのストレージ アカウントのデプロイが同時に開始されたことがわかります。
次の図には、並列でデプロイされていない 3 つのストレージ アカウントが示されています。 2 つ目のストレージ アカウントは最初のストレージ アカウントに依存し、3 つ目のストレージ アカウントは 2 つ目のストレージ アカウントに依存します。 最初のストレージ アカウントには、次のストレージ アカウントが開始される前に、[開始]、[受け入れ]、[完了] というラベルが付けられます。
解決策 3: 外部リソースを取得する
Bicep ではシンボリック名を使用して、別のリソースに対する暗黙的な依存関係を作成します。 existing キーワードは、デプロイされたリソースを参照します。 既存のリソースがデプロイするリソースとは異なるリソース グループにある場合は、scope を含めて 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: リソースからマネージド ID を取得する
マネージド ID と共にリソースをデプロイする場合は、そのリソースがデプロイされるまで待機してから、マネージド ID の値を取得する必要があります。 ID が適用されるリソースに対して暗黙的な依存関係を使用します。 この方法では、Resource Manager が依存関係を使うする前に、リソースとマネージド ID が確実にデプロイされます。
仮想マシンに適用されているマネージド ID のプリンシパル ID とテナント ID を取得できます。 たとえば、仮想マシン リソースのシンボリック名が vm
である場合は、次の構文を使用します。
vm.identity.principalId
vm.identity.tenantId
解決策 5: 関数を確認する
リソースのシンボリック名を使って、リソースから値を取得できます。 シンボリック名を使って、同じリソース グループまたは別のリソース グループ内のストレージ アカウントを参照できます。 デプロイされたリソースから値を取得するには、existing キーワードを使います。 リソースが別のリソース グループ内にある場合は、resourceGroup 関数と共に scope
を使います。 ほとんどの場合、reference 関数は必要はありません。
次の例では、別のリソース グループにある既存のストレージ アカウントが参照されています。
resource stgAcct 'Microsoft.Storage/storageAccounts@2022-05-01' existing = {
name: stgname
scope: resourceGroup(rgname)
}
解決策 6: リソースを削除した後
リソースを削除すると、短時間ですが、リソースがポータルに表示されていても使用できないという場合があります。 リソースを選択すると、リソースが見つからないというエラーが表示されます。
ポータルを更新すると、削除されたリソースが使用可能なリソースの一覧から削除されます。 削除されたリソースが引き続き数分間使用可能と表示される場合は、サポートにお問い合わせください。