💻

Linux ベースの Azure Functions 上で PowerShell 関数を実行する時に注意すること

に公開

Tasks for creating PowerShell functions on Linux-based Azure Functions

Flex Consumption の Azure Functions が日本リージョンでも利用できるようになったので、Azure Automation の他、Azure Functions で PowerShell のコードを書く機会が増えました。

2025/07 現在、Azure Functions を利用する際は特段の要件がない限り、Consumption は選択せずに Flex Consumption プランを選択することになると思いますが、Flex Consumption プランは現状、Linux ベースのみのサポートとなっており、Windows を選択できません。

そのため、Flex Consumption プランで PowerShell の Azure Functions 関数を作成する際は、Linux ベースに対応する対処をしなければならないことがわかりましたので、備忘としてこの記事を書きました。
Consumption や Flex Consumption プランを使用する際、Linux ベースの Azure Functions 環境で PowerShell 関数を実行しようとしている場合は、参考にしてください。
ちなみに、Consumption プランの Linux ベースはすでに Legacy 扱いです。

requirements.psd1 を使わず Modules 配下に Save-Module する

オペレーティングシステムが Windows の場合は、requirements.psd1 内に事前にインポートしておきたい Module を定義しておけば良いのですが、Linux ベースの場合、これはうまくいきません。
Flex Consumption プランの Azure Functions 上で PowerShell 関数を実行する際はエラーになるので注意が必要です。

Azure Functions Core Tools を使って func start でローカルデバッグをしたり func azure functionapp publish で関数をデプロイする際には、一切エラーが出ず、問題なく関数が実行できます。

ですが、実際に Flex Consumption 上にアプリをデプロイした後、関数を起動しようとするとエラーになります。

実際のエラーの詳細を Application Insights でみてみると、以下のようなエラーが出力されていることを確認できます。
書いてある通りなんですが、Managed Dependencies (requirements.psd1) は Linux Consumption ではサポートされないから、自分で関数内にモジュール (アプリコンテンツ) として組み込め、と書いてあります。

Result: Failure
Exception: Failed to install function app dependencies. Error: 'Managed Dependencies is not supported in Linux Consumption on Legion. Please remove all module references from requirements.psd1 and include the function app dependencies with the function app content. For more information, please see https://aka.ms/functions-powershell-include-modules.'
Stack: at Microsoft.Azure.Functions.PowerShellWorker.DependencyManagement.DependencyManager.Initialize(ILogger logger) in D:\a\_work\1\s\src\DependencyManagement\DependencyManager.cs:line 129
at Microsoft.Azure.Functions.PowerShellWorker.DependencyManagement.DependencyManager.Initialize(StreamingMessage request, ILogger logger) in D:\a\_work\1\s\src\DependencyManagement\DependencyManager.cs:line 96
at Microsoft.Azure.Functions.PowerShellWorker.RequestProcessor.ProcessFunctionLoadRequest(StreamingMessage request) in D:\a\_work\1\s\src\RequestProcessor.cs:line 230

エラーメッセージ上に記載のリンク (公式の開発リファレンス) にある通り、requirements.psd1 内はすべてコメントアウトし、ルートフォルダ直下に作成した Modules フォルダ配下に requirements.psd1 で定義していたモジュールを Save-Module で持ってきます。

https://learn.microsoft.com/ja-jp/azure/azure-functions/functions-reference-powershell?tabs=portal#including-modules-in-app-content

Save-Module コマンドについては、分からなければ下記を参照しておけばいいです。

https://learn.microsoft.com/ja-jp/powershell/module/powershellget/save-module?view=powershellget-3.x

下記は、Microsoft.Graph モジュールを Save-Module する例です。

cd Modules
Save-Module -Name Microsoft.Graph -Path . -RequiredVersion 2.29.0 -Repository PSGallery

実行すると、Modules フォルダにモジュールがダウンロードされるので、この状態でデプロイをすればいいです。

改めてデプロイ後に関数を実行してみると、問題なく実行できることが確認できます。

ちなみに、下記の記事のように、関数内に Install-Module を避けるために事前にサイト上にモジュールを配置しておく手段もあるようですが、個人的には面倒かつ Linux ベース前提なのであればソースと一緒に組み込んで管理しておいた方が良い気がします。

https://zenn.dev/microsoft/articles/azure-functions-save-module

参考情報

Discussion