Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/amazon-web-services/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用Python使用AWS Lambda层?_Python_Amazon Web Services_Aws Lambda - Fatal编程技术网

如何使用Python使用AWS 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

我有一个简单的Lambda函数,它使用numpy库, 我已经在本地设置了一个虚拟环境,我的代码能够在本地获取和使用库

我尝试使用AWS Lambda的图层,压缩venv文件夹并上传到图层, 然后我将正确的图层和版本附加到我的函数, 但该函数无法获取库

下面是在本地计算机上运行良好的代码-

下面是我压缩并上传的venv结构-

我得到以下错误-

我的Lambda部署如下所示-

我想把这件事提出来-

基于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