Microsoft Graphの変更通知が止まったとき、subscription期限とlifecycle通知から復旧する

Microsoft Graphの通知停止をsubscription期限、再認可、削除、欠落通知に分け、再開とデータ追いつきを別々に確認します。

AIものさし編集部

Microsoft Graphの変更通知が止まっても、受信アプリの画面が稼働中ならsubscriptionも有効とは限りません。まずsubscriptionの期限と対象resource、更新処理の結果、callbackの受信記録を分けて確認します。通知を再開することと、停止中に欠けたデータを取り直すことは別の作業です。

この記事はMicrosoft Graph v1.0のsubscriptionを管理する連携の診断手順です。特定のTeams連携製品が必ず同じ原因で停止するという説明ではありません。以下の台帳や運用例は架空で、subscriptionの作成・更新やGraph APIの実測は行っていません。

通知の有効期限と処理の最終成功を並べる

管理台帳にsubscription ID、tenant、対象resource、expirationDateTime、通知先、最後の更新成功を対応付けます。表示上の「workflow active」はこの台帳の代用にはなりません。権限のある管理経路で現在のsubscriptionと照合し、保存していたIDだけを信じないようにします。

表は横にスクロールできます

状態確認する事実次の調査
subscriptionの期限が近いAPI応答の期限・更新実行結果期限前更新の失敗箇所
subscriptionが見当たらない作成者・tenant・対象resource閲覧対象の違いか、削除・失効か
期限内だが受信がないcallbackとlifecycleの記録再認可・受信・resource変更の有無
受信はあるがデータが古い後続queue・取得・DB反映通知以降の処理停止

resourceごとにsubscriptionの最大期間が異なります。subscription resourceの公式資料(新しいタブで開く)で対象を確認し、別resourceの上限や利用者の回避策の実行間隔をコピーしません。要求した期限だけでなく、応答で確定した期限を保存します。

renewalとreauthorizationは同じではない

MicrosoftのUpdate subscription(新しいタブで開く)は、subscriptionの期限を更新するAPIです。一方、再認可だけの操作は期限延長と同じではありません。access tokenとsubscriptionの期限も別々に管理します。

表は横にスクロールできます

操作・イベント意味確認する終点
subscriptionの更新期限延長と再認可を行う応答の新しい期限
reauthorize再認可を行う期限延長まで済んだと扱わない
subscriptionRemovedsubscriptionが削除された通知継続が必要なら再作成と同期
missed一部通知が届かなかった通知resourceデータの再同期

公式lifecycle資料は、同じsubscriptionへreauthorizeとPATCH更新を10分以内に発行しないよう注意しています。両方が必要なら期限を更新する一回のPATCHで行う方法が説明されています。定期更新ジョブとlifecycle handlerが同時に走る設計では、対象IDごとに処理を調整し、重複した更新要求を無制御に送らないようにします。

更新失敗が権限や認証の問題なら、期限を長く要求し直すだけでは解消しません。対象resourceへのアクセスが現在も許可されているかを確認します。障害復旧を理由に必要以上のpermissionを追加する手順には進みません。

lifecycle通知はresourceごとの対応を確認する

Microsoft Graphのlifecycle通知(新しいタブで開く)にはreauthorizationRequired、subscriptionRemoved、missedがあります。ただし、すべてのresourceで三種類を受けられるわけではありません。公式のSupported resourcesでは再認可通知は全resource、削除・欠落通知にはそれぞれ対象resourceの制限があります。

たとえばTeams chatMessageで削除通知が対応していても、同じ前提でmissed通知まで届くと期待しません。対応表をresourceと通知種別の組合せで確認します。通知が来なかったことを、欠落がなかった証明にはできません。

既存subscriptionにlifecycleNotificationUrlがない場合、公式資料はPATCHで後付けできず、指定して作り直す必要があると説明しています。単なる期限更新とこの変更を混同しないでください。作り直す場合は、重複・空白期間・受信endpointの検証と再同期を含む変更として計画します。

handlerは通知の状態を分類する

受信側では登録済みsubscriptionとの対応や通知の正当性を確認し、対象IDとlifecycle種別を分けて処理します。一つのcollectionに複数通知が含まれる場合、先頭だけを見て全件を同じ状態にしません。受信受付と後続の復旧処理を追跡できるようにします。

表は横にスクロールできます

lifecycle種別復旧作業の方向別に残す確認
reauthorizationRequired有効な認証条件で再認可または期限更新停止区間の変更回収
subscriptionRemoved必要なアクセスを確認してsubscription再作成新ID・期限と欠落区間
missedresourceの再同期通知再開とデータ反映完了

handlerが成功応答を返しただけではGraph側の更新は完了しません。受付、更新要求、API応答、台帳保存、同期完了を別々の状態にします。具体的な再試行はAPIエラーに従い、429ならRetry-Afterなどを確認します。古い通知が届いても、新しいsubscriptionの状態を古いIDで上書きしない設計にします。

通知の再開後に欠落区間を回収する

通知が再び一件届いても、停止中の全変更が自動で届いたとは言えません。公式資料は、停止区間をresourceデータの同期で補う必要を説明し、delta queryなどを例示しています。利用resourceが対応する取得・同期APIを確認し、別resourceのdelta endpointを流用しません。

架空の台帳なら「最後のデータ同期成功09:00」「通知停止を検出10:30」「subscription再作成10:40」「再同期完了10:50」と分けます。10:40の通知再開を復旧完了とせず、対象データの追いつきと未処理queueを確認してから閉じます。通知の重複や再同期で同じ対象を処理しても、二重作成・二重通知にならないようにします。

確認した公式資料