azure 函数应用PowerShell -使用模块发布函数

czq61nw1  于 2023-06-24  发布在  Shell
关注(0)|答案(3)|浏览(143)

将PowerShell函数发布到函数应用程序时遇到了一个奇怪的问题。功能应用程序使用Windows消费和Y1应用程序服务计划。
该函数使用模块目录中存在的5个不同的Az模块作为包的一部分:

  • Az.Accounts
  • Az.Resources
  • Az.Compute
  • Az.Sql
  • Az.SqlVirtualMachine

文件结构如下所示:

wwwroot/
| - .funcignore
| - ahubReporter
| | - function.json
| | - readme.md
| | - run.ps1
| - host.json
| - Modules
| | - Az.Accounts
| | - Az.Compute
| | - Az.Resources
| | - Az.Sql
| | - Az.SqlVirtualMachine
| - profile.ps1
| - requirements.psd1

注:未启用managedDependency,并且不会自动下载Az模块。这些模块包含在Modules目录下的源代码中,并随函数
如果使用Azure函数扩展通过vscode手动发布函数,则该函数可以正常工作和运行。
但是,如果我使用命令Publish-AzWebApp通过Azure DevOps任务AzureFunctionApp@2或Azure PowerShell任务AzurePowerShell@5发布函数,则函数已发布,但不会运行,并且我会收到以下错误:

The 'Get-AzLocation' command was found in the module 'Az.Resources', but the module could not be loaded. For more information, run 'Import-Module Az.Resources'.

Azure DevOps Pipeline配置为使用Windows代理。
Azure DevOps任务AzureFunctionApp@2是:

- task: AzureFunctionApp@2
  displayName: 'Publish Function | package'
  inputs:
    azureSubscription: ${{ parameters.customerServiceConnection }}
    appType: functionApp
    appName: $(functionName)
    package: $(System.ArtifactsDirectory)/**/*.zip
    deploymentMethod: 'runFromPackage' # <--- I've tried auto as well

Azure DevOps任务AzurePowerShell@5是:

- task: AzurePowerShell@5
  displayName: 'Publish Function | azpwsh'
  inputs:
    azureSubscription: ${{ parameters.customerServiceConnection }}
    ScriptType: 'InlineScript'
    Inline: 'Publish-AzWebapp -ResourceGroupName $(functionAppRg) -Name $(functionName) -ArchivePath $(System.ArtifactsDirectory)/build$(Build.BuildId).zip -Force'
    azurePowerShellVersion: 'LatestVersion'
     pwsh: true

谢谢!

s5a0g9ez

s5a0g9ez1#

我对此进行了一点调查,因为错误消息表明PSModulePath没有正确配置,因为它可以定位函数/cmdlet和模块,但无法加载。
据我所知,当初始化worker时,项目根目录中的Modules文件夹会附加到PSModulePath中。
我很快在一个devcontainer中构建了一个项目来做一些测试,并按照您的建议禁用了托管依赖项。
运行Save-Module以保存Az.Resources模块,并将其添加到项目中的Modules文件夹中。
当运行项目时,您可以看到比从AzDo或门户网站更详细的日志,并且有大量的错误来自内部命令Az.Resources & Az.Accounts还有内部模块Az.Authorisation & Az.MsGraph,其中显示在日志中Newtonsoft冲突错误。

Message        : The 'Get-AzLocation' command was found in the module 'Az.Resources', but the module could not be loaded. For more information, run 'Import-Module Az.Resources'.
[2023-06-09T10:22:21.599Z]     Data           : System.Collections.ListDictionaryInternal
[2023-06-09T10:22:21.599Z]     InnerException : 
[2023-06-09T10:22:21.599Z]         Type           : System.Management.Automation.CmdletInvocationException
[2023-06-09T10:22:21.599Z]         ErrorRecord    : 
[2023-06-09T10:22:21.599Z]             Exception             : 
[2023-06-09T10:22:21.599Z]                 Type       : System.IO.FileLoadException
[2023-06-09T10:22:21.600Z]                 Message    : Assembly with same name is already loaded
[2023-06-09T10:22:21.600Z]                 TargetSite : 
[2023-06-09T10:22:21.600Z]                     Name          : Bind_LoadAssemblies
[2023-06-09T10:22:21.600Z]                     DeclaringType : initialsessionstate
[2023-06-09T10:22:21.600Z]                     MemberType    : Method
[2023-06-09T10:22:21.600Z]                     Module        : System.Management.Automation.dll

我把项目推到了Github这里,这样你就可以看到它产生的错误了
https://github.com/brettmillerb/stackoverflowTest
出于好奇,您是否尝试过使用Azure Functions Deploy v2任务而不是PowerShell任务并使用PowerShell等效任务?

- task: AzureFunctionApp@2
  displayName: Azure Function App Deploy
  inputs:
    azureSubscription: $(azureSubscription)
    appName: samplefunctionapp
    appType: functionApp
    package: $(System.DefaultWorkingDirectory)/**/*.zip

