如何使用Python使用AWS Lambda层?
我有一个简单的Lambda函数,它使用numpy库, 我已经在本地设置了一个虚拟环境,我的代码能够在本地获取和使用库 我尝试使用AWS Lambda的图层,压缩venv文件夹并上传到图层, 然后我将正确的图层和版本附加到我的函数, 但该函数无法获取库 下面是在本地计算机上运行良好的代码- 下面是我压缩并上传的venv结构- 我得到以下错误- 我的Lambda部署如下所示- 我想把这件事提出来-如何使用Python使用AWS Lambda层?,python,amazon-web-services,aws-lambda,Python,Amazon Web Services,Aws Lambda,我有一个简单的Lambda函数,它使用numpy库, 我已经在本地设置了一个虚拟环境,我的代码能够在本地获取和使用库 我尝试使用AWS Lambda的图层,压缩venv文件夹并上传到图层, 然后我将正确的图层和版本附加到我的函数, 但该函数无法获取库 下面是在本地计算机上运行良好的代码- 下面是我压缩并上传的venv结构- 我得到以下错误- 我的Lambda部署如下所示- 我想把这件事提出来- 基于aws lamda layer doc,该层的zip包必须具有此结构 my_layer.zip
基于aws lamda layer doc,该层的zip包必须具有此结构
my_layer.zip
| python/numpy
| python/numpy-***.dist-info
因此,您需要做的是创建一个python文件夹,并将站点包的内容放在其中,然后压缩该python文件夹。我用一个简单的软件包尝试了一下,它似乎工作得很好
还请记住,有些软件包需要c/c++编译,要使其工作,您必须在具有类似lambda体系结构的机器上安装和打包。通常,您需要在EC2上执行此操作,在EC2上安装和打包与lambda具有类似的体系结构 我已经看到一些库,如numpy和pandas,在使用pip安装时无法在Lambda中工作。我已经成功地使用这些库的.whl包文件来创建Lambda层。请参阅以下步骤: 注意:这些步骤设置了特定于Python 3.7运行时的库。如果使用任何其他版本,则需要下载对应于该Python版本的.whl文件 在这个实例中使用AmazonLinuxAMI和SSH创建一个EC2实例。我们应该在AmazonLinuxAMI中创建我们的层,因为Lambda Python 3.7运行时在这个操作系统上运行 确保此实例已安装Python3和pip工具 通过执行以下命令,下载cp37 Python版本和manylinux1_x86_64操作系统的.whl文件: 如果不使用熊猫,请跳到下一步。通过执行以下命令,下载cp37 Python版本和manylinux1_x86_64操作系统的.whl文件: 接下来,我们将创建一个名为python的目录,并将这些文件解压缩到该目录中: 我们还需要下载pytz库以成功导入numpy和pandas库: 接下来,我们将从包目录中删除“*.dist info”文件,以减小生成层的大小。 这将安装运行pandas和numpy所需的所有库 压缩当前python目录并将其上载到S3存储桶。确保库在给定的层次结构中存在 然后可以使用lambda-layer.zip文件从lambda控制台创建新层。 这是一个有点误导的问题,因为您至少没有提到您使用了无服务器。我从你提供的项目结构的快照中发现了它。这意味着您可能使用serverless在AWS提供程序中部署项目 实际上,有多种方法可以排列lambda层。让我们看看每一个 本地AWS 导航添加图层后,您将发现3个选项: [AWS图层,自定义图层,指定ARN;] 指定一名ARN人员,他为您完成了所有工作: 所以,你需要numpy,好的。在lambda函数中,导航到图层->创建新图层->在3个选项中,选择指定一个ARN并将其作为值放置:ARN:aws:lambda:eu-west-1:770693421928:layer:Klayers-python38-numpy:12。 它将解决您的问题,您将能够使用numpy名称空间 自定义图层 从AWS帐户或组织创建的图层列表中选择图层 对于自定义层,根据您的部署需求,实现方式可能会有所不同。 如果允许您手动完成任务,您应该了解以下内容。我想这对你会有帮助的 AWS图层 至于AWS预构建层,一切都很简单 AWS提供的与函数运行时兼容的层。 可以区分运行时 对我来说,我有一个列表:Perl5、SciPy、AppConfig扩展 无服务器 在serverless中,事情要容易得多,因为您可以使用serverless.yml文件中的lambda定义直接定义层。之后,如何定义它们也可能有所不同 例如: 如果您有任何问题,请随时展开讨论。
干杯 requirements.txt中是否包含numpy?@Paolo yes numpy==1.18.5这是否回答了您的问题@范例不,我试图遵循这一点-我也尝试过像python/lib/python3.7/site-packages/这样的结构,但仍然不起作用,你觉得问题在哪里?我不是说它与本例相关,但对于未来的读者来说。。。一般来说,如果你不需要numpy或其他大型蟒蛇 n像Pandas这样的包,那么我会避免在Lambda中使用它们。
{
"errorMessage": "Unable to import module 'handler': No module named 'numpy'",
"errorType": "Runtime.ImportModuleError"
}
my_layer.zip
| python/numpy
| python/numpy-***.dist-info
$ wget https://files.pythonhosted.org/packages/d6/c6/58e517e8b1fb192725cfa23c01c2e60e4e6699314ee9684a1c5f5c9b27e1/numpy-1.18.5-cp37-cp37m-manylinux1_x86_64.whl
$ wget https://files.pythonhosted.org/packages/a4/5f/1b6e0efab4bfb738478919d40b0e3e1a06e3d9996da45eb62a77e9a090d9/pandas-1.0.4-cp37-cp37m-manylinux1_x86_64.whl
$ mkdir python
$ unzip pandas-1.0.4-cp37-cp37m-manylinux1_x86_64.whl -d python/
$ unzip numpy-1.18.5-cp37-cp37m-manylinux1_x86_64.whl -d python/
$ pip3 install -t python/ pytz
$ cd python
$ sudo rm -rf *.dist-info
$ cd ..
$ zip -r lambda-layer.zip python/
$ aws s3 cp lambda-layer.zip s3://YOURBUCKETNAME