Power Automateを利用して、AzureADからの通知を受信するための準備をする

あまり知られてないような気がしますが、Microsoft Graph リソースが変更されたときに通知を送ることができます。 つまりAzureADにユーザーが作成されたらTeamsやSlackに通知する等ができるということです。 が、これが結構使えるようにするまでがめんどくさい・・・。 普通にWebhookの設定ができればいいだけだと思うのですが、なぜか色々と面倒な準備が必要です。

今回は通知を受け取るための準備として、Power Automateを利用しての手順をまとめていきます。 必要なシステムは以下のとおりです。

  • Power Automate有料ライセンス(開発者向けプランでも可)
  • Microsoft 365(ライセンスはどれでもOKですが、今回のやりたいこと的には、AzureADの情報を触れる環境がいいですね)
目次

AzureADへアプリ登録

通知要求を送信するためにも、Graph APIのアクセストークンが必要になるため、AzureADへアプリ登録をする必要があります。

  1. 「アプリ登録」→【新規登録】をクリックします。
  2. 名前にわかりやすい名前をつけて【登録】をクリックします。
  3. 作成したアプリ名をクリックし、「APIのアクセス許可」をクリックします。
  4. 必要なAPIアクセス許可を付与します。今回はユーザー情報の変更通知を取得したいと思いますので、User.Read.AllがあればOKです。
  5. 「管理者の同意を与えます」をクリックし、権限を付与します。
  6. 「証明書とシークレット」をクリックします。
  7. 【新しいクライアントシークレット】をクリックし、説明欄にわかり易い名前を入力し、有効期限を選択して【追加】をクリックします。
  8. 表示されたシークレットキーを控えておきます。(ここでしか確認できないので必ず控えてください)
  9. 「概要」をクリックし、以下の値を控えておきます。
    • アプリケーション(クライアント)ID
    • ディレクトリ(テナント)ID

Power Automateフロー作成

Power Automateのフローを、送信用と受信用の2つを作成します。

送信用フロー作成

サブスクリプション(通知)には有効期限があるため、利用したいリソースによって、実行間隔を調整してください。
サブスクリプションライフタイム
今回はユーザーリソースを利用したいので、29日以内に再実行する形にすると、期限切れにならないと思いますが、この後に設定する「expirationDateTime」以内に再実行する必要があります。

一旦トリガーをスケジュールではなく、「手動でフローをトリガーします」を設定しフローがうまく動くかを確認するようにしたいと思います。

  • Power Automateの画面から【作成】をクリックします。
  • インスタントクラウドフローをクリックします。
  • 「手動でフローをトリガーします」を選択し、【作成】をクリックします。
  • 【新しいステップ】をクリックし、「HTTP」を選択し、【HTTP】アクションをクリックします。
  • 以下のように設定します。
方法POST
URIhttps://graph.microsoft.com/v1.0/subscriptions
Content-Typeapplication/json; charset=utf-8
本文{
“changeType”: “created,update,deleted”,
“clientState”: “clientState”,
“notificationUrl”: “受信用フローで作成するURI”,
“resource”: “/users”,
“expirationDateTime”: “2023-05-15T23:59:59+09:00”
}
認証Active Directory OAuth
テナントアプリ登録時に控えたテナントID
対象ユーザーhttps://graph.microsoft.com
クライアントIDアプリ登録時に控えたクライアントID
資格情報の種類シークレット
シークレットアプリ登録時に控えたシークレットキー

テストなのでシークレットキーを直接入力してしまっていますが、本番運用時には、Azure KeyVaultなどを利用してください。 LogicAppsでの方法ですが、やり方は変わらないと思いますので、こちらの記事もあわせて参照してください。

受信用フローの作成

  • Power Automateの画面から【作成】をクリックします。
  • 「自動化したクラウドフロー」をクリックし、【スキップ】をクリックします。
  • 「要求」を選択し、【HTTP要求の受信時】をクリックします。
  • 【新しいステップ】をクリックし、「変数を初期化する」を選択します。
  • 以下のように設定します。
名前validationToken
種類文字列
  • 一度【保存】をクリックします。
  • フローの「HTTP要求の受信時」をクリックし展開すると、「HTTP POSTのURL」が表示されるので、こちらの値をコピーし、送信用フローのnotificationUrl部分に設定します。
  • 【新しいステップ】をクリックし、「変数の初期化」を選択し、以下のように設定します。
名前validationToken
値(式タブを利用してください)triggerOutputs()?[‘queries’]?[‘validationToken’]
  • 【新しいステップ】をクリックし、「条件」をクリックします。
  • 条件式を以下のように設定します。
validationToken次の値に等しくないnull
  • 「はいの場合」の【アクションの追加】をクリックします。
  • 「要求」コネクタアクションの【応答】をクリックします。
  • 以下のように設定します。
状態コード200
ヘッダーContent-Type text/plain
本文validationToken
  • 「いいえの場合」も同様に「応答」アクションを追加し、状態コードを202のみ応答として返るように設定しておきます。(本文設定は不要)
  • フローを保存します。

フローをテストする

ここまで作成できたらフローをテストします。

  • 送信用フローを編集モードで開き、右上の【テスト】をクリックします。
  • 「手動」を選択し、【テスト】をクリックします。

設定に問題がなければ、本文として以下のような値が入ってきます。

{
  "@odata.context": "https://graph.microsoft.com/v1.0/$metadata#subscriptions/$entity",
  "id": "222c9caf-XXXXXXXXXXXXXXXXXX",
  "resource": "/users",
  "applicationId": "XXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXXX",
  "changeType": "created,updated,deleted",
  "clientState": "XXXXXXXXXXX",
  "notificationUrl": "https://prod-20.japaneast.logic.azure.com:443/workflows/XXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
  "notificationQueryOptions": null,
  "lifecycleNotificationUrl": null,
  "expirationDateTime": "2023-05-15T14:59:59Z",
  "creatorId": "85d91d7d-4ab6-XXXX-XXXX-XXXXXXXXXXXXXXXX",
  "includeResourceData": null,
  "latestSupportedTlsVersion": "v1_2",
  "encryptionCertificate": null,
  "encryptionCertificateId": null,
  "notificationUrlAppId": null
}

送信用フローのexpirationDateTimeを2023-05-15T14:59:59Zと今回は設定したので、この通知は2023-05-15T14:59:59Z(UTC)まで有効なため、この間にユーザーの追加や削除等をするとnotificationUrl宛に通知が送られてきます。 ここまでの設定では、通知を受信して応答するところまでの設定しかしていないため、次は通知されてきた内容を処理するためのフローを設定していく必要があります。 それは次の記事にしたいと思います。

まとめ

ただ通知したいだけなのに、めんどくさいです。
Oktaみたいに普通にWebhookを実装してもらえるととても助かるのですが、実装はされないのかな・・・。
GASでも実装できるかもやってみようと思います。
そのほうがお財布には優しい・・・(と思うw

また今回すぐ実行して確認できるように手動フロー実行にしてありますが、通知有効期限が切れてしまうのでスケジュールフローに変更し、expirationDateTimeを自動て更新するような形にする必要がありますので、ご注意ください。

この記事が気に入ったら
フォローしてね!

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!
目次