AWS Lambda 函数无法识别我的 Python 依赖层
AWS Lambda function does not recognize my Python dependency layer
我的目标是使用存储 python 依赖项的 python 3.7 运行时为 aws lambda 函数上传一个小层,但我似乎无法让它识别模块。
我创建了一个 Makefile 来生成 zip 文件
create-lambda-layer:
docker run -dit --name AL amazonlinux:latest
docker cp requirements.in AL:/root/requirements.in
docker exec -it AL bash -c "yum update -y \
&& yum install -y python3.7 zip \
&& python3 -m pip install --upgrade pip \
&& pip install wheel \
&& mkdir -p /root/lambda/ \
&& pip install -r /root/requirements.in -t /root/lambda/ \
&& cd /root/lambda/ \
&& zip -r python.zip ."
docker cp AL:/root/lambda/python.zip .
docker stop AL
docker rm AL
我需要的模块在 requirements.in 同一个文件夹中
holidays==0.11.2
python-gitlab==2.10.1
我将该层放在服务中并通过无服务器框架进行部署,但我也测试了直接使用 AWS 控制台上传相同的 .zip 但失败了。我的 lambda 函数源文件(正确链接到层)只有:
import gitlab
import holidays
print("holidays: ", holidays.__version__)
print("gitlab", gitlab.__version__)
def lambda_handler(event, context):
return()
我收到以下错误(节假日类比):
{
"errorMessage": "Unable to import module 'lambda_function': No module named 'gitlab'",
"errorType": "Runtime.ImportModuleError",
"stackTrace": []
}
我的 python.zip 的内容对我来说并不重要,它只包含它应该包含的依赖项:
PyMeeus-0.5.11.dist-info hijri_converter pytz-2021.1.dist-info
__pycache__ hijri_converter-2.2.1.dist-info requests
bin holidays requests-2.26.0.dist-info
certifi holidays-0.11.2.dist-info requests_toolbelt
certifi-2021.5.30.dist-info idna requests_toolbelt-0.9.1.dist-info
charset_normalizer idna-3.2.dist-info six-1.16.0.dist-info
charset_normalizer-2.0.4.dist-info korean_lunar_calendar six.py
convertdate korean_lunar_calendar-0.2.1.dist-info tests
convertdate-2.3.2.dist-info pymeeus urllib3
dateutil python_dateutil-2.8.2.dist-info urllib3-1.26.6.dist-info
docs python_gitlab-2.10.1.dist-info
gitlab pytz
我想知道这是为什么。我之前曾尝试使用 ubuntu 创建相同的图层 zip 并且它有效,但要正式实现它,我不能使用 ubuntu 图像。
有没有人知道我可以做些什么来追踪问题或如何解决这个问题?我在安装依赖项时使用 pip
作为 root 会有什么影响吗?
谢谢!
我遇到了同样的问题,我花了一个星期才解决。我认为这个答案可以帮助你:
这是关键内容:
您想确保您的 .zip 在解压缩时遵循此文件夹结构
python/lib/python3.6/site-packages/{LibrariesGoHere}.
上传该 zip,确保该层已添加到 Lambda 函数,您应该可以开始了。
此外,如果您将标签更新为“aws-lambda-layers”,我认为您的问题会得到更好的关注
我的目标是使用存储 python 依赖项的 python 3.7 运行时为 aws lambda 函数上传一个小层,但我似乎无法让它识别模块。
我创建了一个 Makefile 来生成 zip 文件
create-lambda-layer:
docker run -dit --name AL amazonlinux:latest
docker cp requirements.in AL:/root/requirements.in
docker exec -it AL bash -c "yum update -y \
&& yum install -y python3.7 zip \
&& python3 -m pip install --upgrade pip \
&& pip install wheel \
&& mkdir -p /root/lambda/ \
&& pip install -r /root/requirements.in -t /root/lambda/ \
&& cd /root/lambda/ \
&& zip -r python.zip ."
docker cp AL:/root/lambda/python.zip .
docker stop AL
docker rm AL
我需要的模块在 requirements.in 同一个文件夹中
holidays==0.11.2
python-gitlab==2.10.1
我将该层放在服务中并通过无服务器框架进行部署,但我也测试了直接使用 AWS 控制台上传相同的 .zip 但失败了。我的 lambda 函数源文件(正确链接到层)只有:
import gitlab
import holidays
print("holidays: ", holidays.__version__)
print("gitlab", gitlab.__version__)
def lambda_handler(event, context):
return()
我收到以下错误(节假日类比):
{
"errorMessage": "Unable to import module 'lambda_function': No module named 'gitlab'",
"errorType": "Runtime.ImportModuleError",
"stackTrace": []
}
我的 python.zip 的内容对我来说并不重要,它只包含它应该包含的依赖项:
PyMeeus-0.5.11.dist-info hijri_converter pytz-2021.1.dist-info
__pycache__ hijri_converter-2.2.1.dist-info requests
bin holidays requests-2.26.0.dist-info
certifi holidays-0.11.2.dist-info requests_toolbelt
certifi-2021.5.30.dist-info idna requests_toolbelt-0.9.1.dist-info
charset_normalizer idna-3.2.dist-info six-1.16.0.dist-info
charset_normalizer-2.0.4.dist-info korean_lunar_calendar six.py
convertdate korean_lunar_calendar-0.2.1.dist-info tests
convertdate-2.3.2.dist-info pymeeus urllib3
dateutil python_dateutil-2.8.2.dist-info urllib3-1.26.6.dist-info
docs python_gitlab-2.10.1.dist-info
gitlab pytz
我想知道这是为什么。我之前曾尝试使用 ubuntu 创建相同的图层 zip 并且它有效,但要正式实现它,我不能使用 ubuntu 图像。
有没有人知道我可以做些什么来追踪问题或如何解决这个问题?我在安装依赖项时使用 pip
作为 root 会有什么影响吗?
谢谢!
我遇到了同样的问题,我花了一个星期才解决。我认为这个答案可以帮助你:
这是关键内容:
您想确保您的 .zip 在解压缩时遵循此文件夹结构
python/lib/python3.6/site-packages/{LibrariesGoHere}.
上传该 zip,确保该层已添加到 Lambda 函数,您应该可以开始了。
此外,如果您将标签更新为“aws-lambda-layers”,我认为您的问题会得到更好的关注