如何在 AWS Lambda 函数中降级 boto3 版本
How to downgrade the boto3 version in an AWS Lambda Function
我需要在 Lambda (Python 3.7) 中使用我自己的 boto3 版本。由于某种原因,Lambda 默认值 Python 3.7 env (1.9.42) 中包含的版本不支持使用 Textract。
为此,我根据 guide 执行了以下操作:
- 使用以下命令创建自定义包:
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'"
我也试过只导入 boto3
,但确认它是错误的版本(这是 Lambda 使用的版本),所以我的导入没有覆盖它。
我只想知道如何将我的自定义图层导入我的代码!谢谢
编辑:尝试建议:
对于尝试完成相同任务的其他用户:
virtualenv python --python=python3.7
source python/bin/activate
然后 pip3 install boto3
zip -r boto3_layer.zip python/lib/
- 使用
boto3_layer.zip
创建新的 Lambda 层并将层添加到 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')
lambda 中的文件将解压缩到名为 /opt
的目录中,这将包含在 PYTHONPATH
中。这意味着您的 zip 结构中确实需要一个额外的 boto3_layer。
目录不会是 module/package。您使用的方法永远行不通。
而不是所有这些,使用所需的 Python 版本创建一个虚拟环境 - 可能在 docker 内,您可以在其中安装软件包。然后你必须从虚拟环境中压缩 lib
文件夹,这样当解压缩层将产生类似于
的目录结构
python/
lib/
pythonx.y/
site-packages/
...
顶级目录必须命名为 python
才能正常工作。
如果您正确执行此操作,那么您应该能够正常导入您的 boto3
版本。
我需要在 Lambda (Python 3.7) 中使用我自己的 boto3 版本。由于某种原因,Lambda 默认值 Python 3.7 env (1.9.42) 中包含的版本不支持使用 Textract。
为此,我根据 guide 执行了以下操作:
- 使用以下命令创建自定义包:
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'"
我也试过只导入 boto3
,但确认它是错误的版本(这是 Lambda 使用的版本),所以我的导入没有覆盖它。
我只想知道如何将我的自定义图层导入我的代码!谢谢
编辑:尝试建议:
对于尝试完成相同任务的其他用户:
virtualenv python --python=python3.7
source python/bin/activate
然后pip3 install boto3
zip -r boto3_layer.zip python/lib/
- 使用
boto3_layer.zip
创建新的 Lambda 层并将层添加到 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')
lambda 中的文件将解压缩到名为 /opt
的目录中,这将包含在 PYTHONPATH
中。这意味着您的 zip 结构中确实需要一个额外的 boto3_layer。
目录不会是 module/package。您使用的方法永远行不通。
而不是所有这些,使用所需的 Python 版本创建一个虚拟环境 - 可能在 docker 内,您可以在其中安装软件包。然后你必须从虚拟环境中压缩 lib
文件夹,这样当解压缩层将产生类似于
python/
lib/
pythonx.y/
site-packages/
...
顶级目录必须命名为 python
才能正常工作。
如果您正确执行此操作,那么您应该能够正常导入您的 boto3
版本。