在Lambda层中导入库

Pun*_*cky 4 python amazon-web-services python-3.x aws-lambda aws-lambda-layers

我想在我的AWS Lambda中导入jsonschema库,以执行请求验证。我希望通过Lambda Layers来实现,而不是将依赖项与我的应用程序捆绑在一起。我压缩了所有依赖项venv/lib/python3.6/site-packages/。我将其作为lambda层上传,publish-layer-versionaws lambda update-function-configuration分别使用和命令将其添加到aws lambda中。zip文件夹的名称为“ lambda-dep.zip”,所有文件都在其下面。但是,当我尝试在lambda_function中导入jsonschema时,看到以下错误-

from jsonschema import validate
Run Code Online (Sandbox Code Playgroud)
{
  "errorMessage": "Unable to import module 'lambda_api': No module named 'jsonschema'",
  "errorType": "Runtime.ImportModuleError"
}```

Am I missing any steps are is there a different mechanism to import anything within lambda layers?
Run Code Online (Sandbox Code Playgroud)

Rya*_*utz 15

之前答案的更新:根据 AWS 文档,要求已更改为仅放置在 /python 目录中,而无需其余目录结构。

https://aws.amazon.com/premiumsupport/knowledge-center/lambda-import-module-error-python/

确保解压缩的目录结构在 /python 目录中包含库。


gui*_*o23 12

您要确保解压缩后的.zip遵循此文件夹结构

python / lib / python3.6 / site-packages / {LibrariesGoHere}。

上载该zip,确保将图层添加到Lambda函数中,您应该一切顺利。

这是对我有用的结构。

  • 我看了几件事,但在此视频的1:42时终于使我理解了它https://youtu.be/ebhcs-9FYJA?t=102 (5认同)
  • 这有效,因为我在lambda中使用python 3.7,所以将文件夹名称更改为python3.7。谢谢! (2认同)
  • 甜的!是的,我会提到确保您使用正确的 python 版本,但在您最初的问题中提到了 python 3.6,所以认为这就是您所使用的。恭喜它开始工作。也谢谢你,我现在终于可以评论了,哈哈。由于我的帐户受到限制,直到我获得声誉点为止,我一直试图永远获得可接受的答案。 (2认同)
  • 根据 AWS 文档,要求已更改为仅放置在 /python 目录中,而无需其余目录结构。https://aws.amazon.com/premiumsupport/knowledge-center/lambda-import-module-error-python/ (2认同)

nic*_*r88 6

这里是我用来上传图层的脚本:

#!/usr/bin/env bash

LAYER_NAME=$1 # input layer, retrived as arg
ZIP_ARTIFACT=${LAYER_NAME}.zip
LAYER_BUILD_DIR="python"

# note: put the libraries in a folder supported by the runtime, means that should by python

rm -rf ${LAYER_BUILD_DIR} && mkdir -p ${LAYER_BUILD_DIR}

docker run --rm -v `pwd`:/var/task:z lambci/lambda:build-python3.6 python3.6 -m pip --isolated install -t ${LAYER_BUILD_DIR} -r requirements.txt

zip -r ${ZIP_ARTIFACT} .

echo "Publishing layer to AWS..."
aws lambda publish-layer-version --layer-name ${LAYER_NAME} --zip-file fileb://${ZIP_ARTIFACT} --compatible-runtimes python3.6

# clean up
rm -rf ${LAYER_BUILD_DIR}
rm -r ${ZIP_ARTIFACT}
Run Code Online (Sandbox Code Playgroud)

我将上面的内容添加到名为的文件中build_layer.sh,然后将其称为bash build_layer.sh my_layer。该脚本需要requirements.txt在同一文件夹中,并且使用Docker具有与Python3.6 Lambdas相同的运行时。脚本的arg是图层名称。

将图层上传到AWS之后,请确保在Lambda中引用了正确的图层版本。