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

dix*_*hom 56 python amazon-s3 amazon-web-services boto3 aws-lambda

我想要实现什么

使用 AWS Lambda 抓取网站并将数据保存在 S3 上。

我遇到的问题

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

{“errorMessage”:“无法导入模块“lambda_function”:无法从“urllib3.util.ssl_”(/opt/python/urllib3/util/ssl_.py)导入名称“DEFAULT_CIPHERS””,“errorType”:“运行时.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
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)
  • horserace-dx已存在
  • 该文件夹raw存在
  • Lambda 的角色已正确设置。它可以读取和写入S3
  • Lambda 的运行时是 Python 3.9。本地计算机的python版本是3.9.13。

到目前为止我做了什么

我搜索“无法从‘urllib3.util.ssl_’导入名称‘DEFAULT_CIPHERS’”并找到了一些建议。我用以下代码制作了图层,然后再次尝试,但没有成功。

!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
Run Code Online (Sandbox Code Playgroud)

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

Dan*_*l T 60

\n

无法从“urllib3.util.ssl_”导入名称“DEFAULT_CIPHERS”

\n
\n

您遇到此问题是因为您\xe2\x80\x99 使用的 botocore 尚不支持 urllib3 2.0。

\n

urllib3<2由于您\xe2\x80\x99正在部署到AWS Lambda,因此\xe2\x80\x99需要在项目中显式固定,以确保\xe2\x80\x99不会将urllib3 2.0引入到您的环境中。
\n(来源

\n
urllib3<2\n
Run Code Online (Sandbox Code Playgroud)\n

请按照本指南了解如何使用 .zip 文件存档部署 Python Lambda 函数。

\n

如果您无法通过 .zip 文件使其工作,请考虑通过容器映像进行部署,而不是遵循本指南

\n


小智 35

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

requests==2.28.2
Run Code Online (Sandbox Code Playgroud)

它起作用了。

  • 2.29.0 也对我有用,完整命令是 pip install requests==2.29.0 (9认同)

小智 10

我通过设置解决了urllib3<2。urllib3 2.0 发生了重大变化。

例如,如果您有一个requirement.txt 文件,则urllib3<2向该文件添加一行。

请参阅此以获得更好的解释:https://github.com/psf/requests/issues/6443#issuecomment-1535667256


小智 5

我在 AWS 中设置 lambda 函数时使用 python 3.11 解决了这个问题,较低的版本往往更容易抛出此错误


小智 5

就我而言,我在使用 Transformer 库时遇到此错误。我解决了这个问题pip install urllib3<2

  • 这在 bash 中对我有用:`pip install 'urllib3&lt;2'` (2认同)

dix*_*hom 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. 然后代码运行没有错误。