如何通过Azure CLI在单个Azure Function App中部署多Python函数
在单个Azure Function App中部署多个Python函数(HTTP+Blob触发)的配置步骤
你当前的问题源于两个独立的Function项目目录,每个目录都包含完整的Function App配置,发布时会覆盖Azure上的整个Function App内容,而非新增函数。解决方法是将两个函数合并到同一个Function项目下,共享核心配置文件,具体步骤如下:
步骤1:重构目录结构
选择其中一个现有项目作为基础(比如az-func-http),重命名为合并后的主项目目录(例如az-func-combined),然后将另一个函数的核心代码迁移过来。最终目录结构如下:
├── azure-functions │ ├── az-func-combined # 合并后的主项目 │ │ ├── .python_packages │ │ ├── .vscode │ │ ├── .gitignore │ │ ├── function_app.py # 包含两个函数的代码 │ │ ├── host.json │ │ ├── local_settings.json # 合并后的配置 │ │ ├── requirements.txt # 合并后的依赖 │ ├── az-func-blob(备份后可删除) │ ├── az-func-http(备份后可删除) │ ├── README.md
步骤2:合并函数代码
打开az-func-blob中的function_app.py,将Blob触发函数的代码复制到合并后项目的function_app.py中,与原有的HTTP触发函数共存。示例合并后的代码:
import azure.functions as func import logging app = func.FunctionApp() # HTTP触发函数(原az-func-http代码) @app.route(route="HTTPTrigger", auth_level=func.AuthLevel.ANONYMOUS) def HTTPTrigger(req: func.HttpRequest) -> func.HttpResponse: logging.info('Python HTTP trigger function processed a request.') name = req.params.get('name') if not name: try: req_body = req.get_json() except ValueError: pass else: name = req_body.get('name') if name: return func.HttpResponse(f"Hello, {name}. This HTTP triggered function executed successfully.") else: return func.HttpResponse( "This HTTP triggered function executed successfully. Pass a name in the query string or in the request body for a personalized response.", status_code=200 ) # Blob触发函数(原az-func-blob代码) @app.blob_trigger(arg_name="myblob", path="samples-workitems/{name}", connection="AzureWebJobsStorage") def BlobTrigger(myblob: func.InputStream): logging.info(f"Python Blob trigger function processed blob \n" f"Name: {myblob.name}\n" f"Blob Size: {myblob.length} bytes")
步骤3:合并配置文件
- host.json:保留基础项目的
host.json即可(V2模型的配置结构一致,无需修改)。 - local_settings.json:
- 将
az-func-blob中Values节点下的配置项(如Blob触发依赖的AzureWebJobsStorage连接字符串)复制到合并后项目的对应位置,确保所有必要配置齐全。 - 示例合并后的
Values片段:"Values": { "AzureWebJobsStorage": "你的存储账户连接字符串", "FUNCTIONS_WORKER_RUNTIME": "python", "FUNCTIONS_EXTENSION_VERSION": "~4" }
- 将
- requirements.txt:合并两个项目的依赖包,去重后保留所有必要项(比如两个项目默认都依赖
azure-functions,只保留一行即可)。
步骤4:本地验证合并结果
进入合并后的项目目录,执行本地运行命令:
func start
分别测试两个函数:
- HTTP函数:访问
http://localhost:7071/api/HTTPTrigger,传入name参数验证响应。 - Blob函数:向配置的存储容器
samples-workitems上传文件,查看本地控制台的日志输出是否正常。
步骤5:发布到Azure Function App
在合并后的项目目录下,执行发布命令:
func azure functionapp publish SPIEFUNC2
此次发布会将两个函数同时部署到目标Function App中,不会再出现覆盖已有函数的问题。
额外注意事项
- 若之前已发布过单个函数,合并后的发布操作会自动替换Azure上的现有内容,包含两个函数。
- 确保Azure Function App的运行时设置为Python,版本与本地项目一致。
- 生产环境的存储账户连接字符串,建议在Azure Portal的Function App配置页面中设置,而非依赖本地配置文件。
内容的提问来源于stack exchange,提问作者Daniel
相关产品推荐
相关产品推荐

