📊

Azure Functions でマネージド ID を使用して Microsoft Graph API を操作する

2024/03/29に公開

はじめに

Microsoft Graph API を操作するにあたり反復して実行したいケースがあるので、Azure Functions で実行できるようにしました。ちなみに Azure Functions 自体にはそれほど詳しくないので他に良い方法があればコメントお願いします。

設定

以下の手順で進めていきます。Microsoft Graph へのアクセス方法は API と PowerShell の両方を試します。

  1. Azure Functions でシステム割り当てマネージド ID を有効化
  2. マネージド ID に対して Microsoft Graph のアクセス許可を割り当て
  3. Azure Functions に Azure PowerShell モジュールと Microsoft Graph PowerShell モジュールを追加
  4. マネージド ID を使用して Microsoft Graph PowerShell を実行
  5. マネージド ID を使用して Azure Functions の PowerShell でトークンを取得し、Microsoft Graph API を実行

1. Azure Functions でシステム割り当てマネージド ID を有効化

関数アプリのページで [ID] > [システム割り当て済み] タブで [オン] を選択し保存します。

2. マネージド ID に対して Microsoft Graph のアクセス許可を割り当て

こちらの記事および公開ドキュメントをもとに割り当てます。(詳細は割愛)
https://zenn.dev/microsoft/articles/ae0bf38eebfa48
https://learn.microsoft.com/en-us/entra/identity-platform/multi-service-web-app-access-microsoft-graph-as-app?tabs=azure-powershell%2Cprogramming-language-nodejs#grant-access-to-microsoft-graph

割り当てを確認します。Entra ID の [エンタープライズ アプリケーション] > [すべてのアプリケーション] で [マネージド ID] でフィルタして対象のマネージド ID を開き、[アクセス許可] を表示します。

3. Azure Functions に PowerShell モジュールを追加

Azure Functions の [アプリ ファイル] から host.json の "managedDependency" の "Enabled" を true に設定し、requirements.psd1 で Az と Microsoft.Graph を追加します。

【参考ドキュメント】
https://learn.microsoft.com/ja-jp/azure/azure-functions/functions-reference-powershell?tabs=portal#dependency-management
https://azure.github.io/jpazpaas/2022/10/28/Developing-Powershell-script-on-Azure-Functions.html

次に都度モジュールを追加する必要がないように、Save-Module を実行します。
[高度なツール] から Kudu を開き、[Debug console] > [PowerShell] を選択し、以下コマンドを実行します。

cd site\wwwroot
mkdir modules
Install-PackageProvider nuget -Force -Scope CurrentUser
Save-Module <モジュール名> -Path .\modules

【参考ドキュメント】
https://zenn.dev/microsoft/articles/azure-functions-save-module

4. マネージド ID を使用して Microsoft Graph PowerShell を実行

HTTP Trigger で以下のような関数を作成します。(M365 グループを作成)

using namespace System.Net

# Input bindings are passed in via param block.
param($Request, $TriggerMetadata)

# マネージド ID に Microsoft Graph PowerShell にログイン
Connect-MgGraph -Identity

# M365 グループのパラメータを指定
$params = @{
    DisplayName = "Library Assist2"
    MailEnabled = $true
    MailNickname = "library2"
    SecurityEnabled = $true
    GroupTypes = @(
        "Unified"
    )
}
try{
    # グループを作成
    New-MgGroup -BodyParameter $params -ErrorAction Stop
    $response = "New-MgGroup Succeeded."
    $statusCode = 200
}
catch{
    # エラー情報を取得
    $response = $_.Exception.Message
    $statusCode = 400
}

# Associate values to output bindings by calling 'Push-OutputBinding'.
Push-OutputBinding -Name Response -Value ([HttpResponseContext]@{
StatusCode = $statusCode
Body = $response
})

[テストと実行] で以下のようになり、M365 グループが作成されます。

5. マネージド ID を使用して Azure Functions の PowerShell でトークンを取得し、Microsoft Graph API を実行

Microsoft Graph PowerShell が対応していない場合 (Beta も含めるとあまりないと思いますが)、Bearer トークンで API を実行します。まず、Azure PowerShell コマンドで Bearer トークンを取得し、リクエストを構成し、API を実行します。今回は Azure Functions が POST で受け取ったリクエストの Boby をパラメータとして使用しています。

using namespace System.Net

# Input bindings are passed in via param block.
param($Request, $TriggerMetadata)

# Bearer トークンを取得
Import-Module Az.Accounts
Connect-AzAccount -identity
$accesstoken = Get-AzAccessToken -ResourceUrl "https://graph.microsoft.com/"
$token = "Bearer " + $accesstoken.Token
$header = @{
"Authorization" = $token;
"Content-Type" = "application/json"
}
$uri = "https://graph.microsoft.com/v1.0/Groups/"

# パラメータを指定
# $body = '{"displayName":"LibraryAssist3","mailEnabled":true,"mailNickname":"library3","securityEnabled":true,"groupTypes":["Unified"]}'
$body = ConvertTo-Json($Request.Body)

# リクエストを構成
$putRequest = @{
Uri = $uri
Headers = $header
Body = $body
Method = 'POST'
ContentType = 'application/json'
}

# API 実行
$response = Invoke-WebRequest @putRequest

# Associate values to output bindings by calling 'Push-OutputBinding'.
Push-OutputBinding -Name Response -Value ([HttpResponseContext]@{
StatusCode = $response.statuscode
Body = $response.content
})

[テストと実行] で以下のようになり、M365 グループが作成されます。

まとめ

これで Azure Functions から Microsoft Graph API を実行できるようになったので、Logic Apps などと組み合わせて定期的な実行が可能になります。次以降の記事ではこれを生かして、Entra 関連の運用を自動化していきます。

Microsoft (有志)

Discussion