欲しいアプリは自分で作る!

Power Platform や Azure などを利用して作成した業務アプリや趣味アプリなどをご紹介します。

Power Automate を用いてセキュリティグループのメンバーを任意の条件で自動更新する方法

どうも、じゅんじゅんです。


弊社では現在、社で貸与しているスマートフォンの内線化に向けて準備を進めているのですが、その内線サービスで Azure AD 連携機能があり、Azure AD 上の任意のユーザーを内線サービス側に同期できるとのこと。

ただ、弊社では Office 365 ユーザーの全員がスマートフォンを貸与されているわけではないため、スマートフォンが貸与されているユーザーのみのセキュリティグループを作り、そのセキュリティグループを同期しようということになりました。


で、そのグループへのユーザーの追加・削除を手動で行うのは面倒過ぎるので、Power Automate を用いて自動化してみたというのが、本記事の内容です。


全体像

自動化の方法は単純で、定期的に「一旦グループのメンバーを全消去し、再度登録する」という作業を、以下の段取りで Power Automate で行うものです。

  1. 該当グループに登録されているユーザーを取得
  2. 取得した各ユーザーに対して、グループから削除する
  3. Office 365 ユーザーを取得
  4. 取得した各ユーザーに対して、「電話番号」の項目が空でないユーザーのみグループに追加する

フローの全体像は以下のようになりました。

f:id:jn-kodama:20201019232012p:plain


下準備(グループの作成)

先に、管理センターにてセキュリティグループを1つ作成しておきます。
今回は、特にこのグループに対してメールアドレスが必要ではなかったため、メールが有効 "でない" セキュリティグループを作りました。 f:id:jn-kodama:20201019234709p:plain f:id:jn-kodama:20201019234856p:plain グループの編集権限が必要なので、後にフローを実行するアカウントをグループの所有者として追加しておきます。 f:id:jn-kodama:20201022170221p:plain

そして、今の画面のURLにあるグループ ID の部分をコピーしておきます。
(下図でいう 3dbb~9473 の部分) f:id:jn-kodama:20201022170408p:plain

グループの用意ができたら、フローの作成に入ります。


フローの作成方法

  1. 今回は定期実行するフローになると思いますので、"予定フローを作成" から。
    任意のフロー名、繰り返し間隔等を設定して、"作成" をクリック。 f:id:jn-kodama:20201022170938p:plain

  2. Azure AD コネクタの "グループのメンバーを取得" を追加し、先程コピーしたグループ ID をペーストします。 f:id:jn-kodama:20201022171114p:plain f:id:jn-kodama:20201022171241p:plain

  3. 取得できるグループのメンバー数なのですが、詳細オプションを見ると「既定 = すべて」となっているものの、このままだとなぜか100件しか取得できなかったので、明示的に999件としています。
    参考: powerusers.microsoft.com f:id:jn-kodama:20201022172044p:plain f:id:jn-kodama:20201022172114p:plain

  4. 取得したユーザーを1件ずつ削除します。
    Azure AD コネクタの "グループからメンバーを削除" を追加し、グループの ID は2.と同様にグループ ID を、メンバー ID には2.で取得したメンバーの "グループ メンバー ID" を設定します。
    ※グループのメンバーは配列で返されるので、ここで自動的に Apply to each が適用されます。 f:id:jn-kodama:20201022172439p:plain f:id:jn-kodama:20201022172626p:plain ここまでで削除処理は完了です。

  5. 続いて、再度グループにユーザーを追加するために、ユーザー情報を取得します。
    Office 365 コネクタの "ユーザーの検索 (V2)" を追加します。
    本来はここで検索対象者を絞れればよいのですが、ここでは電話番号は絞れそうにないので条件を指定せず全ユーザーを取得します。
    ちなみにこちらの取得件数は規定値1000となっており、特に指定しなくとも弊社の条件の場合で800件以上取得できたので、何も設定しませんでした。 f:id:jn-kodama:20201022172929p:plain f:id:jn-kodama:20201022173234p:plain

  6. 取得したユーザー情報に電話番号が含まれているものを判定します。
    弊社では "電話番号" に社で貸与しているスマートフォンの番号を登録しているため、条件の左辺に5.で取得したユーザー情報の "電話番号" を、条件を "次の値に等しくない" に、右辺に式で null を設定します。
    ※こちらもユーザーは配列で返されるので、ここで自動的に Apply to each が適用されます。 f:id:jn-kodama:20201022173334p:plain f:id:jn-kodama:20201022173744p:plain f:id:jn-kodama:20201022173814p:plain

  7. 電話番号が含まれている場合、つまり先程の条件で "はい" となったユーザーをグループに追加します。
    Azure AD コネクタの "ユーザーをグループに追加" を追加し、グループの ID は2.と同様にグループ ID を、ユーザー ID には5.で取得したユーザーの "ユーザー ID" を設定します。
    f:id:jn-kodama:20201022174437p:plain f:id:jn-kodama:20201022174535p:plain


以上でフローは完成です。


難点

この処理フロー、削除や追加を1件ずつ実行していることもあり、処理時間が大幅にかかります。

弊社環境だと、500人弱のグループのメンバーを削除するのに24分、900人弱のユーザーから電話番号が付与されている500人弱のユーザーをグループに追加するのに16分かかりました。 f:id:jn-kodama:20201022175153p:plain

Apply to each 処理は並列処理(今カレンシー制御)が可能なのですが、試しに並列処理の次数を20にしても処理時間に差はなかった(というか並列処理に関わらず処理時間は変動する)のでおそらく Azure AD 側の処理が追い付いていないのかもしれません。
このあたり、何かご存知の方がいらっしゃいましたら是非教えてください!


まとめ

Power Automate を用いて、グループのメンバーを任意の条件で自動更新する方法についてご紹介しました。 煩わしいグループのメンテナンスが少しでも楽になれば幸いです。



欲しいツールは欲しい人が作る時代へ。
何かのご参考になれば幸いです。