AzureサブスクリプションとかアカウントとかAzure ADのテナントとか (1)

## はじめに
何かと複雑なAzure ADテナントとアカウント(ユーザー)とAzureサブスクリプション等についてどういう風になっているのかをまとめてみる。まずはそれらの関係性をざっとまとめて、次の記事あたりでエンタープライズ契約のときに登場するその管理構造とどういう関係になっているのかについてひも解いてみたい。

## Azure AD配下の位置関係
まず前提としてAzure ADはAzureっていう名前がついているにも関わらずAzureとはちょっと違う場所にある (ロケーションとかじゃなくて関係性において)。マイクロソフト的にも今のところAzureとは別のサービスという位置づけのようである。~~O365やAzureとかを対象とする認証基盤~~ 統合的なIDプラットフォームサービスと考えておいたほうがよさそうである。
<img src="https://qiita-image-store.s3.amazonaws.com/0/144789/c756a8f3-ed61-9628-bfb8-1b3bf42c2bfa.png">


簡単にまとめると下記のようになる。

* O365サブスクリプションはAzure ADのディレクトリの配下に作成される
* アカウント(ユーザー)はディレクトリに所属する
* サブスクリプションは、サブスクリプションを作成したユーザーのディレクトリに所属する。 そのため、Azureサブスクリプションは、 O365サブスクリプションと同じアカウントに関連付けられる 
* Azureサブスクリプションの所有者は、ディレクトリ内の各ユーザーとなる
* アカウントはAzureサブスクリプションを複数持つことができる
* O365サブスクリプションの所有者は、ディレクトリ自体である。 ディレクトリ内で適切なアクセス許可を持つユーザーは、これらのサブスクリプションを管理できる

## アカウント配下の位置関係

ユーザーアカウント、Azureサブスクリプション、Azureのリソースの位置関係は、以下のようになっている。
<img src="https://qiita-image-store.s3.amazonaws.com/0/144789/557f232b-3c4b-bdd1-b086-a2408f72fbd8.png">

* アカウントは複数のAzureサブスクリプションを持つことができる。
* Azureサブスクリプションは必ずどこかのアカウントに紐づけられている。
* Azureサブスクリプションは、紐づけられているアカウントが登録されているAzure ADテナント(MemberまたはGuest)に関連している(Azure ADを信頼している)。
* Azureサブスクリプションが信頼できるAzure ADはひとつのみ。

こういう風に、AzureサブスクリプションはAzure ADテナントに直接ぶら下がっているのではなく、アカウントにぶら下がっているのだという事を理解しておくことが重要である。別のAzure ADテナントのところに移す時も、そのAzure ADテナント配下のアカウントを新しい所有者として権利を譲渡することになる。[既存のAzureサブスクリプションをAzure Active Directoryに関連付けるまたは追加する方法](https://docs.microsoft.com/ja-jp/azure/active-directory/fundamentals/active-directory-how-subscriptions-associated-directory) も、そのAzureサブスクリプションの所有者アカウントが変更先のディレクトリにも [B2B招待](https://docs.microsoft.com/ja-jp/azure/active-directory/b2b/add-users-administrator) によって存在する場合に実施可能であり、所有者は変わっていない。つまり課金請求先も変わらない。どこに行ってもAzureサブスクリプションは常に誰かのところにくっついているものなのだ。

## そもそもAzureサブスクリプションとは？

Azureサブスクリプションって何だろねって未だにピンとこない感じがするが、Azureの各種リソース等の境界と捉えておくと良いのではないかと思う。ここでの境界は次の2つの意味を持つことになる。

### 課金における境界

AzureサブスクリプションはAzure利用料の支払いの単位(エンタープライズ契約等の場合は利用料の管理の単位)になる。例えばサブスクリプション①がサブスクリプション②の課金に影響を及ぼすことはできない。

### ユーザーと権限の構造の境界

つまりサブスクリプション配下のリソース(仮想マシン、データベース等)をデプロイしたり、削除したり監視したり等の操作の権限設定を行う際の管理の境界になっている。ここでの権限設定は [Azure RBAC](https://docs.microsoft.com/ja-jp/azure/role-based-access-control/overview) によって行う。
※[Azure Governanceの管理グループ](https://docs.microsoft.com/ja-jp/azure/governance/management-groups/index) でポリシーを束ねることは可能。

Azureサブスクリプションの所有者はサブスクリプションのサービス管理者をアサインすることができる。サービス管理者はそのサブスクリプションのすべてのリソースを管理することができ、ユーザーの招待やRBACによる権限管理も実施可能。
<img src="https://qiita-image-store.s3.amazonaws.com/0/144789/6df08da2-64bb-a08c-6414-1d49bcc41a79.png">

## RBACでロールを割り当てることができる対象アカウント

RBACはそのAzureサブスクリプションが紐づけられている所有者のアカウントが所属しているAzure ADテナントに存在しているユーザーのみ選択することができる。それ以外のテナントのユーザーに権限を付与したい場合は、まずAzure ADテナントに対象の外部ユーザーを [ゲストとして招待](https://docs.microsoft.com/ja-jp/azure/active-directory/b2b/b2b-quickstart-add-guest-users-portal) する必要がある。下図のようなイメージになる。
<img src="https://qiita-image-store.s3.amazonaws.com/0/144789/a88f6893-0971-f7e4-fd06-758a03aa8d17.png">

## (補足) Azureサブスクリプションのディレクトリを変更

https://docs.microsoft.com/ja-jp/azure/active-directory/fundamentals/active-directory-how-subscriptions-associated-directory
こちらのドキュメントに従って既存のAzureサブスクリプションのAzure ADのディレクトリを変更する場合、Azureサブスクリプションの所有者が変更先のディレクトリにゲストとして存在するアカウントでなければならない。下図ではxxxxxxxxxxxx.comを信頼しているAzureサブスクリプションをzzzzzzzzzzzz.comに変更する場合はアカウントの所有者であるtaro@xxxxxxxxxxxx.comがzzzzzzzzzzzz.comディレクトリのゲストとして登録されている必要がある。Azureサブスクリプションのディレクトリを変更しても所有者は相変わらずtaro@xxxxxxxxxxxx.comさんのままであり、zzzzzzzzzzzz.comにサブスクリプションの利用料の請求が行くように変更されることはない。
<img src="https://qiita-image-store.s3.amazonaws.com/0/144789/6d145196-d3f7-6f12-2e14-217138262d58.png">

ディレクトリを変更した後、所有者は変更後のディレクトリにおいてサービス管理者をアサインし、サービス管理者はRBACにより共同作成者等を追加してプロジェクトを進めることができるようになる。