「リソースプロバイダーはサブスクリプションに登録されていない」という旨のエラーが出てVMが作成できない

# はじめに

Azure で VMを作成しようとした際に知らないエラーメッセージが発生して戸惑いました。対処方法は調べて分かったものの、対処が適当なのか理解するために背後の仕組みも調べたためメモとして残します。

# 遭遇した現象

Azure でVMを作成しようとしたところ、以下のようなエラーメッセージが出て、VMが作成できませんでした。

> リソースプロバイダー Microsoft.Compute はサブスクリプション ＜サブスクリプション名＞ に登録されておらず、サブスクリプション ＜サブスクリプション名＞ のリソースプロバイダーを登録するためのアクセス許可がありません。

サブスクリプションは別担当の方にあらかじめ用意していただいていたものを使用しています。

<details>
<summary>[スクリーンショット]: Virtual Machines > 仮想マシンの作成</summary>

![Virtual Machines > 仮想マシンの作成](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3489051/891e803f-f5bd-3af5-7d20-1b1c1aa47960.jpeg)

</details>

# 原因調査

## リソースプロバイダーとは？

Azure ではリソース管理に **Azure Resource Manager (ARM)** という共通レイヤーを提供しており、Azure PowerShellやAzure portalなどのクライアントは、ARMを通じてリソースの管理を行います。

ただしARM本体には直接リソースを管理する機能はなく、**リソースプロバイダー**によりリソースの管理を行います。

![](https://learn.microsoft.com/ja-jp/azure/cloud-adoption-framework/_images/get-started/design/governance-1-15.png)
画像引用元: https://learn.microsoft.com/ja-jp/azure/cloud-adoption-framework/get-started/how-azure-resource-manager-works

https://learn.microsoft.com/ja-jp/azure/cloud-adoption-framework/get-started/how-azure-resource-manager-works

リソースプロバイダーはサービスごとに分けられており、例えば、仮想マシンリソースを提供するリソースプロバイダーは `Microsoft.Compute` というネームスペースが与えられています。

https://learn.microsoft.com/ja-jp/azure/azure-resource-manager/management/azure-services-resource-providers

各サービスに対応するリソースプロバイダーによりサブスクリプション内にリソースがデプロイされますが、そのためにはサブスクリプションにリソースプロバイダーを登録しておく必要があります。

https://learn.microsoft.com/ja-jp/azure/azure-resource-manager/management/resource-providers-and-types#register-resource-provider

## なぜエラーが発生したのか？

サブスクリプションのリソースプロバイダーのページを見ると `Microsoft.Compute` プロバイダーの状態が `NotRegistered` になっており、サブスクリプションにVM作成に必要なリソースプロバイダーが登録されていませんでした。

<details>
<summary>[スクリーンショット]: サブスクリプション > リソースプロバイダー</summary>

![サブスクリプション > リソースプロバイダー](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3489051/b75da3c9-bfd6-5522-9d4a-dd577dc4f947.jpeg)

</details>

MSのドキュメントには以下のように記載されており、通常はリソース作成時にリソースプロバイダーが自動登録されそうです。

> ポータルを使用してリソースを作成すると、通常、リソース プロバイダーが自動的に登録されます。

https://learn.microsoft.com/ja-jp/azure/azure-resource-manager/management/resource-providers-and-types#register-resource-provider


実際 `Microsoft.Compute` リソースプロバイダーが登録されていない、別のサブスクリプションでVMを作成しようとしたところ、今回のようなエラーは出ず、`Microsoft.Compute` リソースプロバイダーが勝手に登録されました。

しかし今回の環境では、私のアカウントには当該のサブスクリプションに対して閲覧者ロールのみが付与されており、サブスクリプションを変更する権限がありません。

<details>
<summary>[スクリーンショット]: サブスクリプション > アクセス制御（IAM） > マイアクセスの表示</summary>

![サブスクリプション > アクセス制御（IAM） > マイアクセスの表示](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3489051/3274c9a5-2f15-9350-f2d2-87f2323b4114.jpeg)

</details>

したがってVMを作成しようとした際に、権限不足によりサブスクリプションにリソースプロバイダーが自動的に登録されず、今回のエラーが発生したと思われます。

# 実施した対処

権限を持っている担当の方に `Microsoft.Compute` リソースプロバイダーをサブスクリプション登録してもらったところ、上述のエラーが出なくなり、VMの作成ができました。

<details>
<summary>[スクリーンショット]: サブスクリプション > リソースプロバイダー</summary>

![サブスクリプション > リソースプロバイダー](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3489051/30560e05-d6ab-6d58-8a3e-cac101a985eb.jpeg)

</details>

<details>
<summary>[スクリーンショット]: Virtual Machines > 仮想マシンの作成</summary>

![Virtual Machines > 仮想マシンの作成](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3489051/415da2d3-e36f-00d1-e4b4-87c4a3d7d3ef.jpeg)

</details>

# おわりに

研修では各Azureサービスの操作方法や概念などを学びましたが、まだまだ細かいところまで理解できていないなと感じました。どのリソース同士がどういった関係で、その背景には仕組みや設計思想があるのかまで理解できると良いなと思いました。