22

我想在我的 AWS Lambda 中导入 jsonschema 库以执行请求验证。我没有将依赖项与我的应用程序捆绑在一起,而是希望通过 Lambda 层来做到这一点。我将所有依赖项压缩在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
{
  "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?
4

3 回答 3

67

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

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

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

这是对我有用的结构。

于 2019-04-15T19:30:14.540 回答
13

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

#!/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}

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

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

于 2019-04-15T20:17:54.457 回答
2

有一个更简单的方法。只需将软件包安装到 python 文件夹中。然后使用 -t (Target) 选项安装软件包。注意“。” 在 zip 文件中。这是一张通配符。

mkdir lambda_function
cd lambda_function
mkdir python
光盘蟒蛇
pip install yourPackages -t ./
光盘..
压缩 /tmp/labmda_layer.zip 。   

zip 文件现在是您的 lambda 层。

可在此处找到包含视频说明的分步说明。

https://geektopia.tech/post.php?blogpost=Create_Lambda_Layer_Python

于 2019-04-21T08:01:37.517 回答