Ccmmutty logo
Commutty IT
0 pv4 min read

AVDからAzure Functionを安全に呼び出す方法(PowerShell + Entra ID認証)

https://cdn.magicode.io/media/notebox/aa492284-a428-496f-aede-48aaf330c45b.jpeg
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 にそのまま使用する値

  • スコープを 1 つ作成
    • 名前:user_impersonation

③ 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"]
}

全体の流れ(まとめ)

  1. AVD ユーザーが PowerShell を起動
  2. Connect-AzAccount で Entra ID にログイン
  3. Get-AzAccessToken で Function 用トークンを取得
  4. Function に Bearer トークンを付けてリクエスト
  5. Function App の Easy Auth がトークンを検証
  6. 認証が正しければ Function が実行される
クライアントシークレット不要、Managed Identity も不要なので、 AVD 環境との相性が非常に良い構成です。

Discussion

コメントにはログインが必要です。