如何为多个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.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_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
相关产品推荐
相关产品推荐

