在使用层的 AWS Lambda 上,“cannot import name 'DEFAULT_CIPHERS' from 'urllib3.util.ssl_”

回答 5 浏览 1.1万 2023-06-06

我想要实现什么

使用 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

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

dixhom 提问于2023-06-06
您安装该特定版本的 urllib 是否有原因?Paolo 2023-06-06
@Paolo在此页面上(qiita.com/SatoshiGachiFujimoto/items/437b0ccaba817903fb72)有人建议使用该版本解决了相同的错误。我知道作者使用了 docker,而我没有,但我还是尝试了。dixhom 2023-06-06
试试urllib3<2Paolo 2023-06-06
@Paolo 我遇到了同样的错误dixhom 2023-06-06
5 个回答
#1楼
得票数 15

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 文件使其正常工作,请考虑按照本指南通过容器映像进行部署。

Daniel T 提问于2023-06-08
Daniel T 修改于2023-07-04
#2楼
得票数 8

就我而言,我只是指定了请求版本(运行时 python3.9) -

requests==2.28.2

它起作用了。

ashraf minhaj 提问于2023-06-18
2.29.0 也对我有用,完整命令是 pip install requests==2.29.0hispeed 2023-06-23
#3楼 已采纳
得票数 2
  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. 然后代码运行没有错误。

dixhom 提问于2023-06-07
#4楼
得票数 2

对我有用的解决方案是将 AWS Lambda 运行时更新为 3.10,如果适用,将任何 AWS Lambda 层更新为 python 3.10,然后确保您已打包最新版本的请求。如果您使用 botocore 或 boto3,您还需要确保已将它们包含在代码包或 AWS Lambda 层(包括版本 boto3>=1.26.153botocore>=1.29.153)中。

chrispy 提问于2023-06-15
ashraf minhaj 修改于2023-06-20
这实际上有点误导,使用以前的稳定版本的库确实解决了使用 python3.9 作为运行时的问题。ashraf minhaj 2023-06-18
#5楼
得票数 1

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

urllib3==1.16

William Faria 提问于2023-06-14
这不起作用,您会从 'urllib3.util.ssl_' (/var/task/urllib3/util/ssl_.py) 收到错误 'is_ipaddress',1.26.16 工作正常Philip Jay Fry 2023-06-23