我正在尝试运行使用其他软件包的python lambda函数。但是,每当我将.zip文件上传到lambda控制台时,都会出现错误:
{
"errorMessage": "Unable to import module 'lambda_function': No module named '*'",
"errorType": "Runtime.ImportModuleError"
}
我遵循了以下说明:https://docs.aws.amazon.com/lambda/latest/dg/python-package.html#python-package-dependencies,它告诉我确保程序包位于lambda函数本地的目录中:
~/my-function$ pip install --target ./package Pillow
我不使用枕头。这是他们网站上的示例代码。我也没有使用可以在Lambda上访问的软件包。这是我从github获得的,需要附加到我的应用中。
起初这没有用,所以我创建了一个setup.cfg
文件并添加到其中:
[install]
prefix=
现在,当我使用pip
命令安装到目标服务器时,它可以工作(并且还添加了除我的软件包以外的其他文件夹的负载,但是我认为它们是必需的,所以我将它们留在了那里。
当我进入目录时,包就在那里。
然后我找到了这个答案:https://stackoverflow.com/a/12493244/5675125,这表明可能没有包含一些隐藏文件,这就是我应该压缩它们的方式。
再次遇到相同的错误。
如何让lambda识别我的包裹在那里。
答案 0 :(得分:1)
如果您需要Pillow,则在功能中使用它的最简单方法是通过具有公用层(包括枕头)的流行存储库,例如github上的keithrozario / Klayers。要使用它,您将根据您所在的区域找到图层的ARN 。 python 3.8的ARN列表为here。
例如,对于us-east-1
,为Python 3.7添加的层为:
我刚刚使用instabot
创建了自定义图层,并可以确认它是否有效。
所使用的技术包括最近的 AWS博客中所述的 docker工具:
因此,对于这个问题,我验证了,如下所示:
创建空文件夹,例如mylayer
。
转到该文件夹并创建内容为{p>的requirements.txt
文件
instabot
docker run -v "$PWD":/var/task "lambci/lambda:build-python3.8" /bin/sh -c "pip install -r requirements.txt -t python/lib/python3.8/site-packages/; exit"
instabot
需要很大的numpy
。因此,我们手动将其删除,
之前
创建一个图层。我们将改用AWS提供的numpy
层。
sudo rm -rvf ./python/lib/python3.8/site-packages/numpy*
如果不删除numpy,则该层将大于50MB。
zip -9 -r mylayer.zip python
在AWS控制台中基于mylayer.zip
创建lambda层。
不要忘记为Compatible runtimes
指定python3.8
。
在您的函数中添加两层:
第一个是AWSLambda-Python38-SciPy1x
,由AWS与numpy提供,
而第二个是我们上面创建的那个。所以
您的函数将使用两层。
import json
from instabot import Bot
def lambda_handler(event, context):
# TODO implement
bot = Bot(base_path='/tmp')
return {
'statusCode': 200,
'body': json.dumps('Hello from Lambda!')
}