无法从AWS Lambda层导入模块

4

我有一个pip软件包的需求文件。 我将其安装在目标文件夹中,然后将内容压缩并上传到AWS Lambda层。

requirements.txt

asgiref==3.2.3
certifi==2019.11.28
chardet==3.0.4
cloudevents==0.2.4
decorator==4.4.1
Django==3.0
idna==2.8
jaeger-client==4.2.0
jsonpath-ng==1.4.3
pbr==5.4.4
ply==3.11
pytz==2019.3
requests==2.22.0
six==1.13.0
sqlparse==0.3.0
urllib3==1.25.7
aws-xray-sdk
mysql-connector-python
gunicorn

我使用命令pip3 install -r requirements.txt -t python/,其中python是目标目录。以下图片显示了python目录的内容。 enter image description here 之后,我将此目录的内容压缩,并将其发布为aws lambda上的层。我创建了一个虚拟lambda函数来检查该层是否有效。
import json
import django

def lambda_handler(event, context):
    # TODO implement
    return {
        'statusCode': 200,
        'body': json.dumps('Hello from Lambda!')
    }

日志文件错误:

Response:
{
  "errorMessage": "Unable to import module 'lambda_function'"
}

Request ID:
"66ce85e0-59f0-4e5c-98f9-6fa3e3eb17d0"

Function Logs:
START RequestId: 66ce85e0-59f0-4e5c-98f9-6fa3e3eb17d0 Version: $LATEST
Unable to import module 'lambda_function': No module named 'django'

END RequestId: 66ce85e0-59f0-4e5c-98f9-6fa3e3eb17d0
REPORT RequestId: 66ce85e0-59f0-4e5c-98f9-6fa3e3eb17d0  Duration: 0.64 ms   Billed Duration: 100 ms Memory Size: 128 MB Max Memory Used: 42 MB  Init Duration: 1.81 ms  

@aviboy2006,是的,我已经将该层添加到上面的lambda函数中了。这就是你所说的映射吗? - Adi shukla
@Reznik 如果我在终端上运行pip3 --version,我会得到 pip 20.1.1 from ~/.local/lib/python3.6/site-packages/pip (python 3.6)而我的Lambda函数的运行时也是Python 3.6。 - Adi shukla
考虑运行 python -m pip install requirement.txt,然后再试一下,也许你有一个 venv 或类似的东西搞砸了事情。 - Reznik
你正在使用虚拟环境吗? - Parsifal
此外,请编辑您的问题以显示您正在使用的确切 pip 命令,以及运行后项目目录的列表。 - Parsifal
显示剩余5条评论
3个回答

4
您提到了“压缩了此目录的内容”,指的是Python文件夹。当您通过.zip包创建层时,Python包需要位于“python”文件夹的子目录中,不能全部位于压缩文件夹的根目录中。请注意这一点。

3

已有答案,但如果还有人遇到自己想制作Python层的情况,以下是我设置工作的方法......

Lambda层所需的.zip目录结构(感谢Ryan Lutz提醒“python”目录):

python/
   fubar /
      __init.py__
      foo.py

__init.py__

from .foo import Foo

foo.py

class Foo:
   def bar(self):
      print("Fubar!")

在添加了层的 Lambda 函数中...

from fubar import Foo

var foo = Foo()
print (foo.bar())

2
如果您需要使用layer,我可以告诉您,我刚刚基于您的requirements.txt文件成功构建了一个django layer,可以在lambda中导入。
构建layer时,我使用了lambci/lambda工具。为了简化流程,我使用了这里的代码片段。
该layer大小为42 MB,接近lambda的50 MB限制。
如果您不想使用layer,您也可以使用相同的docker工具来构建常规部署包,如AWS最近的博客所述: 由于layer可用,因此将django包含在常规包中也应该可行。

我已经按照代码片段中给出的内容做了。我们需要给予特定的权限才能使用图层吗? - Adi shukla
@Adishukla 不需要特殊权限。 - Marcin
现在它正在运行,谢谢!你能看一下这个吗 -> https://stackoverflow.com/questions/62427304/calling-a-django-function-view-from-an-aws-lambda-function - Adi shukla
@Cool。如果您觉得这些问题有用,您能接受它们吗? - Marcin
@Adishukla 谢谢。我查看了新问题,但不幸的是,它超出了我的Django知识范围 :-( - Marcin

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