使用serverless-python-requirements进行无服务器部署无法运行

6

我正在尝试使用serverless部署一个Python lambda函数。由于需要使用psycopg2库,因此我使用了serverless-python-requirements插件,并将其添加到了我的serverless.yml文件中。

plugins:
  - serverless-python-requirements
custom:
    pythonRequirements:
        dockerizePip: non-linux

我能成功部署该函数:

Serverless: Installing requirements from 
/Users/Desktop/postgresql/.serverless/requirements/requirements.txt ...
Serverless: Docker Image: lambci/lambda:build-python3.6
Serverless: Packaging service...
Serverless: Excluding development dependencies...
Serverless: Injecting required Python packages to package...
Serverless: Uploading CloudFormation file to S3...
Serverless: Uploading artifacts...
Serverless: Uploading service .zip file to S3 (43.07 MB)...
Serverless: Validating template...
Serverless: Updating Stack...
Serverless: Checking Stack update progress...

..............
Serverless: Stack update finished...

但是当我检查我的Cloudwatch日志时,它显示“找不到名为'psycopg2'的模块"。

我的zip文件的结构如下:

    |--node_modules
    |--.gitignore
    |--handler.py
    |--package-lock.json
    |--package.json
    |--serverless.yml

当我运行serverless deploy时,没有创建.serverless/目录...非常感谢您的帮助!
8个回答

6

插件 serverless-python-requirements 使用缓存。在打包服务之前,请确保清除它。此外,psycopg 必须使用 Lambda 环境进行编译:

# serverless.yaml
custom:
    pythonRequirements:
        dockerizePip: true

# bash
$ serverless requirements cleanCache
$ serverless deploy --stage <stage>

1
我在AWS上部署了Python Flask应用程序,在设置过程中遇到了相同的错误。我通过以下方式解决了这个问题,
希望您正在使用虚拟环境,其中安装了所有所需的Python库。我没有看到您的文件夹列表中有虚拟环境文件。您可以查看我的git repo的readme文件,以了解如何从头开始构建。我记录了我遵循的所有步骤 - https://github.com/shyam454/Flask_AWS 注意:该repo可用,但我仍在开发中,因此Readme中提到的端点尚未包含在代码中。但是,它仍然适用于Python + Flask设置
如果您已经有虚拟环境,请执行以下步骤,
在使用serverless部署之前,请执行pip freeze > requirements.txt
此命令将包括您在虚拟环境中安装的所有Python库,以便存在requirements.txt文件中
在serverless.yml文件中添加以下行 plugins: - serverless-wsgi - serverless-python-requirements
现在执行serverless deploy
您可以观察到,无服务器将从requirements.txt安装所有的要求。当serverless正在部署时,您应该会看到以下行:

Serverless:在xxxxxx\ AWS \ Flask_AWS \ requirements.txt中生成要求,并在xxxxxx\ AWS \ Flask_AWS.serverless \ requirements.txt中生成要求...

Serverless:从xxxxxxx\ AWS \ Flask_AWS.serverless \ requirements \ requirements.txt安装要求...

这是它在云端安装Python库的时候,您将不会遇到“没有可用模块”的错误。

希望这能帮助到您。


1

你是否正确安装了Python依赖项?

Serverless 正试图从以下位置安装要求:Serverless: Installing requirements from /Users/Desktop/postgresql/.serverless/requirements/requirements.txt

我建议你执行以下操作:

  • 创建虚拟环境 virtualenv ./env
  • 激活虚拟环境 source env/bin/activate
  • 安装依赖项 pip install psycopg2
  • 冻结本地依赖项 pip freeze > requirements.txt

假设你的代码正在导入依赖项,请使用 Serverless 进行部署。


1

您只需要在requirements.txt文件中定义您的Python依赖项。您可以手动完成这个过程,也可以使用pip freeze命令:

最初的回答:

 pip freeze > requirements.txt

0
  1. 首先创建 Python 的虚拟环境,然后激活或使用全局环境。
  2. 安装 Node.js 并安装 serverless-offline 包(使用下面的命令)。
npm install -g serverless-offline

serverless.yaml 文件

service: XXXX #Name of your App

plugins:
  - serverless-offline

package:
  individually: true
  patterns:
    - '!./**'

然后运行以下命令(如果您使用的是VSCode终端,则需要管理员访问权限才能访问终端,或者最好使用操作系统终端)

serverless -offline

如果您想要部署实时应用程序,则需要创建 Lambda Layer,并在 serverless yaml 文件中使用 Lambda Layer ARN。
functions:
  prodAddFeatures:
    name: prodAddFeatures
    handler: addfeatures/lambda_function.lambda_handler
    events:
      - http:
          path: /about/addfeatures
          method: post
          cors: true
          
    layers:
      - arn:aws:lambda:us-XXXX-1:XXXXXXX:layer:final:3
    package:
      individually: true
      patterns:
        - './addfeatures/lambda_function.py'

然后使用

serverless deploy 

0

我建议您使用AWS Lambda层。 在AWS Lambda层中手动上传psycopg2的工作包。

并在serverless.yml中引用它 name: [您的serverless项目名称] layers: - [aws层包的arn]

注意:在serverless.yml中,layers与name处于同一级别。


0
我也在AWS中运行需要psycopg2的Lambdas,并遇到了部署问题。解决方案是使用aws-psycopg2并将其包含在您的requirements.txt中。

-1
有些晚了,但对于那些遇到类似问题的人来说,这可能会有所帮助。
您正在将要求部署为zip文件。在导入它们到您的Python脚本之前,您必须先解压缩这些要求。在您想要导入库的Python脚本顶部添加此行代码:
try:
 import unzip_requirements
except ImportError:
 pass

如果你想要的话,可以在异常情况下抛出错误,或者只是跳过。


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