Powershell Function App AZ Module Issue
Description:
In this post, I will build on my previous post where I created a Powershell Function App that will get the next CIDR Range for a VNET. These are the steps I did to build the Function App in the GUI before using terraform to deploy the Function App later through IaC.
To Resolve:
-
So using the UI, I deployed a Powershell Function App using runtime
~4
. I then went to the Code + Test blade and pasted in a basic HTTP template:1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
using namespace System.Net param($Request, $TriggerMetadata) Write-Output "Starting Function App Invocation..." $SubscriptionID = "some-guid" Set-AzContext -Subscription $SubscriptionID $name = $Request.Query.Name $json = @{ "Details" = "Successfully logged into development subscription" "proposedCIDR" = "" "name" = $name } | ConvertTo-Json Push-OutputBinding -Name Response -Value ([HttpResponseContext]@{ StatusCode = [HttpStatusCode]::OK Body = $json })
- Notice that I’m calling the
Set-AzContext
cmdlet because my Function App will be using a Managed Identity to read VNETs. - At this point in the development, I did not pass anything into the
Query
property of the$Request
object because I wanted to isolate tesingAz
cmdlets first.
- Notice that I’m calling the
-
Well before you can use any
Az
cmdlets, you have to enable a few things:- First, the
host.json
managedDependency
needsEnabled: true
to that the Function App run time will automatically download/install any modules you specify. - Next, you specify modules in the
requirements.psd1
. Usually theAz
module is enough, more on that next. - That’s it in general, but I had a few more steps since the goal is to read a VNET I had to:
- Enable System Managed Identity for the Function App
- Set
Reader
role of the Function App Managed Identity to the VNET I was targeting.
- First, the
-
So the issue I had is that even with that simple HTTP script in step 1, I kept getting errors like:
1
Result: Failure Exception: Failed to install function app dependencies. Error: 'Failed to install function app dependencies. Error: 'The running command stopped because the preference variable "ErrorActionPreference" or common parameter is set to Stop: Unable to save the module 'Az'.'' Stack: at Microsoft.Azure.Functions.PowerShellWorker.DependencyManagement.DependencyManager.WaitOnDependencyInstallationTask() in D:\a\_work\1\s\src\DependencyManagement\DependencyManager.cs:line 246 at Microsoft.Azure.Functions.PowerShellWorker.DependencyManagement.DependencyManager.WaitForDependenciesAvailability(Func`1 getLogger) in D:\a\_work\1\s\src\DependencyManagement\DependencyManager.cs:line 164 at Microsoft.Azure.Functions.PowerShellWorker.RequestProcessor.ProcessInvocationRequest(StreamingMessage request) in D:\a\_work\1\s\src\RequestProcessor.cs:line 247
-
And I had set
'Az' = '8.2.0'
because that was one less the latest version as of the time of this post at PowershellGallery. -
So Googling this error did not give me any good hits. I guess I’m just unfortuante that my powershell Function App is having issues loading the
Az
module. -
This is no surprise to me though, have you ever tried installing it? i.e. run
Install-Module -Name Az -Scope CurrentUser -Repository PSGallery -Force
on a new machine? This takes like 10+ minutes and downloads like 30 submodules. -
So I found that you have the option of uploading a Custom Module using the Kudo Advanced tools and uploading, but even that timed out when I was trying to upload my az.zip of all the az modules I had installed on my own machine that I had zipped.
-
This got me thinking, why do I even need that whole thing? So then I commented it out and looked up some recent versions of
Az.Accounts
andAz.Network
instead and put those in therequirements.psd1
. Then everything started working.
-
-
Moral of the story, only import submodules you need your Function App to do. Odd because many sites on the internet freely say to import
Az
parent instead. The easiest way to determine which modules you need is to lookup cmdlets used in your code and see what module they are part of.- For example Set-AzContext docs says its part of
Az.Accounts
module. - For example Get-AZVirtualNetwork docs says its part of
Az.Network
module. You can see I need this in line 1020 of therun.ps1
Function App.
- For example Set-AzContext docs says its part of
Comments