Serverless Framework多运行时问题:Python文件未被打包
问题:Serverless Framework中Python Lambda函数未被打包进部署包
现有一个基于Serverless Framework运行正常的Node.js项目,新增Python3.9运行时的Lambda函数后,发现.py文件未被包含在部署zip包中,测试Lambda时出现导入错误。
相关配置与代码
serverless.yml 核心配置
service: salameche custom: stages: - staging - production serverless-offline: httpPort: 3333 provider: name: aws runtime: nodejs12.x stage: ${opt:stage, 'staging'} region: eu-west-1 vpc: ${file(vpc_env.yml):${self:provider.stage}} ... function1: handler: ./pdf/handler.handler timeout: 60 function2: handler: ./database/dump.handler timeout: 60 syncS3ContractModels: handler: ./database/syncbucket.hello runtime: python3.9 plugins: - serverless-stage-manager - serverless-plugin-typescript - serverless-dotenv-plugin - serverless-offline - serverless-step-functions - serverless-python-requirements
syncbucket.py 代码
def hello(event, context): print('This is working!!') return 0
package.json 依赖
"dependencies": { "axios": "^0.19.2", "canvas": "^2.10.1", "lambda-multipart-parser": "^1.0.1", "mysql": "^2.18.1", "pdfjs-dist": "2.5.207", "tslib": "^1.10.0", "typeorm": "^0.2.21", "uuid": "^8.3.2" }, "devDependencies": { "@types/aws-lambda": "^8.10.71", "@types/aws-sdk": "^2.7.0", "@types/node": "^14.14.22", "@types/pdfjs-dist": "2.1.5", "@types/uuid": "^8.3.0", "nodemon": "^2.0.2", "prettier": "^2.6.1", "serverless-dotenv-plugin": "^3.1.0", "serverless-offline": "^6.0.0-alpha.64", "serverless-plugin-aws-alerts": "^1.4.0", "serverless-plugin-typescript": "^2.1.4", "serverless-python-requirements": "^5.4.0", "serverless-stage-manager": "^1.0.5", "serverless-step-functions": "^3.10.0", "typescript": "^3.7.5" },
CloudWatch 错误信息
[ERROR] TypeError: the 'package' argument is required to perform a relative import for '..database.syncbucket' Traceback (most recent call last): File "/var/lang/lib/python3.9/importlib/__init__.py", line 122, in import_module raise TypeError(msg.format(name))[ERROR] TypeError: the 'package' argument is required to perform a relative import for '..database.syncbucket' Traceback (most recent call last): File "/var/lang/lib/python3.9/importlib/__init__.py", line 122, in import_module raise TypeError(msg.format(name))START RequestId: 9926fa36-468c-488f-8209-07544d0e4bbb Version: $LATEST END RequestId: 9926fa36-468c-488f-8209-07544d0e4bbb REPORT RequestId: 9926fa36-468c-488f-8209-07544d0e4bbb Duration: 297.05 ms Billed Duration: 298 ms Memory Size: 512 MB Max Memory Used: 10 MB Unknown application error occurred
问题分析与解决方案
核心原因
- 打包插件过滤:
serverless-plugin-typescript默认仅打包.ts/.js文件,会忽略.py文件,导致Python代码未进入部署包。 - Handler路径格式错误:Python Lambda的handler路径需使用点号层级(而非
./相对路径),否则会触发导入错误。
修复步骤
修正Handler路径格式
修改syncS3ContractModels的handler配置:syncS3ContractModels: handler: database.syncbucket.hello runtime: python3.9配置Package规则,强制包含Python文件
在serverless.yml中添加package配置,确保.py文件被打包:package: patterns: - '**/*.py' - '!node_modules/**' # 保留原有需要打包的文件规则(如TypeScript编译后的js文件等)确保Python依赖插件正常工作
可在custom中补充serverless-python-requirements的配置(根据本地系统调整):custom: # ... 原有配置 pythonRequirements: dockerizePip: non-linux # Windows/macOS环境需开启,Linux可省略清理并重新部署
删除本地.serverless文件夹,执行sls deploy重新打包部署。
内容的提问来源于stack exchange,提问作者Juloblairot
相关产品推荐
相关产品推荐

