Home > Enterprise >  Azure Function app won't load dependencies
Azure Function app won't load dependencies

Time:09-15

I have checked the requirements.psd1 several times and it all appears right, but the function returns this error when running.

[Warning] The Function app may be missing a module containing the 'Set-AzStorageBlobContent' command definition. If this command belongs to a module available on the PowerShell Gallery, add a reference to this module to requirements.psd1. Make sure this module is compatible with PowerShell 7. For more details, see https://aka.ms/functions-powershell-managed-dependency. If the module is installed but you are still getting this error, try to import the module explicitly by invoking Import-Module just before the command that produces the error: this will not fix the issue but will expose the root cause.
2022-09-13T22:12:00.401 [Error] ERROR: The term 'Set-AzStorageBlobContent' is not recognized as the name of a cmdlet, function, script file, or operable program.Check the spelling of the name, or if a path was included, verify that the path is correct and try again.Exception             :Type        : System.Management.Automation.CommandNotFoundExceptionErrorRecord :Exception             :Type    : System.Management.Automation.ParentContainsErrorRecordExceptionMessage : The term 'Set-AzStorageBlobContent' is not recognized as the name of a cmdlet, function, script file, or operable program.Check the spelling of the name, or if a path was included, verify that the path is correct and try again.HResult : -2146233087TargetObject          : Set-AzStorageBlobContentCategoryInfo          : ObjectNotFound: (Set-AzStorageBlobContent:String)

I am not sure what i'm missing. I've read through other fixes i've found and believe I have it configured correctly. It feels "buggy". Here's my config below:

function.json

{
  "bindings": [
    {
      "name": "Timer",
      "type": "timerTrigger",
      "direction": "in",
      "schedule": "0 * * * * *"
    }
  ]
}

host.json

{
  "version": "2.0",
  "managedDependency": {
    "Enabled": true
  },
  "extensionBundle": {
    "id": "Microsoft.Azure.Functions.ExtensionBundle",
    "version": "[2.*, 3.0.0)"
  }
}

profile.ps1

#if ($env:MSI_SECRET) {
#    Disable-AzContextAutosave -Scope Process | Out-Null
#    Connect-AzAccount -Identity
#}

requirements.psd1

# This file enables modules to be automatically managed by the Functions service.
# See https://aka.ms/functionsmanageddependency for additional information.
#
@{
    # For latest supported version, go to 'https://www.powershellgallery.com/packages/Az'. 
    # To use the Az module in your function app, please uncomment the line below.
     'Az' = '7.*'
     'Az.KeyVault' = '4.*'
     'Az.Storage' = '4.*'
}

and the script that's running

#---------------------------------------------------------[Variables]------------------------------------------------------------

$storageAccountName = 'storageaccount'
$containerName = '$web'
$logContainerName = 'logfiles'
$subscription = 'Subscription'
$resourceGroupName = 'resourcegroup'
$blob = 'info.txt'
$logBlob = 'info.log'
$uri = "https://api.binaryedge.io/v1/minions"

#----------------------------------------------------------[Execution]-------------------------------------------------------------

# Call the API to get the IP addresses
Try {

    $call = Invoke-RestMethod $uri -ErrorAction Stop
    $list = $call.scanners

    # New-TemporaryFile uses [System.IO.Path]::GetTempPath() location
    $tempFile = New-TemporaryFile

    # Set the context to the subscription you want to use
    # If your functionApp has access to more than one subscription it will load the first subscription by default.
    Set-AzContext -Subscription $subscription

    # Get the Storage Account Key to authenticate
    $storAccKeys = Get-AzStorageAccountKey -ResourceGroupName $resourceGroupName -Name $storageAccountName
    $primaryKey = $storAccKeys | Where-Object keyname -eq 'key1' | Select-Object -ExpandProperty value

    # Write the CIDR list to the temp file created earlier
    $list | Out-File $tempFile

    # Create a Storage Context which will be used in the subsequent commands
    $storageContext = New-AzStorageContext -StorageAccountName $storageAccountName -StorageAccountKey $primaryKey

    # Upload the temp file to blob storage
    $setAzStorageBlobContentSplat = @{
        Container  = $containerName
        File       = $tempFile.FullName
        Blob       = $blob
        Context    = $storageContext
        Properties = @{
            ContentType = 'text/plain'
        }
    }

    Set-AzStorageBlobContent @setAzStorageBlobContentSplat -Force

    Write-Host Success!
}


Catch {
    Out-Host $_.exception.message
}

Finally {
    $time = Get-Date
    $tempFile = New-TemporaryFile 
    "Script last completed at $time" | Out-File $tempFile -Append

    $setAzStorageBlobContentSplat = @{
        Container  = $logContainerName
        File       = $tempFile.FullName
        Blob       = $logBlob
        Context    = $storageContext
        Properties = @{
            ContentType = 'text/plain'
        }
    }

    Set-AzStorageBlobContent @setAzStorageBlobContentSplat -Force
}

CodePudding user response:

I would recommend following the suggestion in the warning message and invoking Import-Module Az.Storage just before Set-AzStorageBlobContent. This will probably not fix the issue, but Import-Module will tell you why it cannot load the module.

CodePudding user response:

Figured it out. For whatever reason, Connect-AzAccount is now required. Since I used a managed identity, the command to allow the script to run is Connect-AzAccount -Identity. You also need to add Az.Accounts to the requirements.psd1. This was the fix.

In the profile.ps1 file, I also had to uncomment the lines. This is the default, but I did it to get rid of one of the errors.

I will state for the record...several months ago this was NOT a requirement to make a script run. It also wasn't working in the profiles.ps1 file prior to commenting it out either.

  • Related