https://learn.microsoft.com/en-us/azure/devops/pipelines/tasks/reference/azure-function-app-v2?view=azure-pipelines

mjqavswn

mjqavswn2#

而不是将您的Powershell模块添加到单独的Module文件夹中,直接将它们添加到requirements.psd1文件夹中,requirements.psd1将自动为您下载这些包。
我运行了一个Azure DevOps管道来部署Azure Powershell HTTP触发器,并且成功了,参考下面:

我的仓库:-

requirements.psd1

@{
    'Az' = '9.*'
    'Az.Accounts' = '1.1.0'
    'Az.Compute' = '0.5.0'
    'Az.Resources' = '6.7.0'
    'Az.Sql' = '4.7.0'
    'Az.SqlVirtualMachine' = '2.0.0'
}
trigger:
- main

variables:

  azureSubscription: 'xxxxxxxxx-52801a7de72a'

  functionAppName: 'siliconfunc5431'

  vmImageName: 'windows-2019'

  workingDirectory: '$(System.DefaultWorkingDirectory)/'

stages:
- stage: Build
  displayName: Build stage

  jobs:
  - job: Build
    displayName: Build
    pool:
      vmImage: $(vmImageName)

    steps:
    - powershell: |
        if (Test-Path "extensions.csproj") {
            dotnet build extensions.csproj --output ./$(workingDirectory)/bin
        }
      displayName: 'Build extensions'

    - task: ArchiveFiles@2
      displayName: 'Archive files'
      inputs:
        rootFolderOrFile: $(workingDirectory)
        includeRootFolder: false
        archiveType: zip
        archiveFile: $(Build.ArtifactStagingDirectory)/$(Build.BuildId).zip
        replaceExistingArchive: true

    - publish: $(Build.ArtifactStagingDirectory)/$(Build.BuildId).zip
      artifact: drop

- stage: Deploy
  displayName: Deploy stage
  dependsOn: Build
  condition: succeeded()

  jobs:
  - deployment: Deploy
    displayName: Deploy
    environment: $(functionAppName)
    pool:
      vmImage: $(vmImageName)

    strategy:
      runOnce:
        deploy:

          steps:
          - task: AzureFunctionApp@1
            displayName: 'Azure functions app deploy'
            inputs:
              azureSubscription: '$(azureSubscription)'
              appType: functionApp
              appName: $(functionAppName)
              package: '$(Pipeline.Workspace)/drop/$(Build.BuildId).zip'

入口:-

如果你想运行模块文件,请确保在下面的PowerShell任务中导入或安装它们,然后运行函数发布任务。

Import-Module -Name Az.Accounts -Force
Import-Module -Name Az.Resources -Force
Import-Module -Name Az.Compute -Force
Import-Module -Name Az.Sql -Force
Import-Module -Name Az.SqlVirtualMachine -Force

如果错误仍然存在,请通过启用诊断或在PowerShell命令的末尾添加--Verbose标志来运行管道,如下所示:

- task: AzurePowerShell@5
  displayName: 'Publish Function | azpwsh'
  inputs:
    azureSubscription: ${{ parameters.customerServiceConnection }}
    ScriptType: 'InlineScript'
    Inline: 'Publish-AzWebapp -ResourceGroupName $(functionAppRg) -Name $(functionName) -ArchivePath $(System.ArtifactsDirectory)/build$(Build.BuildId).zip -Force -Verbose'
    azurePowerShellVersion: 'LatestVersion'
    pwsh: true
s8vozzvw

s8vozzvw3#

好的我修好了。
虽然,我仍然不明白为什么它不能使用Azure DevOps任务AzureFunctionApp@2或Azure PowerShell任务AzurePowerShell@5使用命令Publish-AzWebApp,但如果它通过vscode发布,它就会工作。
基本上,我简化了代码(我最初没有写),删除了模块并更新了以下文件:

host.json

启用managedDependency

{
  "version": "2.0",
  "logging": {
    "applicationInsights": {
      "samplingSettings": {
        "isEnabled": true,
        "excludedTypes": "Request"
      }
    }
  },
  "extensionBundle": {
    "id": "Microsoft.Azure.Functions.ExtensionBundle",
    "version": "[3.*, 4.0.0)"
  },
  "functionTimeout": "00:10:00",
  "managedDependency": {
    "enabled": true // <----- This
  }
}

requirements.psd1

删除'Az' = '10.*'并添加以下内容:

@{
    'Az.Accounts' = '2.12.3'
    'Az.Compute' = '6.0.0'
    'Az.Resources' = '6.7.0'
    'Az.Sql' = '4.7.0'
    'Az.SqlVirtualMachine' = '2.0.0'
}

谢谢大家的回应。每个人都给了我一些想法,我只是结束了尝试不同的配置和增强原始代码。
谢谢!

相关问题