Ant*_*ère 5 python deployment azure kudu azure-functions
我第一次使用部署管道将 Python 函数应用部署到 Azure:
https://docs.microsoft.com/bs-latn-ba/azure/azure-functions/functions-how-to-azure-devops
该包使用 Kudu Zip 部署部署到 Azure。
我的 http 触发函数在本地运行得很好(在 Windows 上),但我在 Azure 上有 500 个内部错误,因为它没有找到模块requests。
异常:ModuleNotFoundError:没有名为“请求”的模块
__init__.py 的导入:
import logging, requests, os
import azure.functions as func
Run Code Online (Sandbox Code Playgroud)
如果我删除“请求”依赖项,则该函数可在 Azure 上运行(状态 200)。
requests 库由requirement.txt导入,并由构建管道复制到.venv36/lib/site-packages/requests。
所以我想知道包中内置的虚拟环境.venv36是否被Azure中部署的函数使用。没有关于如何在 Azure 中激活虚拟环境的指示。
我们在使用最新版本的 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'
Run Code Online (Sandbox Code Playgroud)
删除虚拟环境步骤,Function App 部署和运行没有任何问题。这似乎不是 Python 最佳实践;但是,这是我们在 Azure DevOps Pipelines 上正确部署它的唯一方法。
另外,在进行此更改之前,我们能够使用 Visual Studio 代码插件进行部署,这向我们表明这是一个环境问题。
https://docs.microsoft.com/en-us/azure/azure-functions/functions-how-to-azure-devops?tabs=python
- 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 --target="./.python_packages/lib/site-packages" -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'
Run Code Online (Sandbox Code Playgroud)
如果你命名你的虚拟环境 worker_venv
命名为您链接的文档中的,它应该可以工作(假设您的管道使用 Linux 环境)。
但是,Python Azure Functions 文档很快就会更新,推荐的方法是不要从部署管道中部署整个虚拟环境。相反,您希望将软件包安装在.python_packages/lib/site-packages
.
你可以这样做——
pip3.6 install --target .python_packages/lib/site-packages -r requirements.txt
Run Code Online (Sandbox Code Playgroud)
代替 -
python3.6 -m venv worker_venv
source worker_venv/bin/activate
pip3.6 install setuptools
pip3.6 install -r requirements.txt
Run Code Online (Sandbox Code Playgroud)
它应该可以正常工作。
确实需要更明确地指出,部署 Azure Functions 时 Python 包的正确目录是.python_packages/lib/site-packages
. 我必须深入研究 Azure Function Core Tools 源代码,看看它们把 Python 包放在哪里。
还必须在 Function 调试控制台中进行挖掘,以查看 Oryx 从哪里获取包。
我猜这里的 3.7 版 YAML 文件中有一个指针,但没有标注该目录的重要性以及它是否适用于 Python 3.8 函数?
如果我没记错的话,这是使用 DevOps 部署 Python Functions 的要求(除非您想安装 Function Core Tools 作为构建管道的一部分!)。
归档时间: |
|
查看次数: |
3032 次 |
最近记录: |