如何在AWS Lambda函数中降级boto3版本

时间:2019-04-30 17:49:16

标签: python python-3.x aws-lambda python-packaging aws-lambda-layers

我需要在Lambda(Python 3.7)中使用自己的boto3版本。 Lambda默认Python 3.7 env(1.9.42)中包含的版本由于某种原因不支持使用Textract。

为此,我基于guide进行了以下操作:

  1. 使用以下命令创建自定义程序包:
    • pip freeze > requirements.txt将产生以下文件:
# requirements.txt
boto3==1.9.138
botocore==1.12.138
docutils==0.14
jmespath==0.9.4
python-dateutil==2.8.0
s3transfer==0.2.0
six==1.12.0
urllib3==1.24.2
  • mkdir build
  • pip3 install -r requirements.txt -t build/
  • cd build
  • zip -r ../boto3_layer.zip .

然后,我使用GUI上传新的Lambda层(称为boto3Layer)。 然后,将图层成功添加到Lambda函数中。

问题是,我不知道如何使用内联代码编辑器将所述图层导入到我的代码中。

我有以下代码:

...
from boto3_layer as boto3
...
log.info(boto3)

我收到错误"errorMessage": "Unable to import module 'lambda_function': No module named 'boto3_layer'"

我也尝试仅导入boto3,但是确认它是错误的版本(这是Lambda使用的版本),因此我的导入没有覆盖它。

我想简单地知道如何将我的自定义层导入到我的代码中!谢谢

编辑:尝试建议:

  1. virtualenv python --python=python3.7
  2. source python/bin/activate然后是pip3 install boto3
  3. zip -r boto3_layer.zip python/lib/
  4. 使用boto3_layer.zip创建新的Lambda层,并将层添加到Lambda函数中
  5. 试图运行上述保存代码 失败"errorMessage": "Unable to import module 'lambda_function': No module named 'boto3_layer'",

这最终通过导入boto3而不是我的自定义名称来完成。

import boto3

def lambda_handler(event, context):
  textract = boto3.client('textract')

2 个答案:

答案 0 :(得分:4)

目录将不是模块/软件包。您使用的方法将永远无法使用。

而不是所有这些,而是​​使用所需的Python版本创建一个虚拟环境-可能在docker中安装软件包。然后,您必须从虚拟环境中压缩lib文件夹,以便在解压缩该层时将产生类似于

的目录结构
python/
    lib/
        pythonx.y/
            site-packages/
                ...

必须将顶层目录命名为python

如果正确执行此操作,则应该能够正常导入boto3的版本。

答案 1 :(得分:-1)

lambda中的文件将解压缩到名为/opt的目录中,并将包含在PYTHONPATH中。这意味着您在zip结构中确实需要一个额外的boto3_layer。