マネージドID で完全自動化!Azure Automation × Graph API で SharePoint レポートを定期取得する
今回は、前回の記事で作成した Azure Automation を利用し PowerShell スクリプトを定期実行する方法を解説します。
実行する PowerShell スクリプトは連載 1 回目の 「デバイスコードフロー× Graph API でクイック取得!管理センターでは出せない SharePoint サイト URL 付レポートの出力」 で使用したコードを利用します。
スクリプトの登録と実行 (Runbook の作成)
Runbook とは Azure Automation がクラウド上で実行するスクリプトのことであり、PowerShell や Python などを使用できます。Runbook を作成し、実行するスクリプトを登録します。
- Azure ポータルにアクセスし、作成した Automaiton アカウントを開きます。
- [プロセス オートメーション] – [Runbook] – [Runbook の作成] をクリックします。

- 名前、Runbook の種類、ランタイム環境を設定します。Runbook の種類は 「PowerShell」、ランタイム環境は 「既存から選択する」 をクリックして PowerShell 7.4 のランタイム環境名を選択します。設定後、[確認と作成] をクリックします。

- [作成] をクリックします。

- Runbook の編集画面に Azure Automation で実行するスクリプトを登録します。ここでは、第1回の記事 (Cloud Shell 編) で使用したコードをベースに、Azure Automation で「完全無人化」するための 2 つの調整 を加えました。保存先サイトの URL とライブラリ名は任意に指定ください。
- 一時保存先の変更: Automation の仕様に合わせ、ファイルの作成先を $env:TEMP (一時フォルダ) に変更しています。
- 認証の自動化: Connect-MgGraph に -Identity スイッチを追加し、パスワード不要のマネージド ID 認証に変更しました。
# ========================================================= # SharePoint サイト利用状況レポートの取得・加工・保存スクリプト Azure Automation # 認証方式 : マネージドID (システム割り当て) # 必須モジュール : Microsoft.Graph.Authentication, Microsoft.Graph.Sites # ========================================================= $ErrorActionPreference = "Stop" # ========================================================= # 設定セクション:環境に合わせて以下の値を変更してください # ========================================================= # 【変更点1】 Automation環境の一次フォルダパスに合わせ、\ を使用します $InputFile = "$env:TEMP\BetaReport_Raw.csv" $OutputFile = "$env:TEMP\SharePoint_Usage_With_URL.csv" $TargetSiteUrl = "https://xxxxxx.sharepoint.com/sites/xxxxxx" # アップロード先サイトの URL $TargetLibrary = "Report" # アップロード先のドキュメントライブラリ名 try { # --------------------------------------------------------- # Step 1: 認証 (マネージドIDへの切り替え) # --------------------------------------------------------- if (Get-MgContext) { Write-Output "既存のセッションを切断しています..." Disconnect-MgGraph } Write-Output "Microsoft Graph に接続しています..." # 【変更点2】 -Identity スイッチを使用することで、パスワード不要のマネージドID認証になります Connect-MgGraph -Identity -NoWelcome # --------------------------------------------------------- # Step 2: レポートデータの取得(Graph Beta API) # --------------------------------------------------------- Write-Output "Graph Beta API からSharePoint サイト利用状況レポート(180 日分)を取得しています..." $ReportUri = "https://graph.microsoft.com/beta/reports/getSharePointSiteUsageDetail(period='D180')" Invoke-MgGraphRequest -Method GET -Uri $ReportUri -OutputFilePath $InputFile # --------------------------------------------------------- # Step 3: サイト URL の辞書を作成 # --------------------------------------------------------- Write-Output "テナント内の全 SharePoint サイト情報を取得しています..." $AllSites = Get-MgSite -All -Property "Id,WebUrl" $SiteUrlMap = @{} foreach ($Site in $AllSites) { $SiteId = $Site.Id.Split(',')[1] if (-not [string]::IsNullOrEmpty($SiteId)) { $SiteUrlMap[$SiteId] = $Site.WebUrl } } # --------------------------------------------------------- # Step 4: レポートデータへのサイト URL 結合 # --------------------------------------------------------- Write-Output "レポートデータにサイト URL を結合しています..." $CsvData = Import-Csv -Path $InputFile $ProcessedData = [System.Collections.Generic.List[object]]::new() foreach ($Row in $CsvData) { $TargetSiteId = $Row.'Site Id' $RealUrl = $SiteUrlMap[$TargetSiteId] $DisplayUrl = if ($RealUrl) { $RealUrl } else { "Not Found (削除済みまたは対象外)" } $Row | Add-Member -MemberType NoteProperty -Name 'Site URL' -Value $DisplayUrl -Force $ProcessedData.Add($Row) } $ProcessedData | Export-Csv -Path $OutputFile -NoTypeInformation -Encoding UTF8BOM # --------------------------------------------------------- # Step 5: アップロード先サイトの特定 # --------------------------------------------------------- Write-Output "アップロード先サイトを特定しています..." $HostName = $TargetSiteUrl.Split('/')[2] $SitePath = "/" + $TargetSiteUrl.Split('/', 4)[3] $DestSite = Get-MgSite -SiteId "$($HostName):$($SitePath)" -Property Id if (-not $DestSite) { throw "指定されたサイトが見つかりません: $TargetSiteUrl" } # --------------------------------------------------------- # Step 6: アップロード先ライブラリの特定 # --------------------------------------------------------- Write-Output "ドキュメントライブラリ '$TargetLibrary' を特定しています..." $DestDrive = Get-MgSiteDrive -SiteId $DestSite.Id | Where-Object { $_.Name -eq $TargetLibrary } if (-not $DestDrive) { throw "ライブラリ '$TargetLibrary' が見つかりません。" } # --------------------------------------------------------- # Step 7: SharePoint へのファイルアップロード # --------------------------------------------------------- $TimeStamp = (Get-Date).AddHours(9).ToString("yyyyMMdd_HHmm") $UploadFileName = "SPO_UsageReport_$TimeStamp.csv" Write-Output "SharePoint にアップロードしています: $UploadFileName" $UploadUri = "https://graph.microsoft.com/v1.0/drives/$($DestDrive.Id)/root:/${UploadFileName}:/content" Invoke-MgGraphRequest -Method PUT -Uri $UploadUri -InputFilePath $OutputFile -ContentType "text/csv" | Out-Null Write-Output "---------------------------------------------------" Write-Output "処理が完了しました: $UploadFileName" } catch { Write-Error "エラーが発生しました: $_" throw } finally { Write-Output "Microsoft Graph セッションを切断しています..." if (Get-MgContext) { Disconnect-MgGraph } } -
[保存] をクリックし、必要に応じてテストを実施します。動作に問題なければそのまま [公開] をクリックし、[はい] をクリックします。


