在使用AWS Lambda层时,从“urllib3.util.ssl_”无法导入名称“DEFAULT_CIPHERS”

43

我想要实现的目标

使用AWS Lambda来爬取一个网站,并将数据保存在S3上。

我遇到的问题

当我执行Lambda时,出现了以下错误信息。

{ "errorMessage": "无法导入模块'lambda_function':无法从'urllib3.util.ssl_'(/opt/python/urllib3/util/ssl_.py)导入名称'DEFAULT_CIPHERS'", "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”文件夹中,冻结为zip文件,然后作为层上传到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

那么我应该怎么做才能达到我想要的目标呢?任何建议都将不胜感激。


你安装那个特定版本的urllib有什么原因吗? - Paolo
@Paolo 在这个页面(https://qiita.com/SatoshiGachiFujimoto/items/437b0ccaba817903fb72)上有一个建议,说同样的错误可以使用那个版本解决。我知道作者当时在使用 Docker,而我没有,但我还是尝试了一下。 - dixhom
@Paolo 我遇到了相同的错误。 - dixhom
2
@Paolo 我遇到了同样的错误。 - dixhom
2
@Paolo 我遇到了同样的错误。 - undefined
显示剩余7条评论
12个回答

44
你遇到这个问题是因为你正在使用的botocore还不支持urllib3 2.0。
由于你正在部署到AWS Lambda,你需要在项目中明确指定urllib3<2,以确保不会引入urllib3 2.0到你的环境中。 (来源)
urllib3<2

按照此指南的步骤部署带有.zip文件归档的Python Lambda函数。
如果无法通过.zip文件进行部署,请考虑按照此指南的步骤使用容器镜像进行部署。

26
在我的情况下,我只是指定了请求的版本(运行时python3.9)-
requests==2.28.2

而且它起作用了。

7
2.29.0也适用于我 完整的命令是 pip install requests==2.29.0 - hispeed
这就是方法 - varontron
使用命令 pip install requests==2.28.2 -t ./. 可以将其仅安装在当前文件夹内。 - undefined
2.31.0不起作用。使用了2.28.2,它起作用了。使用了public.ecr.aws/lambda/python:3.9-x86_64的镜像。感谢@ashrafminhaj的评论。 - undefined

5

4
我找到的解决方法是将AWS Lambda运行时更新为3.10,如果适用的话,还要将任何AWS Lambda层更新为python 3.10,然后确保你已经打包了最新版本的requests。如果你正在使用botocore或boto3,你还需要确保你已经将它们包含在代码包或AWS Lambda层中,包括版本boto3>=1.26.153botocore>=1.29.153

1
这实际上有点误导人,使用先前稳定版本的库在使用python3.9作为运行时时确实解决了问题。 - ashraf minhaj

3
  1. 执行以下命令。

    pip install requests==2.25.0 -t ./python --no-user pip install beautifulsoup4 -t ./python --no-user pip install pytz -t ./python --no-user

  2. 在 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
  1. 解压文件并将内容移动到 python 文件夹中。

  2. python 文件夹压缩并上传到 AWS Lambda Layer。

  3. 将该层设置到 Lambda 中。

  4. 这样代码就可以无错误运行了。


2
我在AWS中设置我的Lambda函数时,通过使用Python 3.11解决了这个问题。较低版本往往会更容易出现此错误。

1
你的回答可以通过提供更多支持性信息来改进。请编辑以添加进一步的细节,例如引用或文档,以便他人能够确认你的回答是否正确。你可以在帮助中心找到关于如何撰写好回答的更多信息。 - Community
1
在我的情况下,仅升级Lambda环境是不够的 - 我还必须使用正确的requests版本重新构建软件包,如@ashraf minhad所述。 - varontron

1
这是因为openai urllib3问题。
解决方案:打开任意文件夹并输入以下命令“pip install openai requests==2.29.0 urllib3==1.26.16 -t python”,这将安装具有这些特定版本的requests和urllib3的pip。

1
你的回答可以通过提供更多的支持性信息来改进。请编辑以添加进一步的细节,例如引用或文档,以便他人可以确认你的回答是否正确。你可以在帮助中心找到更多关于如何撰写好回答的信息。 - undefined

1
在我的情况下,当我使用transformers库时遇到了这个错误。我通过pip install urllib3<2解决了这个问题。

1
您可以在您的deployment.txt文件中添加以下内容来解决此问题:

urllib3==1.16


1
这个不起作用,你会从 'urllib3.util.ssl_' (/var/task/urllib3/util/ssl_.py) 得到错误 'is_ipaddress',1.26.16 运行正常。 - Philip Jay Fry

1
遇到了类似的问题,不仅仅是这个库,还有其他库也有类似的问题。问题的根本原因是库的兼容性,为了解决这个问题而不需要指定库的版本,我们可以使用lambda的运行时Docker镜像。
mkdir layer
cp requirements.txt layer/requirements.txt
docker run -ti -v $(pwd)/layer:/app -w /app --entrypoint /bin/bash public.ecr.aws/lambda/python:3.11 -c "pip3 install --target ./python -r requirements.txt"

我们在layer/python中获取我们所需的所有库。然后我们只需将其压缩并在AWS中创建layer。
这里我正在使用Python 3.11作为lambda的版本,但任何其他版本都应该可以工作。
注意:在Windows PowerShell中,将$(pwd)更改为${pwd}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接