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”,我认为您的问题会得到更好的关注