You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何为多个Azure Function Apps构建单一代码库项目结构

单代码库下多Azure Function App的最佳实践与问题排查

我是Azure Functions新手,之前成功部署了包含两个函数的单个Function App。现在需求变更,需要拆分出两个独立的Function App,每个仅包含一个函数。

我不清楚如何在单一代码库中组织项目来容纳多个Function App,Azure官方文档里没找到这个场景的实用指引。

我已经尝试部署了多Function App的结构,但函数无法运行,不确定是不是遗漏了配置或者路径设置错误。下面是单Function App和多Function App的项目结构与代码,希望能得到符合最佳实践的实现建议。


1个Function App含2个函数

单Function App项目结构

function_app.py代码

import azure.functions as func
from function_app_blueprints.http_chatbot_industri import bp as http_chatbot_industri_bp
from function_app_blueprints.http_chatbot_babo import bp as http_chatbot_babo_bp

2个各含单个函数的Azure Function Apps

多Function App项目结构

function_app_babo/function_app.py代码

import azure.functions as func
import logging
from src.chatbot_core.chatbot import Chatbot
from src.common.logging_utils import get_logger

app = func.FunctionApp(http_auth_level=func.AuthLevel.FUNCTION)
   

@app.function_name(name="fun_bamagpt_babo")

@app.route(route="ask_question")
def ask_question(req: func.HttpRequest) -> func.HttpResponse:
    logging.info('Python HTTP trigger function processed a request.')

    logger = get_logger(__name__)
    chatbot = Chatbot(logger)
    logging.info("Initilization completed...")

    # Get question
    req_body = {}
    question = req.params.get('question')
    if not question:
        try:
            req_body = req.get_json()
        except ValueError:
            pass
        else:
            question = req_body.get('question')
    
    logging.info(f'question: {question}')
    
    app = func.FunctionApp(http_auth_level=func.AuthLevel.FUNCTION)
    app.register_functions(http_chatbot_industri_bp)
app.register_functions(http_chatbot_babo_bp)

最佳实践与问题修复建议

1. 项目结构优化

单代码库下多Function App的推荐结构应为:每个Function App作为独立子目录,共享公共代码放在根目录的src或common文件夹,确保依赖和代码复用的同时,保持各Function App的独立性:

your-repo/
├── function_app_industri/
│   ├── function_app.py
│   └── host.json
├── function_app_babo/
│   ├── function_app.py
│   └── host.json
├── src/
│   ├── chatbot_core/
│   │   └── chatbot.py
│   └── common/
│       └── logging_utils.py
└── requirements.txt
  • 每个Function App目录必须包含function_app.py和host.json(可根据需求配置不同的宿主设置)
  • 根目录的requirements.txt统一管理依赖,部署时每个Function App都会使用该依赖文件

2. 代码错误修复

你提供的function_app_babo/function_app.py存在几个关键问题,直接导致函数无法运行:

  • 函数内部重复创建func.FunctionApp实例,覆盖了初始的app对象,导致函数注册失效
  • 错误注册了不属于当前Function App的蓝图http_chatbot_industri_bp
  • 蓝图引用路径不符合新的项目结构

修正后的function_app_babo/function_app.py:

import azure.functions as func
import logging
from src.chatbot_core.chatbot import Chatbot
from src.common.logging_utils import get_logger

# 仅创建一次FunctionApp实例
app = func.FunctionApp(http_auth_level=func.AuthLevel.FUNCTION)

@app.function_name(name="fun_bamagpt_babo")
@app.route(route="ask_question")
def ask_question(req: func.HttpRequest) -> func.HttpResponse:
    logging.info('Python HTTP trigger function processed a request.')

    logger = get_logger(__name__)
    chatbot = Chatbot(logger)
    logging.info("初始化完成...")

    # 获取问题参数
    req_body = {}
    question = req.params.get('question')
    if not question:
        try:
            req_body = req.get_json()
        except ValueError:
            pass
        else:
            question = req_body.get('question')
    
    logging.info(f'问题: {question}')
    
    # 补充参数校验逻辑
    if not question:
        return func.HttpResponse(
             "请提供question参数",
             status_code=400
        )
    
    # 执行业务逻辑(示例)
    response = chatbot.process(question)
    return func.HttpResponse(response)

3. 部署配置

  • 使用Azure CLI部署时,需指定每个Function App的目录路径:
    # 部署第一个Function App
    az functionapp deploy --name <你的工业版函数应用名> --resource-group <你的资源组名> --src-path ./function_app_industri --type zip
    
    # 部署第二个Function App
    az functionapp deploy --name <你的Babo版函数应用名> --resource-group <你的资源组名> --src-path ./function_app_babo --type zip
    
  • 若使用GitHub Actions部署,需为每个Function App创建单独的部署步骤,指定对应的工作目录

4. 依赖与路径验证

  • 本地开发时,确保每个Function App目录能正确引用根目录的src模块,可通过设置Python路径解决:
    # 在每个Function App目录下执行
    export PYTHONPATH=../:$PYTHONPATH
    
  • 部署到Azure时,需确保src目录被包含在部署包中。可在每个Function App目录下创建.funcignore文件,排除不必要文件的同时包含共享代码:
    # .funcignore内容
    __pycache__/
    .venv/
    !../src/
    

内容的提问来源于stack exchange,提问作者szuszfol

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.21 17:22:12