无服务器部署无法运行(Python,Lambda)

3

我有很多代码被抽象到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-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的文件要求,所以我复制了这篇SO文章,现在我遇到了上述错误。
这是我的requirements.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

我的 Serverless Framework 版本为 this 我的 Docker 版本为 20.10.5, build 55c4c88。
我已经花了几个小时搜索,但是人们对于无服务器的问题非常广泛,并且感觉自己已经非常仔细地遵循了 serverless-python-requirements 教程。
编辑:看起来错误中出现的软件包只取决于我在 xkcdrandomizer.py 中首先导入的内容。因此,似乎所有导入的软件包都不能正常工作。
1个回答

2

我想通了。当我遇到libGL.so错误时,那是我离成功最近的时刻,添加opencv“修复”实际上只会导致所有导入失败。

解决方案是将opencv-python-headless放入要求中,而不是opencv-python,因为无头版本适用于没有图形依赖性或类似情况的服务器。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接