无法从 aws lambda 层导入模块
Unable to import modules from aws lambda layer
我有一个 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 目录的内容。
在此之后,我压缩了这个目录的内容并将其发布为 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
如果 layer 适合您,我可以告诉您,我刚刚 成功构建了一个 django 层 基于您的 requirements.txt
文件,可以在 lambda 中导入。
为了构建图层,我使用了 lambci/lambda tool. To ease the process, I used the following snippet from 。
该层有 42 MB,接近 lambda 的 50 MB 限制。
如果您不想使用图层,也可以使用相同的 docker 工具来 构建常规部署包e,如最近的 AWS 博客中所述:
由于图层有效,因此在常规包中包含 django 也应该有效。
您提到您 'zipped the content of this directory' 指的是 python 文件夹。通过 .zip 包创建层时,python 包需要位于 'python' 文件夹子目录中。它们不能都在压缩文件夹的根目录下。
我有一个 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 目录的内容。
在此之后,我压缩了这个目录的内容并将其发布为 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
如果 layer 适合您,我可以告诉您,我刚刚 成功构建了一个 django 层 基于您的 requirements.txt
文件,可以在 lambda 中导入。
为了构建图层,我使用了 lambci/lambda tool. To ease the process, I used the following snippet from
该层有 42 MB,接近 lambda 的 50 MB 限制。
如果您不想使用图层,也可以使用相同的 docker 工具来 构建常规部署包e,如最近的 AWS 博客中所述:
由于图层有效,因此在常规包中包含 django 也应该有效。
您提到您 'zipped the content of this directory' 指的是 python 文件夹。通过 .zip 包创建层时,python 包需要位于 'python' 文件夹子目录中。它们不能都在压缩文件夹的根目录下。