在 lambda 层中导入库
Import libraries in lambda layers
我想在我的 AWS Lambda 中导入 jsonschema
库以执行请求验证。我没有将依赖项与我的应用程序捆绑在一起,而是希望通过 Lambda 层来实现。我压缩了 venv/lib/python3.6/site-packages/
下的所有依赖项。我将其作为 lambda 层上传,并分别使用 publish-layer-version
和 aws 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"
}
我是否遗漏了任何步骤,是否有不同的机制可以在 lambda 层中导入任何内容?
您想确保您的 .zip 在解压缩时遵循此文件夹结构
python/lib/python3.6/site-packages/{LibrariesGoHere}.
上传该 zip,确保该层已添加到 Lambda 函数,您应该可以开始了。
这是对我有用的结构。
这里是我用来上传图层的脚本:
#!/usr/bin/env bash
LAYER_NAME= # 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 中引用了正确的图层版本。
有一个更简单的方法。只需将软件包安装到 python 文件夹中。然后使用 -t(目标)选项安装包。注意“。”在 zip 文件中。这是一张通配符。
mkdir lambda_function
cd lambda_function
mkdir python
cd python
pip install yourPackages -t ./
cd ..
zip /tmp/labmda_layer.zip .
zip 文件现在是您的 lambda 层。
可在此处找到包括视频说明在内的分步说明。
https://geektopia.tech/post.php?blogpost=Create_Lambda_Layer_Python
根据之前的答案更新:根据 AWS 文档,要求已更改为简单地放置在 /python 目录中,没有目录结构的其余部分。
https://aws.amazon.com/premiumsupport/knowledge-center/lambda-import-module-error-python/
确保您的解压缩目录结构在 /python 目录中包含库。
我想在我的 AWS Lambda 中导入 jsonschema
库以执行请求验证。我没有将依赖项与我的应用程序捆绑在一起,而是希望通过 Lambda 层来实现。我压缩了 venv/lib/python3.6/site-packages/
下的所有依赖项。我将其作为 lambda 层上传,并分别使用 publish-layer-version
和 aws 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"
}
我是否遗漏了任何步骤,是否有不同的机制可以在 lambda 层中导入任何内容?
您想确保您的 .zip 在解压缩时遵循此文件夹结构
python/lib/python3.6/site-packages/{LibrariesGoHere}.
上传该 zip,确保该层已添加到 Lambda 函数,您应该可以开始了。
这是对我有用的结构。
这里是我用来上传图层的脚本:
#!/usr/bin/env bash
LAYER_NAME= # 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 中引用了正确的图层版本。
有一个更简单的方法。只需将软件包安装到 python 文件夹中。然后使用 -t(目标)选项安装包。注意“。”在 zip 文件中。这是一张通配符。
mkdir lambda_function cd lambda_function mkdir python cd python pip install yourPackages -t ./ cd .. zip /tmp/labmda_layer.zip .
zip 文件现在是您的 lambda 层。
可在此处找到包括视频说明在内的分步说明。
https://geektopia.tech/post.php?blogpost=Create_Lambda_Layer_Python
根据之前的答案更新:根据 AWS 文档,要求已更改为简单地放置在 /python 目录中,没有目录结构的其余部分。
https://aws.amazon.com/premiumsupport/knowledge-center/lambda-import-module-error-python/
确保您的解压缩目录结构在 /python 目录中包含库。