Azure契約/管理グループ/Entra ID・サブスクリプション/リソースグループについて

## はじめに

Azureを組織で使っていくにあたって、最初に考慮しないと後で管理が大変になることがあります。
特にサブスクリプションをどういうポリシーで分割するかはその後の管理のしやすさに大きく影響するかと思います。
また、そのためには上下の概念についての理解も必要になります。
そのあたりについてまとめてみました。

## 結論

先にまとめをお伝えすると、Azureのリソースに関する階層構造は次の通り。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/146594/a56a105a-b16f-83cb-e061-aac53862ebbd.png)


> https://learn.microsoft.com/ja-jp/azure/azure-resource-manager/management/overview#understand-scope
> 

その上で、サブスクリプションは1つのEntra IDテナントと紐づくという点に注意。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/146594/29e72474-a5d8-97e7-9c31-180dd6fc2210.png)

> https://learn.microsoft.com/ja-jp/azure/active-directory/fundamentals/how-subscriptions-associated-directory

## 契約について

まず、とりあえず使うだけなら、Azureのサブスクリプションがあれば可能です。

ただ、サブスクリプションの作成には、Azureの契約が必要です。

契約には次の3パターンがあります

- 従量課金プラン
- CSP契約（法人向け）
- EA契約（法人向け）

個人利用であれば、従量課金プラン（MOSP）です。

## サブスクリプションについて

サブスクリプションはAzureの課金単位と言えます。

そのため、1つのサブスクリプション内に複数のプロジェクトで利用するリソースが入り込むと、かかった金額の集計などがしづらくなります。

1つの契約に対し、複数のサブスクリプションを作成可能です。

また、権限管理などの単位としても便利なため、なるべく目的ごとに分けることが望ましいです。ちなみに、Azure Defenderはサブスクリプション単位でのON・OFFを行うものだったりします。

よって、例えば次のような観点でサブスクリプションを分けることが推奨されます

- プロジェクト
    - 見積もりや請求時に、必要な金額が算出しにくくなるため
- 開発用/本番用
    - 本番用にアクセスできるユーザやポリシーを限定し、リスクコントロールをしやすくするため
- 組織
    - 社内限定のリソースに組織外のメンバーがアクセスできないようにするため、等

なお、大きな企業ですと、簡単に100を超えるサブスクリプションが発生することが容易に想像できます。こうなってくると、どれにどんな設定してたっけ？と混乱必至ですよね。その対策としてAzure管理グループの利用が有効です。

### 管理グループについて

サブスクリプションを管理グループという単位でまとめ、アクセスポリシーやアクセスの管理を一括して行うことができます。

管理グループ > サブスクリプション > リソース という階層構造を作ることができますので、例えばサブスクリプションによって課金単位での細かい分離をした上で、組織単位で管理グループを構成し、部門毎のコストをまとめて集計することができます。

あまり階層化しすぎても管理しづらいため、おそらく2-3階層程度に留めておいた方がよいでしょう。

## リソースグループについて

ところで、サブスクリプション内の複数のリソースをグループ化して管理する機能があります。

リソースグループというものです。

例えば、フロント・バック・インフラのデプロイサイクル毎にリソースグループを作って、まとめて関連リソースだけを引っ張り出す、ということができます。あるいは、作りながら考えていくなら、とりあえず `try-openai-service` みたいにサブプロジェクト名っぽい的なものを割り当てたりするのも便利です。私は検証用途が多いので、後者をよく使います。

## Microsoft Entra IDについて

管理グループ > サブスクリプション > リソースグループ > リソース という階層構造にした上で、ようやくリソースを作り始めることになりますが、同時にIDの発行も必要になると思います。ということでID管理が必要になります。

ユーザやグループをEntraディレクトリへ作成します。

と言ってもディレクトリって何？とか、予備知識が無いとわからないので順を追って説明します。

### EntraIDの構成要素

まず、ID管理にはMicrosoft Entra IDが必要です。

その上で、Entra IDを通して、発行したユーザが、どのサブスクリプション配下のどのリソースにアクセス可能なのか、不可能なのか、といったことを制御することができます。

Entra IDの構成要素は次の三つです。

- Microsoft Entra ID
- Microsoft Entra テナント
- Microsoft Entra ディレクトリ

Microsoft Entra IDはIDとアクセスの管理をするサービス全体を指すワードです。

Azureにサインアップした際にテナントが自動作成されます。（個人的には、これが混乱の元）

テナントには専用の「ディレクトリ」が一つ用意されます。

ディレクトリ内にユーザ・グループ・アプリケーションといった要素を作成できます。

サブスクリプション毎に、一つのテナントを関連付けすることで、ディレクトリ内のユーザやグループにアクセス権限を付与したりすることができます。

### テナントとサブスクリプション

さて、ここで私は混乱しました。

権限管理の観点で言えば、Entra IDテナントとサブスクリプションの関係は階層構造ではありません。
よって次の整理になると思います。

（誤）

```jsx
契約 > (管理グループ) > Entra IDテナント > サブスクリプション > (リソースグループ) > リソース
```

（正）

```jsx
契約 > (管理グループ) > Entra IDテナント・サブスクリプション > (リソースグループ) > リソース
EntraID テナント：サブスクリプション = 1:n
```

サブスクリプションの管理者であっても、テナントの管理者でないケースがあります。期待操作できない場合には、どのMicrosoftアカウント使ってるの？というのを確認しましょう。

### 旧 Azure AD

旧Azure ADが名称変更されてEntra IDになったみたいです。私がAzure触り始めたときにはもう変更後だったので、差分は分かりませんが、ネットで調べると結構Azure AD時代の用語が出てくるので、こちらの記事を参考にして不明点を調べたりしています。

- Azure Active Directory の新しい名前 - Microsoft Entra | Microsoft Learn https://learn.microsoft.com/ja-jp/azure/active-directory/fundamentals/new-name#glossary-of-updated-terminology

## 参考

- Azure 基礎の概念 - Cloud Adoption Framework | Microsoft Learn https://learn.microsoft.com/ja-jp/azure/cloud-adoption-framework/ready/considerations/fundamental-concepts
- Azure Resource Manager の概要 - Azure Resource Manager | Microsoft Learn https://learn.microsoft.com/ja-jp/azure/azure-resource-manager/management/overview#consistent-management-layer
- Cost Management での一般的なコスト分析の使用 - Microsoft Cost Management | Microsoft Learn https://learn.microsoft.com/ja-jp/azure/cost-management-billing/costs/cost-analysis-common-uses
- ご利用のテナントに既存の Azure サブスクリプションを追加する - Microsoft Entra | Microsoft Learn https://learn.microsoft.com/ja-jp/azure/active-directory/fundamentals/how-subscriptions-associated-directory