あまり知られてないような気がしますが、Microsoft Graph リソースが変更されたときに通知を送ることができます。 つまりAzureADにユーザーが作成されたらTeamsやSlackに通知する等ができるということです。 が、これが結構使えるようにするまでがめんどくさい・・・。 普通にWebhookの設定ができればいいだけだと思うのですが、なぜか色々と面倒な準備が必要です。
今回は通知を受け取るための準備として、Power Automateを利用しての手順をまとめていきます。 必要なシステムは以下のとおりです。
- Power Automate有料ライセンス(開発者向けプランでも可)
- Microsoft 365(ライセンスはどれでもOKですが、今回のやりたいこと的には、AzureADの情報を触れる環境がいいですね)
AzureADへアプリ登録
通知要求を送信するためにも、Graph APIのアクセストークンが必要になるため、AzureADへアプリ登録をする必要があります。
- 「アプリ登録」→【新規登録】をクリックします。
- 名前にわかりやすい名前をつけて【登録】をクリックします。
- 作成したアプリ名をクリックし、「APIのアクセス許可」をクリックします。
- 必要なAPIアクセス許可を付与します。今回はユーザー情報の変更通知を取得したいと思いますので、User.Read.AllがあればOKです。
- 「管理者の同意を与えます」をクリックし、権限を付与します。
- 「証明書とシークレット」をクリックします。
- 【新しいクライアントシークレット】をクリックし、説明欄にわかり易い名前を入力し、有効期限を選択して【追加】をクリックします。
- 表示されたシークレットキーを控えておきます。(ここでしか確認できないので必ず控えてください)
- 「概要」をクリックし、以下の値を控えておきます。
- アプリケーション(クライアント)ID
- ディレクトリ(テナント)ID
Power Automateフロー作成
Power Automateのフローを、送信用と受信用の2つを作成します。
送信用フロー作成
サブスクリプション(通知)には有効期限があるため、利用したいリソースによって、実行間隔を調整してください。
サブスクリプションライフタイム
今回はユーザーリソースを利用したいので、29日以内に再実行する形にすると、期限切れにならないと思いますが、この後に設定する「expirationDateTime」以内に再実行する必要があります。
一旦トリガーをスケジュールではなく、「手動でフローをトリガーします」を設定しフローがうまく動くかを確認するようにしたいと思います。
- Power Automateの画面から【作成】をクリックします。
- インスタントクラウドフローをクリックします。
- 「手動でフローをトリガーします」を選択し、【作成】をクリックします。
- 【新しいステップ】をクリックし、「HTTP」を選択し、【HTTP】アクションをクリックします。
- 以下のように設定します。
方法 | POST |
URI | https://graph.microsoft.com/v1.0/subscriptions |
Content-Type | application/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を自動て更新するような形にする必要がありますので、ご注意ください。