在使用层的 AWS Lambda 上,“cannot import name 'DEFAULT_CIPHERS' from 'urllib3.util.ssl_”
我想要实现什么
使用 AWS Lambda 抓取网站并将数据保存在 S3 上。
我遇到的问题
当我执行 Lambda 时,出现以下错误消息。
{ "errorMessage": "Unable to import module 'lambda_function': cannot import name 'DEFAULT_CIPHERS' from 'urllib3.util.ssl_' (/opt/python/urllib3/util/ssl_.py)", "errorType": "Runtime.ImportModuleError", "requestId": "fb66bea9-cbad-4bd3-bd4d-6125454e21be", "stackTrace": [] }
代码
Lambda 代码如下。
import requests
import boto3
def lambda_handler(event, context):
s3 = boto3.client('s3')
upload_res = s3.put_object(Bucket='horserace-dx', Key='/raw/a.html', Body='testtext')
return event
在 Lambda 中添加了一个层。使用下面的命令将文件保存在 python
文件夹中,冻结在压缩文件中,然后作为一个层上传到 AWS Lambda。
!pip install requests -t ./python --no-user
!pip install pandas -t ./python --no-user
!pip install beautifulsoup4 -t ./python --no-user
- 存储桶
horserace-dx
存在 - 文件夹
raw
存在 - Lambda 的角色已正确设置。它可以读取和写入S3
- Lambda 的运行时是 Python 3.9。本地计算机的python版本是3.9.13。
到目前为止我做了什么
我在谷歌上搜索 "cannot import name 'DEFAULT_CIPHERS' from 'urllib3.util.ssl_'",并找到了一些建议。我用下面的代码创建了层,但再次尝试却徒劳无功。
!pip install requests -t ./python --no-user
!pip install pandas -t ./python --no-user
!pip install beautifulsoup4 -t ./python --no-user
!pip install urllib3==1.26.15 -t ./python --no-user
那么我应该怎样做才能达到我想要达到的目的呢?任何建议将不胜感激。
urllib3<2
- Paolo 2023-06-06
cannot import name 'DEFAULT_CIPHERS' from 'urllib3.util.ssl_'
您遇到此问题是因为您使用的 botocore 尚不支持 urllib3 2.0。
由于您要部署到 AWS Lambda,因此您需要在项目中显式固定到 urllib3<2
,以确保 urllib3 2.0 不会引入您的环境中。
(来源)
urllib3<2
请按照本指南了解如何使用 .zip 文件存档部署 Python Lambda 函数。
如果您无法通过 .zip 文件使其正常工作,请考虑按照本指南通过容器映像进行部署。
就我而言,我只是指定了请求版本(运行时 python3.9) -
requests==2.28.2
它起作用了。
执行以下命令。
pip install requests==2.25.0 -t ./python --no-user pip install beautifulsoup4 -t ./python --no-user pip install pytz -t ./python --no-user
在PyPI上,从numpy和pandas页面下载以下whl文件
- numpy-1.24.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
- pandas-2.0.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
解压缩文件并将内容移至
python
文件夹。压缩
python
文件夹并将其上传到 AWS Lambda Layer。将图层设置为 Lambda。
然后代码运行没有错误。
对我有用的解决方案是将 AWS Lambda 运行时更新为 3.10
,如果适用,将任何 AWS Lambda 层更新为 python 3.10
,然后确保您已打包最新版本的请求。如果您使用 botocore 或 boto3,您还需要确保已将它们包含在代码包或 AWS Lambda 层(包括版本 boto3>=1.26.153
和 botocore>=1.29.153
)中。
python3.9
作为运行时的问题。
- ashraf minhaj 2023-06-18
您可以在deployment.txt中添加以下内容来解决此问题:
urllib3==1.16