如何连续交付在Azure中部署的python函数应用程序?

时间:2019-11-14 15:58:53

标签: python azure deployment azure-functions kudu

我第一次使用部署管道将Python函数应用程序部署到Azure:

https://docs.microsoft.com/bs-latn-ba/azure/azure-functions/functions-how-to-azure-devops

使用Kudu Zip部署将程序包部署到Azure。

我的http触发函数在本地(在Windows上)运行良好,但是在Azure上却出现500个内部错误,因为它找不到模块请求

  

异常:ModuleNotFoundError:没有名为“ requests”的模块

__ init__.py的导入:

import logging, requests, os
import azure.functions as func

如果删除“请求”依赖项,则该功能将在Azure上运行(状态200)。

请求库由 requirement.txt 导入,并通过构建管道复制到.venv36 / lib / site-packages / requests。

所以我想知道包中内置的虚拟环境.venv36是否被Azure中部署的功能所使用。没有有关如何在Azure中激活虚拟环境的指示。

6 个答案:

答案 0 :(得分:1)

如果您以链接的文档中的名称命名虚拟环境worker_venv,则它应该可以工作(假设您在管道中使用Linux环境)。

但是,Python Azure Functions文档将很快更新,建议的方法是不从部署管道中部署整个虚拟环境。 相反,您想将软件包安装在.python_packages/lib/site-packages中。

您可以做到-

pip3.6 install --target .python_packages/lib/site-packages -r requirements.txt

而不是-

python3.6 -m venv worker_venv
source worker_venv/bin/activate
pip3.6 install setuptools
pip3.6 install -r requirements.txt

它应该可以正常工作。

答案 1 :(得分:1)

使用最新版本的YAML管道模板,我们也遇到相同的问题:

- task: UsePythonVersion@0
  displayName: 'Use Python 3.6'
  inputs:
    versionSpec: 3.6 # Functions V2 supports Python 3.6 as of today

- bash: |
    python -m venv worker_venv
    source worker_venv/bin/activate
    pip install -r requirements.txt
  workingDirectory: $(workingDirectory)
  displayName: 'Install application dependencies'

删除虚拟环境步骤,功能应用程序已部署并运行,没有任何问题。这似乎不是Python的最佳做法。但是,这是我们唯一可以做的事情,以便在Azure DevOps Pipelines上正确部署它。

另外,在进行此更改之前,我们能够使用Visual Studio代码插件进行部署,这向我们表明这是环境问题。

azure-pipelines.yml(我们在Azure DevOps Pipelines上的工作版本)

- master

variables:
  # Azure Resource Manager connection created during pipeline creation
  azureSubscription: '<subscription-id>'

  # Function app name
  functionAppName: '<built-function-app-name>'

  # Agent VM image name
  vmImageName: 'ubuntu-latest'

  # Working Directory
  workingDirectory: '$(System.DefaultWorkingDirectory)/__app__'

stages:
- stage: Build
  displayName: Build stage

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

    steps:
    - bash: |
        if [ -f extensions.csproj ]
        then
            dotnet build extensions.csproj --runtime ubuntu.16.04-x64 --output ./bin
        fi
      workingDirectory: $(workingDirectory)
      displayName: 'Build extensions'

    - task: UsePythonVersion@0
      displayName: 'Use Python 3.7'
      inputs:
        versionSpec: 3.7 # Functions V2 supports Python 3.6 as of today

    - bash: |
        pip install --upgrade pip
        pip install -r requirements.txt
      workingDirectory: $(workingDirectory)
      displayName: 'Install application dependencies'

    - 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: 'production'
    pool:
      vmImage: $(vmImageName)

    strategy:
      runOnce:
        deploy:

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

答案 2 :(得分:1)

肯定需要更明确地指出,部署 Azure Functions 时 Python 包的正确目录是 .python_packages/lib/site-packages。我不得不深入挖掘 Azure Function Core Tools 源代码才能看到 where they put Python packages

enter image description here

还必须在函数调试控制台中四处挖掘,以查看 Oryx 从何处获取包。

enter image description here

我猜 Version 3.7 YAML file here 中有一个指针,但没有标注目录的重要性,它是否适用于 Python 3.8 函数?

enter image description here

如果我没记错的话,这是使用 DevOps 部署 Python 函数的必要条件(除非您想安装 Function Core Tools 作为构建管道的一部分!)。

答案 3 :(得分:0)

您需要分别处理这两个进口,

import azure.functions as func
import requests

答案 4 :(得分:0)

希望我能正确理解您的问题。

在本地计算机上安装时,库会安装在python所在的位置(或至少在实际代码所在的位置之外)。这意味着,在打包代码时,实际上并没有将这些库放在一起。

要解决此问题,您可以使用虚拟环境。 Python提供了一个venv工具(还有一个标准的linux虚拟env工具),您可以通过以下方式运行它:

python -m venv /path/to/my/dir
source /path/to/my/dir/bin/activate 
cd /path/to/my/dir/bin/activate
pip install -r requirements.txt
deactivate

我知道您提到了Windows,所以我建议您使用WSL和ubuntu映像(无论如何通常是一个不错的工具)。也许有一种方法可以使它在Windows中正常工作,尽管我不知道。

编辑:固定格式

答案 5 :(得分:0)

虽然很古老,但是:

* pip(python版本)install --target .python_packages/lib/site-packages -r requirements.txt

例如如果您使用的是3.7,那么 pip3.7 install --target .python_packages/lib/site-packages -r requirements.txt

像魅力一样工作