【问题标题】:Serverless issue with AWS Lambda and Open CV in PythonAWS Lambda 和 Python 中的 Open CV 的无服务器问题
【发布时间】:2020-09-07 11:33:39
【问题描述】:

我正在开发一个微服务来分析上传到 S3 AWS 存储桶的图像。我正在使用无服务器框架。我正在使用 virtualenv 通过 PIP 和 serverless-python-requirements 插件安装依赖项,以将这些依赖项部署到 Lambda 函数。

但是,由于缺少 .so 文件,我在部署微服务时遇到了错误。我得到的错误是

无法导入模块“handlers.image”:libgthread-2.0.so.0:无法打开共享对象文件:没有这样的文件

我的 serverless.yml 文件是

service: sls-covid

provider:
  name: aws
  runtime: python3.8
  profile: testuser
  stage: ${opt:stage, 'staging'}
  environment: ${file(environment.yml):${self:provider.stage}}
  region: ${self:provider.environment.REGION}

  iamRoleStatements:
    # para poder leer y escribir en el bucket
    - Effect: "Allow"
      Action:
        - "s3:*"
      Resource: "*"

custom:
  pythonRequirements:
    dockerizePip: non-linux


package:
  individually: true
  exclude:
    - node_modules/**
    - env/**
    - package.json
    - package-lock.json

functions:

  analyzeImage:
    # para analizar la imagen cuando se almacena en S3
    handler: handlers.image.analyze
    events:
      - s3:
          bucket: ${self:service}-${self:provider.stage}-images
          event: s3:ObjectCreated:*
          rules:
            - prefix: uploads/

plugins:
  - serverless-python-requirements

相关代码为:

import json
import logging
import boto3
from pydicom import dcmread
import numpy as np
# here the code stops working
import cv2
from pydicom.filebase import DicomBytesIO

logger = logging.getLogger()
logger.setLevel(logging.INFO)

s3 = boto3.client('s3')


def analyze(event, context):

    print("=== event: ", event)

    # code to read uploaded image from bucket and create a ds object 

    # code below is never executed since the error appears when the cv2 library is loaded  

    img = cv2.resize(ds.pixel_array, (224, 224))

而我的requirements.txt内容如下:

numpy==1.18.4
opencv-python==4.2.0.34
pandas==1.0.3
pydicom==1.4.2
python-dateutil==2.8.1
pytz==2018.7
six==1.14.0

我的问题是。如何使用插件将 opencv 依赖项正确上传到我的 lambda 函数?我应该以其他方式执行此操作吗?

谢谢!

【问题讨论】:

  • 你能概括一下这个过程吗?

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


【解决方案1】:

我遇到了同样的问题。我偶然做的是:

  1. 在 ec2 linux 实例上开发。这更容易,因为您在部署之前的开发过程中会遇到所有错误。
  2. 找到丢失的 .so 文件。找 。 -name "libgthread-2.0.so.0"
  3. 在名为“lib”的项目主目录中创建一个名为 lib 的目录。此文件夹包含在 LD_LIBRARY_PATH 中。
  4. 将所需的 libgthread-2.0.so.0 文件复制到 lib 文件夹中。
  5. sls 部署。 现在找到了丢失的 .so 文件。

【讨论】:

    【解决方案2】:

    基于doc,您需要使用dockerExtraFiles 选项手动包含那些。

    ========================更新=======================

    为 AWS Lambda 打包 Python 依赖项和构建部署包可能非常棘手。在四处挖掘之后,这里是你需要做的事情才能让它工作。

    第 1 步:添加 Dockerfile

    FROM lambci/lambda:build-python3.8
    RUN yum -y install libXext libSM libXrender
    

    第二步:修改serverless.yml

    service: sls-covid
    
    provider:
      name: aws
      runtime: python3.8
      profile: testuser
      stage: ${opt:stage, 'staging'}
      environment: ${file(environment.yml):${self:provider.stage}}
      region: ${self:provider.environment.REGION}
    
      iamRoleStatements:
        # para poder leer y escribir en el bucket
        - Effect: "Allow"
          Action:
            - "s3:*"
          Resource: "*"
    
    custom:
      pythonRequirements:
        dockerizePip: non-linux
        ########### BEGIN ###########
        dockerFile: Dockerfile
        dockerExtraFiles:
          - /lib64/libgthread-2.0.so.0
          - /lib64/libglib-2.0.so.0
          - /lib64/libSM.so.6
          - /lib64/libICE.so.6
          - /lib64/libXrender.so.1
          - /lib64/libXext.so.6
          - /lib64/libX11.so.6
          - /lib64/libuuid.so.1
          - /lib64/libxcb.so.1
          - /lib64/libXau.so.6
        ########### END ###########
    
    
    package:
      individually: true
      exclude:
        - node_modules/**
        - env/**
        - package.json
        - package-lock.json
    
    functions:
    
      analyzeImage:
        # para analizar la imagen cuando se almacena en S3
        handler: handlers.image.analyze
        events:
          - s3:
              bucket: ${self:service}-${self:provider.stage}-images
              event: s3:ObjectCreated:*
              rules:
                - prefix: uploads/
    
    plugins:
      - serverless-python-requirements
    

    第 3 步:Hello world 测试

    $ sls invoke -f analyzeImage --log
    null
    --------------------------------------------------------------------
    START RequestId: 00ccd940-cf8a-46ed-8671-65e597f997a0 Version: $LATEST
    === event:  {}
    END RequestId: 00ccd940-cf8a-46ed-8671-65e597f997a0
    REPORT RequestId: 00ccd940-cf8a-46ed-8671-65e597f997a0  Duration: 1.41 ms   Billed Duration: 100 ms Memory Size: 1024 MB    Max Memory Used: 121 MB Init Duration: 916.32 ms
    

    希望对你有帮助。

    【讨论】:

    • 嗨。我从我的计算机添加了该特定文件,但错误仍然存​​在。
    • @Jonathan 我已经更新了我的答案。请看一看。
    • 谢谢!效果很好!由于缓存,我仍然有些挣扎。这导致在 /home/user/.cache/serverless-python-requirements/ 中有一些带有缓存的目录。我不得不删除这些文件,以便 Dockerfile 更改生效。非常感谢!
    • 作为另一个说明。正确加载 dockerExtraFiles 后,您可以在运行 sls deploy 后在无服务器控制台中看到它们的名称。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-10-07
    • 1970-01-01
    • 2021-10-20
    • 2018-08-27
    • 1970-01-01
    • 2019-06-22
    • 1970-01-01
    相关资源
    最近更新 更多