python - 如何在 AWS Lambda 函数中降级 boto3 版本
问题描述
我需要在 Lambda (Python 3.7) 中使用我自己的 boto3 版本。由于某种原因,Lambda 默认 Python 3.7 env (1.9.42) 中包含的版本不支持使用 Textract。
为此,我根据指南执行了以下操作:
- 使用以下命令创建自定义包:
pip freeze > requirements.txt
这将产生这个文件:
# requirements.txt
boto3==1.9.138
botocore==1.12.138
docutils==0.14
jmespath==0.9.4
python-dateutil==2.8.0
s3transfer==0.2.0
six==1.12.0
urllib3==1.24.2
mkdir build
pip3 install -r requirements.txt -t build/
cd build
zip -r ../boto3_layer.zip .
然后我使用 GUI 上传了一个新的 Lambda 层(称为 boto3Layer)。然后我成功地将该层添加到我的 Lambda 函数中。
问题是,我不知道如何使用内联代码编辑器将所述层导入我的代码中。
我有以下代码:
...
from boto3_layer as boto3
...
log.info(boto3)
我得到错误"errorMessage": "Unable to import module 'lambda_function': No module named 'boto3_layer'"
我也尝试导入 just boto3
,但确认它是错误的版本(它是 Lambda 使用的版本),所以我的导入没有覆盖它。
我只想知道如何将我的自定义层导入我的代码!谢谢
编辑:尝试建议:
对于尝试完成相同任务的其他用户:
virtualenv python --python=python3.7
source python/bin/activate
接着pip3 install boto3
zip -r boto3_layer.zip python/lib/
- 使用 Lambda 函数创建新的 Lambda 层
boto3_layer.zip
并将层添加到 Lambda 函数 - 试图运行上面的代码保存失败
"errorMessage": "Unable to import module 'lambda_function': No module named 'boto3_layer'",
这最终通过导入boto3
而不是我的自定义名称来工作。
import boto3
def lambda_handler(event, context):
textract = boto3.client('textract')
解决方案
目录不会是模块/包。你使用的方法永远不会奏效。
代替所有这些,使用所需的 Python 版本创建一个虚拟环境 - 可能在 docker 中,您可以在其中安装包。然后,您必须lib
从虚拟环境中压缩文件夹,以便在解压缩时该层将产生类似于以下的目录结构
python/
lib/
pythonx.y/
site-packages/
...
python
必须为此命名顶级目录才能工作。
如果您正确执行此操作,那么您应该能够boto3
正常导入您的版本。
推荐阅读
- rust - libgcc 和 Rust 系统库中 `__udivti3' 的多重定义
- java - RxJava,等待多个 Observables 同时提供所需的结果
- r - 如何在 R 中使用 ifelse 语句创建粘贴链
- android - 在 Android 中使用 Google 地图访问用户的当前位置时应用程序崩溃
- python - 使用 scipy.integrate.quad、最小化和导数时出现多个溢出警告
- c# - c#垃圾收集不起作用.netframework 4及更高版本
- jenkins - 在 Google Cloud Run 上部署 Jenkins 服务器
- r - R heatmaply 和 pheatmap 输出
- hadoop - Hadoop中超级用户和超级组的区别
- java - 如何使用 Eclipse IDE 调试命令行编译的 Java .class 文件?