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

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

问题分析与解决方案

核心原因

  1. 打包插件过滤:serverless-plugin-typescript默认仅打包.ts/.js文件,会忽略.py文件,导致Python代码未进入部署包。
  2. Handler路径格式错误:Python Lambda的handler路径需使用点号层级(而非./相对路径),否则会触发导入错误。

修复步骤

  1. 修正Handler路径格式
    修改syncS3ContractModels的handler配置:

    syncS3ContractModels:
      handler: database.syncbucket.hello
      runtime: python3.9
    
  2. 配置Package规则,强制包含Python文件
    在serverless.yml中添加package配置,确保.py文件被打包:

    package:
      patterns:
        - '**/*.py'
        - '!node_modules/**'
        # 保留原有需要打包的文件规则(如TypeScript编译后的js文件等)
    
  3. 确保Python依赖插件正常工作
    可在custom中补充serverless-python-requirements的配置(根据本地系统调整):

    custom:
      # ... 原有配置
      pythonRequirements:
        dockerizePip: non-linux # Windows/macOS环境需开启,Linux可省略
    
  4. 清理并重新部署
    删除本地.serverless文件夹,执行sls deploy重新打包部署。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 17:40:29