Azure Virtual Desktop(AVD)上のユーザーから Azure Function を呼び出す場合、
「Managed Identity が使えない」「クライアントシークレットを PowerShell に書きたくない
という問題があります。
実は、AVD にログインしている Entra ID(旧 Azure AD)アカウントをそのまま使い、
PowerShell から安全に Function を呼び出す方法があります。
本記事では、
「Connect-AzAccount + Get-AzAccessToken」 を使った認証方式で、
AVD → Azure Function の呼び出しを実装する方法をまとめます。
他の方法はないのか
Azure上のリソースでは、Managed Identityを使用した認証が一般的です。
しかしながら、AVD 上のユーザーセッションでは Managed Identity が使えないため、Function にアクセスするには別の認証方式が必要です。
しかし、
- 証明書認証 → SSLインスペクションを使用している環境では使えない、証明書の管理が必要
- Function Key だけでアクセス → 認証が弱い、危険
という問題があります。
AVDはEntra IDを使用していることがほとんどですので、
ユーザー自身の Entra ID のトークンを取得して呼び出す方式が汎用性が高く安全です。
AVD 側(PowerShell)で必要なコード全文
AVD 上でユーザーが実行する PowerShell はこれだけで完結します。
# ===============================
# ① Entra ID にログイン
# ===============================
Connect-AzAccount
# ===============================
# ② Azure Function 用トークン取得
# ===============================
$resourceUrl = "api://<アプリケーションID_URI>" # 必ず Function 用アプリ登録の URI を指定
$token = (Get-AzAccessToken -ResourceUrl $resourceUrl).Token
# ===============================
# ③ Azure Function 呼び出し
# ===============================
$functionUrl = "https://<functionapp>.azurewebsites.net/api/<function>"
$body = @{
message = "hello from AVD"
} | ConvertTo-Json
$response = Invoke-RestMethod `
-Uri $functionUrl `
-Method Post `
-Headers @{ Authorization = "Bearer $token" } `
-ContentType "application/json" `
-Body $body
$response
Azure Function 側で必要な設定
AVD からのトークンで認証できるように、Function 側にも設定が必要です。
やることは以下の 4 つ。
①Azure Functionの「認証」を有効化
- Azure Portal → Function App → 認証
- ID プロバイダー:Microsoft Entra ID
- 認証されていない要求:401(未認証は拒否)
Azure が自動で Bearer トークンの検証を行ってくれます。
② Function 用アプリ登録の「API を公開(Expose an API)」を設定
- Azure Portal → Entra ID → アプリの登録 → 対象アプリ → API を公開
アプリケーションID URI
例:
api://xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
→ PowerShell の $resourceUrl にそのまま使用する値
③ AVD ユーザーにAPI へのアクセス権を付与
- アプリ登録→API permissions
- "My APIs"→Function の API→ user_impersonation
- Grant admin consentを押して有効化
- これで AVD ユーザーは Function 用のトークンを取得できるようになります。
④ unction.jsonのHTTP トリガーの変更
- function.json の authLevel は anonymousに設定する
- 認証は Easy Auth で処理するため、Function Key は使わない構成になる。
例:
{
"authLevel": "anonymous",
"type": "httpTrigger",
"direction": "in",
"methods": ["post"]
}
全体の流れ(まとめ)
- AVD ユーザーが PowerShell を起動
- Connect-AzAccount で Entra ID にログイン
- Get-AzAccessToken で Function 用トークンを取得
- Function に Bearer トークンを付けてリクエスト
- Function App の Easy Auth がトークンを検証
- 認証が正しければ Function が実行される
クライアントシークレット不要、Managed Identity も不要なので、
AVD 環境との相性が非常に良い構成です。