如何在python中部署具有依赖关系的函数?

时间:2016-04-29 17:33:00

标签: python amazon-web-services aws-lambda serverless-framework

我尝试使用serverless框架来创建和部署AWS Lambda函数。我在项目的根目录中创建了一个名为vendored的文件夹,并安装(使用pip install)函数依赖项。但是,每当我尝试运行它时(使用serverless function run),我都会收到错误:

  

无服务器:正在运行isNewUser ...
  无服务器:警告:未定义此变量:区域
  无服务器:-----------------
  无服务器:失败 - 返回此错误:
  无服务器:{"例外":[" Traceback(最近一次呼叫最后一次):\ n"," File \" /home/fernando/.nvm/versions/node/v5.10.1/bin/serverless-run-python-handler \",第170行,在\ n handler = import_program_as_module(path)\ n","文件\" /home/fernando/.nvm/versions/node/v5.10.1/bin/serverless-run-python-handler \",第149行,在import_program_as_module \ n module = make_module_from_file(&# 39; lambda_handler',handler_file)\ n","文件\" /home/fernando/.nvm/versions/node/v5.10.1/bin/serverless-run-python-handler \",第129行,在make_module_from_file \ n py_source_description \ n" ,"文件\" /home/fernando/workspace/os-cac/isNewUser/handler.py \",第11行,在\ n来自vtex.order import order \ n"," ImportError:没有名为vtex.order的模块\ n"],"成功":false}   无服务器:来自Python的异常消息
  无服务器:回溯(最近一次呼叫最后):   ,文件" /home/fernando/.nvm/versions/node/v5.10.1/bin/serverless-run-python-handler" ;,第170行,在       handler = import_program_as_module(path)   ,file" /home/fernando/.nvm/versions/node/v5.10.1/bin/serverless-run-python-handler" ;,第149行,在import_program_as_module中       module = make_module_from_file(' lambda_handler',handler_file)   ,文件" /home/fernando/.nvm/versions/node/v5.10.1/bin/serverless-run-python-handler" ;,第129行,在make_module_from_file中       py_source_description   ,文件" /home/fernando/workspace/os-cac/isNewUser/handler.py" ;,第11行,在       来自vtex.order import order   ,ImportError:没有名为vtex.order的模块   `

vtex.order是在handler.py中导入的模块

我的项目结构如下:

/root/
     |
     |--_meta/
     |--vendored/
                |--dependencies...
     |--function-name/
                     |--handler.py
                     |--event.json
                     |--s-function.json
     |--requirements.txt
     |--admin.env
     |--package.json
     |--s-project.json
     |--s-resources-cf.json
     |--s-project.json

我有什么不对的吗?我应该以某种方式配置我的函数来包含来自vendored的依赖项吗?

3 个答案:

答案 0 :(得分:9)

以下几个步骤可以使其发挥作用:

  1. 确保s-function.json中的处理程序条目在其路径中具有函数名: "handler": "function-name/handler.handler",
  2. handler.py中添加以下内容:

    import os
    import sys
    
    here = os.path.dirname(os.path.realpath(__file__))
    sys.path.append(os.path.join(here, "../vendored"))
    
    from vtex.order import Order
    
  3. 就是这样。如果有效,请告诉我。

答案 1 :(得分:4)

我建议使用serverless-python-requirements插件添加通过pip安装的软件包

答案 2 :(得分:3)

我按照以下步骤使用依赖项进行部署:

  • 在项目根mkdir .vendor

  • 中为依赖项创建了一个目录
  • 手动添加requirements.txt文件中的依赖项或使用pip freeze > requirements.txt

  • 更新serverless.yml文件

package: include: - .vendor/**

  • 将.vendor目录包含在handler.py文件中的系统路径

import sys sys.path.insert(0, './.vendor')

  • 安装依赖项pip install -r requirements.txt -t .vendor

现在serverless deploy将上传具有依赖关系的函数。