はまったりひらめいたり…とか…

Angularや.NETやAzureやその他色々。

SubscriptionのLifecycleNotificationUrlをいじってみた

Subsriptionのライフサイクル通知が存在するようです。

サブスクリプションと変更通知の消失を減らす

Docsの履歴を見る感じだと機能自体は2020年の7月くらいに使用できるようになってたみたいなのですが

Microsoft Graphの変更ログに上がってきていなかったため気づくことができなかったようです。無念。

さて、その機能のおかげでSubscriptionの通知のライフサイクルの管理問題が解決することができるかも…?と思ったので試してみました。

(通知のライフサイクルが切れたり…な管理を楽にできれば良いなー。。。的な

詳細な使い方を見ていこうと思います。

ライフサイクル管理を行う

Subsriptionを作成する際にライフサイクル通知の通知先としてlifecycleNotificationUrlを指定。

この際、通常の変更通知でやるのと同様に、エンドポイントの検証を実装。

加えて、通常の通知先とライフサイクル通知の通知先は同じホスト名を指定する必要があるようです。

既存のSubscriptionにPATCHメソッドを使用してライフサイクル通知先を指定することはできないようなので

既存の変更通知がある場合は作成し直すしかなさそうです。

さて、例のごとくFunctionsに通知先を作成し、動作を確認してみようと思います。

ホスト名が違う状態を指定してみる

どんなエラー出るのか試したかったんですが…できちゃったんですよねぇ…

f:id:TakasDev:20201103121706p:plain

Functionsのログを見てみます。

f:id:TakasDev:20201103122727p:plain

ResourceNotifications(通常の通知先)は問題なく通知が来ているようですので別エンドポイントでもワンチャン動くかもしれません。

ひとまず以降の処理でおかしなことになるかもなので、同一のエンドポイントにしてから検証を続行していきます。

どんなときにLifecycle通知が発生するのか色々試してみる

有効期限後のログを見てみる

"expirationDateTime": "2020-11-03T03:30:00Z",を指定しているので12:30以降にどのようなログが出力されるか確認してみます。

  1. 変更通知作成
  2. 通知時間切れまでまつ
  3. 予定情報変更

有効期限後についてはLifecycle通知は行われませんでした。

有効期限切れも通知してくれたらexpirationDateTimeの管理も楽になると思ったのですが残念ですね。

手動でSubscriptionを削除してみる

手動で作成した変更通知を削除したあと、Lifecycle通知が捕捉できるか試してみます。

  1. 変更通知作成
  2. 1.で作成した変更通知を削除
  3. 予定情報変更

手動削除もLifecycle変更通知は捕捉できませんでした。

ユーザーのパスワードを変更/削除してみる

Documentには下記の条件のときのみに発生すると記載されています。

  • ユーザーのパスワードがリセットされた場合
  • ユーザーのデバイスが準拠しなくなった場合
  • ユーザーのアカウントが取り消された場合

意図しないSubscriptionの削除を補足する。といった機能のようですね。

そこでユーザーのパスワードを変更する方法で動作を検証してみます。

変更通知は下記の通りの内容で設定します。特定ユーザーの予定作成/変更時です。

このユーザーのパスワードをリセットを行うことでLifecycleNotificationが呼び出されるか検証します。

順序としては下記のとおりです。

  1. 変更通知作成
  2. 変更通知を作成したユーザーのパスワードリセット
  3. 予定情報変更

結果、下記のようなJSONがLifecycleNotification側に通知されました。

{
  "value": [
    {
      "subscriptionId": "6482c2c2-96ba-4505-b375-4329c1aad3d4",
      "subscriptionExpirationDateTime": "2020-11-24T16:00:00-08:00",
      "clientState": "<state>",
      "tenantId": "<tenantId>",
      "lifecycleEvent": "subscriptionRemoved"
    }
  ]
}

通常のNotification側への変更通知は発生せず、Lifecycleの通知だけ発生していることも確認できました。

f:id:TakasDev:20201123145731p:plain

Microsoft365側の都合による変更通知の削除によってLifecycle通知が発生することが確認できました。

通常通知先を潰してみる

通知先を潰してmissedを捕捉できるか試してみました。

AzureFunctionsに公開しているリソースエンドポイントをリネームして公開しなおしただけです。

ただ、これは捕捉できませんでした。

Document的には、Microsoft365側で配信されなかった変更通知があった場合に呼び出されるようです。

ただ、こちらは先のように具体的な例がなかったのでどのような状況の時に実行されるかはわかりませんでした。

  1. 通知先潰す
  2. Outlookイベント変更
  3. 復活させる
  4. Outlookイベント変更

としたら通知されてない2のデータがでてくる?と思ったけど出てきませんでした。

Microsoft365内で何かしら起きて変更通知の整合性が合わなくなったときに通知されるものかもですね。

まとめ

サブスクリプションと変更通知の消失を減らすで紹介されていた動作を見てきました。

動作させてみて分かった通り、Microsoft365側からのアクションで、動作しなくなった変更通知の通知ということがわかりました。

Microsoft365側からのアクションによる変更通知未実行というのは、補足しにくいものではあるので一定の効果はあると思います。

ただ、通知の有効期限切れや通知先の消失なんかの問題は変わらず自分で管理しないといけない。という状況です。

まだまだApplication Insightなどを使用したり、定期的に変更通知の状況を監視するといった工夫は必要そうです。

実験に使ったソースコードこちらです。