Microsoft Graph API で差分取得(Delta Query) を試してみる

経緯

別チームの仕事だけど、Microsoft Graph を使って差分取得してのデータ同期とかいう楽しそうなことをやっていると聞いたので、興味が湧いたので少し試してみたいというのが動機

PowerShell で確認してみる(それぐらいなら Graph Explorer とか Postman 使えよという声も聞こえそうですががが)

環境

  • Windows 10 Pro
  • PowerShell 7.1.3

1. 前準備

PowerShell から Graph API を呼び出すために下記のことを行います

  1. Azure AD にアプリの登録
  2. アプリにアクセス許可
  3. シークレットの発行を行い必要な情報を控える

1-1. Azure AD にアプリの登録

  1. Azure Portal から Azure AD を開き、リソースメニュー 管理 から [ アプリの登録 ] をクリック
  2. [ + 新規登録 ]をクリック
  3. 下記のように入力して [ 登録 ] をクリック
    • 名前: Delta Query を試すゾ
    • サポートされているアカウントの種類: この組織ディレクトリのみに含まれるアカウント
    • リダイレクトURI:未入力

以上でアプリの登録は完了です

1-2. アプリにアクセス許可

  1. 作成したアプリ Delta Query を試すゾ のリソースメニュー 管理 から [ API のアクセス許可 ] をクリック
  2. [ Microsoft Graph ] をクリック
  3. [ アプリケーションの許可 ] をクリック
  4. User 内の User.Read.All にチェックを入れ、[ アクセス許可の追加 ] をクリック
  5. 画面下の [エンタープライズ アプリケーション] をクリック
  6. [ {テナント名} に管理者の同意を与えます ] をクリック
  7. [ 承諾 ] をクリック
  8. [ 更新 ] をクリックして、管理者の同意が付与されていることを確認

以上でアクセス許可は完了です

1-3. シークレットの発行を行い必要な情報を控える

  1. 作成したアプリ Delta Query を試すゾ のリソースメニュー [ 概要 ] をクリックして、アプリケーション (クライアント) ID の値を控える
  2. リソースメニュー 管理 から [ 証明書とシークレット ] をクリック
  3. クライアント シークレットの [ + 新しいクライアント シークレット ] をクリック
  4. 下記のように入力して [ 追加 ] をクリック
    • 説明: PowerShell で Delta Query を試す
    • 有効期限: 6か月 ※推奨らしい
  5. を控える

以上でシークレットの作成と、必要な情報を控えるは完了です

2. PowerShell で差分取得を試してみる

ここでは、手順 1 で控えた アプリケーション (クライアント) IDシークレットの値 を利用して Graph API を呼び出し、差分取得は Delta Query と呼ばれる方法で行う

  1. 好きな方法で PowerShell 7 の起動
  2. 下記コマンドを実行して、Graph API のトークンを取得
    $tenantDomain = "<組織名>.onmicrosoft.com" 
    $clientId     = "<手順 1-3 の 1 で取得したクライアントID>"
    $clientSecret = "<手順 1-3 の 5 で取得した値>"
    #
    $body = @{
    Grant_Type    = "client_credentials"
    Scope         = "https://graph.microsoft.com/.default"
    client_Id     = $clientId
    Client_Secret = $clientSecret
    }
    #
    $connectGraph = Invoke-RestMethod -Uri "https://login.microsoftonline.com/$tenantDomain/oauth2/v2.0/token" -Method POST -Body $body

    確認したところ、トークンは access_token に入っている

    $connectGraph

  3. 下記コマンドを実行して、Delta Query でユーザー情報を取得
    $token = $connectGraph.access_token
    $uri = "https://graph.microsoft.com/v1.0/users/delta"
    $headers = @{Authorization = "Bearer $($token)"}
    $response = Invoke-RestMethod -Method Get -Headers $headers -Uri $uri

    データが返ってきていることを確認

    $connectGraph | Format-List *


    value に値が入っているようなので、Azure AD のユーザー件数と比較したところ一致

  4. nextLink を踏む
    $nextLink = $response.'@odata.nextLink'
    $nextResponse = Invoke-WebRequest -Method GET -Headers $headers -Uri $nextLink

    レスポンスを確認したら、deltaLink というのがある

    $nextResponse


    この deltaLink を使って差分を確認する

  5. デモユーザー11 を情報を修正して deltaLink を踏む
    $deltaLink = ($nextResponse.Content | ConvertFrom-Json).'@odata.deltaLink'
    $updateResponse = Invoke-WebRequest -Method GET -Headers $headers -Uri $deltaLink

    レスポンスを確認

    $deltaData = ($updateResponse.Content | ConvertFrom-Json)
    $deltaData | Format-List *


    更新したデモユーザー11が、value に入っている

考察

大体動き判ったので、次は色々なパターンで試してみる

参考