Microsoft Graph API で差分取得(Delta Query) を試してみる
Contents
経緯
別チームの仕事だけど、Microsoft Graph を使って差分取得してのデータ同期とかいう楽しそうなことをやっていると聞いたので、興味が湧いたので少し試してみたいというのが動機
PowerShell で確認してみる(それぐらいなら Graph Explorer とか Postman 使えよという声も聞こえそうですががが)
環境
- Windows 10 Pro
- PowerShell 7.1.3
1. 前準備
PowerShell から Graph API を呼び出すために下記のことを行います
- Azure AD にアプリの登録
- アプリにアクセス許可
- シークレットの発行を行い必要な情報を控える
1-1. Azure AD にアプリの登録
- Azure Portal から Azure AD を開き、リソースメニュー 管理 から [ アプリの登録 ] をクリック
- [ + 新規登録 ]をクリック
- 下記のように入力して [ 登録 ] をクリック
- 名前: Delta Query を試すゾ
- サポートされているアカウントの種類: この組織ディレクトリのみに含まれるアカウント
- リダイレクトURI:未入力
以上でアプリの登録は完了です
1-2. アプリにアクセス許可
- 作成したアプリ Delta Query を試すゾ のリソースメニュー 管理 から [ API のアクセス許可 ] をクリック
- [ Microsoft Graph ] をクリック
- [ アプリケーションの許可 ] をクリック
- User 内の User.Read.All にチェックを入れ、[ アクセス許可の追加 ] をクリック
- 画面下の [エンタープライズ アプリケーション] をクリック
- [ {テナント名} に管理者の同意を与えます ] をクリック
- [ 承諾 ] をクリック
- [ 更新 ] をクリックして、管理者の同意が付与されていることを確認
以上でアクセス許可は完了です
1-3. シークレットの発行を行い必要な情報を控える
- 作成したアプリ Delta Query を試すゾ のリソースメニュー [ 概要 ] をクリックして、アプリケーション (クライアント) ID の値を控える
- リソースメニュー 管理 から [ 証明書とシークレット ] をクリック
- クライアント シークレットの [ + 新しいクライアント シークレット ] をクリック
- 下記のように入力して [ 追加 ] をクリック
- 説明: PowerShell で Delta Query を試す
- 有効期限: 6か月 ※推奨らしい
- 値 を控える
以上でシークレットの作成と、必要な情報を控えるは完了です
2. PowerShell で差分取得を試してみる
ここでは、手順 1 で控えた アプリケーション (クライアント) ID と シークレットの値 を利用して Graph API を呼び出し、差分取得は Delta Query と呼ばれる方法で行う
- 好きな方法で PowerShell 7 の起動
- 下記コマンドを実行して、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
- 下記コマンドを実行して、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 *
- nextLink を踏む
$nextLink = $response.'@odata.nextLink' $nextResponse = Invoke-WebRequest -Method GET -Headers $headers -Uri $nextLink
レスポンスを確認したら、deltaLink というのがある
$nextResponse
- デモユーザー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 *
考察
大体動き判ったので、次は色々なパターンで試してみる
ディスカッション
コメント一覧
まだ、コメントがありません