无服务器部署不起作用(Python、Lambda)

时间:2021-04-14 03:26:04

标签: python aws-lambda serverless-framework serverless aws-serverless

我有很多代码抽象为 execute():

xkcdrandomizer.py

import xkcd
import cv2
import imageio
import matplotlib.pyplot as plt
import numpy as np
import random
from kumikolib import Kumiko
import tweepy
import json
import os
...
...
...
def handler(event, context):
    statusout = execute()
    body = {
        "message": statusout,
        "input": event
    }
    response = {
        "statusCode": 200,
        "body": json.dumps(body)
    }
    return response

我正在尝试使用 serverless 来部署它,使用 serverless-python-requirements 插件。其中一些是本地包 (kumiko),所以我预计这些包会出错,但我使用 xkcd 得到了一个包,这是一个可通过 pip 获得的包。

这是我的 serverless.yml:

service: xkcdrandomizer

provider:
  name: aws
  runtime: python3.8


functions:
  xkcdrandomizer:
    handler: xkcdrandomizer.handler
    events:
      - schedule:
          rate: cron(0 20 * * ? *)

plugins:
  - serverless-python-requirements
custom:
  pythonRequirements:
    dockerizePip: true
    useDownloadCache: true
    useStaticCache: false
    slim: true
    strip: false
    layer:
      name: ${self:provider.stage}-cv2
      description: Python requirements lambda layer
      compatibleRuntimes:
        - python3.8
      allowedAccounts:
        - '*'

运行 sls deploy 和 sls invoke -f xkcdrandomizer 产生以下错误:

{
    "errorMessage": "Unable to import module 'xkcdrandomizer': No module named 'xkcd'",
    "errorType": "Runtime.ImportModuleError",
    "stackTrace": []
}

以前,我的 yml 只在底部有这个:

custom:
  pythonRequirements:
    dockerizePip: true

但这产生了错误

"errorMessage": "Unable to import module 'xkcdrandomizer': libGL.so.1: cannot open shared object file: No such file or directory",

可能是因为opencv的文件要求,所以我复制了this SO post,现在出现了上面的错误。

这是我的需求.txt:

certifi==2020.12.5
chardet==4.0.0
cycler==0.10.0
idna==2.10
imageio==2.9.0
kiwisolver==1.3.1
matplotlib==3.4.1
numpy==1.20.2
oauthlib==3.1.0
opencv-python==4.5.1.48
Pillow==8.2.0
pyparsing==2.4.7
PySocks==1.7.1
python-dateutil==2.8.1
requests==2.25.1
requests-oauthlib==1.3.0
six==1.15.0
tweepy==3.10.0
urllib3==1.26.4
xkcd==2.4.2

我的 sls 版本是 this 我的docker版本是20.10.5,build 55c4c88

我已经做了几个小时的谷歌搜索,但人们在无服务器方面的问题非常大,感觉就像我非常密切地遵循无服务器-python-要求教程。

编辑:似乎错误中出现的包仅取决于我首先在 xkcdrandomizer.py 中导入的内容。所以似乎所有导入的包都不起作用。

1 个答案:

答案 0 :(得分:2)

我想通了。当我遇到 libGL.so 错误时,这是​​我离成功最近的一次,而添加 opencv“修复”实际上只会使所有导入中断。

解决方案是将 opencv-python-headless 放在需求中而不是 opencv-python,因为 headless 版本是为没有图形依赖性或类似的东西的服务器制作的。 >

相关问题