EntraグループにSharePoint リストのアイテムへのアクセス権限をPower Automateで付与する

# はじめに

　SharePoint リストでは、アイテムごとにアクセス権限を設定することができます。アクセス権限の付与先にEntraグループを指定することができます。業務で、Entraグループへの付与を自動化することに取り組んでいます。本記事では、Power Automateで実現した方法を記載します。

# SharePoint リスト

https://support.microsoft.com/ja-jp/office/microsoft-365-%E3%81%AE%E3%83%AA%E3%82%B9%E3%83%88%E3%81%A8%E3%81%AF-93262a88-20ad-4edc-8410-b6909b2f59a5

　SharePoint リストはExcelのようにデータをテーブルで持ちます。Excelとの違いはMicrosoft製品との相性が良く、Power Automateによる自動化やMicrosoft Listsによるフォーム、Power AppsでGUI画面を容易作成することができます。
　今回、注目しているのはSharePointで作ったリストのアイテム(1行のデータ)にMicrosoft Entra グループでアクセス権限を設定することができるという点です。手動で設定するには以下の手順を踏みます。

1. 設定したいアイテムを右クリック→「アクセス許可の管理」を選択
![sharepoint_item_access.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3592580/7242e38b-ab4d-e5a6-b9bd-52109b4933aa.png)
2. 検索ボックスにEntra グループの名称を入力し、該当グループを選択→「送信」を選択することでアクセス権が付与されます。
![sharepoint_item_access_select_entra_group.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3592580/3b89bb32-b7c4-e503-b945-dfde3a7aae87.png)

上記の作業を今回はSharePoint リストと相性が良いPower Automateで自動化していきます。

## SharePoint上でのEntraグループの扱いについて

　手動でEntraグループにアクセス権限を与えると、SharePointのユーザーやグループを管理する画面にEntraグループが作成されます。確認方法は以下の手順です。

1. 右上の「設定」→「サイトのアクセス許可」を選択し、「高度なアクセス許可を設定」を選択
![sharepoint_show_users.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3592580/f92f82f2-8bce-8a3d-8b9b-260d254fb361.png)
2. ユーザー/グループ一覧に該当のEntraグループを確認することができます。
![sharepoint_user_test_entra_group.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3592580/118bd648-a544-d051-b5d1-999e9f7956b3.png)
　この作成されたEntraグループは、SharePoint上ではドメイングループという種類で管理されるようです。
3. Entraグループの名称を選択することで、以下の詳細な情報を確認できます。
![sharepoint_user_info.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3592580/cc2e84d6-1e30-bc01-37db-087247aaaee4.png)
　詳細な情報を確認すると、「ユーザー情報」という表記があることからSharePoint上で作成されたEntraグループはSharePoint ユーザー扱いであることがわかります。「アカウント」という箇所は秘密情報なので隠していますが、テナント情報やEntraグループのオブジェクトIDを組み合わせた文字列です。

 手動でのアクセス権限付与の裏側では、自動でEntraグループの参照情報を持つSharePointユーザーを作成していることがわかりました。では、Power Automateで実現していきます。

# Power Automate

https://learn.microsoft.com/ja-jp/power-automate/getting-started

Power Automateはビジネス業務の自動化をローコードで書くことができるサービスです。[SharePointを操作するAPI](https://learn.microsoft.com/ja-jp/sharepoint/dev/business-apps/power-automate/sharepoint-connector-actions-triggers)が用意されているのでPower Automateを使って実現していきます。

## 全体図

完成した全体図は以下のようになります。

![powerautomate_all.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3592580/f1e4f00c-1e3d-6440-f076-526659108306.png)

使用したトリガー/アクションを以下に記します。
- トリガー
  - [アイテムを作成か変更した場合](https://learn.microsoft.com/ja-jp/sharepoint/dev/business-apps/power-automate/sharepoint-connector-actions-triggers#when-an-item-is-created-or-modified)
- アクション
  - [SharePoint に HTTP 要求を送信する](https://learn.microsoft.com/ja-jp/sharepoint/dev/business-apps/power-automate/sharepoint-connector-actions-triggers#send-an-http-request-to-sharepoint)
  - JSONの解析

　[Microsoft SharePoint コネクタ](https://learn.microsoft.com/ja-jp/sharepoint/dev/business-apps/power-automate/sharepoint-connector-actions-triggers)の中を探しましたが、HTTPリクエストを使用する方法しかやりたいことは実現できなかったです。

## 詳細な説明

### Microsoft Entra GroupからSharePoint Userを作成する

![powerautomate_create_user.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3592580/b327b960-f5d9-f789-9d5a-51cdccc029d4.png)

　[Sharepoint上でのentraグループの扱いについて](#sharepoint上でのentraグループの扱いについて)より、Entraグループに相当するSharePointユーザーを作成する箇所です。Bodyの`LoginName`に前述したテナント情報やEntraグループのオブジェクトIDを組み合わせた文字列を入れます。`_api/web/siteusers`のAPIドキュメントは[こちら](https://learn.microsoft.com/en-us/previous-versions/office/developer/sharepoint-rest-reference/dn531432(v=office.15)#request-examples-8)です。今回は、SharePointリストのアイテムの列に`AccessGroup`というユーザー/グループの種類を入力して作成し、トリガーからその値を取得してきています。

### リストアイテムの権限継承を解除する

![powerautomate_breakroleinheritance.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3592580/52d3c09e-e298-447a-ff4b-c73bcdb818f9.png)

　アイテムにはSharePointサイトのアクセス権限が継承されています。新しいアクセス権限を付与するには、まず継承を解除する必要があります。`breakroleinheritance`というAPIを実行することで可能です。APIドキュメントは[こちら](https://learn.microsoft.com/ja-jp/previous-versions/office/developer/sharepoint-2010/ee535228(v=office.14))です。

### リストアイテムの権限にEntraグループを追加する

![powerautomate_addroleassignment.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3592580/6696202d-d6d9-05ab-4c19-d109183a0cae.png)

　`roleassignments/addroleassignment`のAPIを実行することで、Entraグループにアイテムへのアクセス権限を付与することができます。`principalid`にはEntraグループを元に作成したSharePointユーザーのIdを指定してください。ここではユーザー作成したHTTPリクエストのレスポンスをJSON解析した情報からIdを取得して指定しています。`roledefid`には読み取り/書き込み権限の指定をします。書き込み権限であれば`1073741830`を指定します。[こちら](https://learn.microsoft.com/ja-jp/sharepoint/dev/sp-add-ins/set-custom-permissions-on-a-list-by-using-the-rest-interface)のドキュメントを参考に作成しました

# 課題

- Power Automateの実行開始が遅い
  - 体感として、アイテム作成してから4,5分掛かる
- Power Automateの運用について
  - IaC化が対応していないので、運用時で苦労することが目に見えている
    - (エンジニア目線の考えなのかもしれない)
  - 各アクションごとに`Code view`という機能がありJSON形式でコードを確認することができる。最悪のケースで、Github等で1アクションごとにコード管理する

# まとめ

　本記事では、Entraグループにアイテムへのアクセス権限付与をPower Automateで実現しました。一番の苦悩は、SharePointが裏でEntraグループの情報を元にSharePoint ユーザーを自動で作成していたということを気づくのに時間が掛かったことです。