- Runbook 概要画面の [開始] – [OK] をクリックします。スクリプトの実行開始後に [出力] タブをクリックすると進捗状態が確認できます。

実行結果の確認
Runbook の実行完了後、出力先に指定した SharePoint のドキュメントライブラリにアクセスすると CSV ファイルが作成されていることが確認できます。
定期実行のためのスケジュール設定
公開した Runbook が正常に動作したら、完全自動化の設定です。
- Runbook の [リソース] – [スケジュール] – [スケジュールの追加] をクリックします。

- [スケジュール] をクリックし、任意のスケジュールを追加します。

- あわせてパラメータと実行環境も既定のままで良いので一度クリックし [OK] をクリックしておきましょう。

- Runbook のスケジュール設定は以上なので、[OK] をクリックします。以降のスクリプトの実行結果は [ジョブ] から確認が可能です。
まとめ
本連載では、全 3 回にわたり以下のステップで解説してきました。
これにより、手動実行から完全無人での定期実行までの一連の流れを構築しています。
従来は、スクリプトの自動実行にあたりパスワードの埋め込みや証明書管理が必要でしたが、現在では実行環境・スケジューラー・認証のすべてをクラウド上で完結させることが可能です。
本記事で紹介した Azure Automation × マネージド ID の構成により、セキュアかつ運用負荷の低い自動化基盤を実現できます。
今回は手動実行時のスクリプトをそのまま自動化しているため、180 日分 (D180) の利用状況を取得する設定となっています。定期運用を前提とする場合は、取得期間を 7 日 (D7) に変更し、週次でデータを蓄積して 前週との差分比較を行う運用も有効です。
Microsoft Graph API を利用した既存のスクリプトも、認証部分をマネージド ID に置き換えるだけで 同様の構成へ移行可能です。そのため、本記事の内容は SharePoint レポート取得に限らず、さまざまな運用自動化シナリオに応用できます。
当社では、Microsoft 365 環境の運用効率化をテーマとした「CI508-H Microsoft 365 PowerShell による管理効率化」 研修コースを提供しています。PowerShell や Graph API を活用した運用自動化について体系的に学びたい方は、ぜひご検討ください。
Microsoft 365 運用 関連コース
-
CI505-H Microsoft 365 運用管理
Microsoft 365 の運用管理に必要な知識と設定すべき項目を理解いただけます。アカウントやデバイス管理に不可欠な Entra ID の基礎知識をはじめ、Exchange Online、Microsoft Teams、SharePoint Online、OneDrive for Business など各サービスにおいて実施すべき設定と推奨設定、理解しておきたい仕組みなど、運用管理に必要な内容を基本から実務レベルまで解説。
-
CI509-H Microsoft 365 デバイス運用管理
Microsoft Defender、Microsoft Purview、Microsoft Entra ID を活用したセキュリティおよびコンプライアンス対策に加え、注目を集める Microsoft 365 Copilot の運用管理など、Microsoft 365 全体の情報保護に関する機能・利用シーン・運用のポイントを具体的に解説。
-
CI506-H Microsoft 365 運用管理 – 情報保護編
Microsoft Defender、Microsoft Purview、Microsoft Entra ID を活用したセキュリティおよびコンプライアンス対策に加え、注目を集める Microsoft 365 Copilot の運用管理など、Microsoft 365 全体の情報保護に関する機能・利用シーン・運用のポイントを具体的に解説。
-
CI508-H Microsoft 365 PowerShell による管理効率化
Microsoft 365 に対する運用管理で PowerShell を利用するための基本や Exchange Online、SharePoint Online、Microsoft Teams を設定するための便利なコマンドライン、設定を自動化するためのスクリプトの作成方法など、PowerShell による Microsoft 365 管理の基本から必須スキルまでを、運用管理に活用できるサンプルを用いて解説。
