如何解决尝试在 AWS 上的 lambda 中调用 pycurl 时出错
我想使用 pycurl 来获得 TTFB 和 TTLB,但我无法在 AWS lambda 中调用 pycurl。
为了关注这个问题,假设我调用了这个简单的 lambda 函数:
import json
import pycurl
import certifi
def lambda_handler(event,context):
client_curl = pycurl.Curl()
client_curl.setopt(pycurl.CAINFO,certifi.where())
client_curl.setopt(pycurl.URL,"https://www.arolla.fr/blog/author/edouard-gomez-vaez/") #set url
client_curl.setopt(pycurl.FOLLOWLOCATION,1)
client_curl.setopt(pycurl.WRITEFUNCTION,lambda x: None)
content = client_curl.perform()
dns_time = client_curl.getinfo(pycurl.NAMELOOKUP_TIME) #DNS time
conn_time = client_curl.getinfo(pycurl.CONNECT_TIME) #TCP/IP 3-way handshaking time
starttransfer_time = client_curl.getinfo(pycurl.STARTTRANSFER_TIME) #time-to-first-byte time
total_time = client_curl.getinfo(pycurl.TOTAL_TIME) #last requst time
client_curl.close()
data = json.dumps({'dns_time':dns_time,'conn_time':conn_time,'starttransfer_time':starttransfer_time,'total_time':total_time,})
return {
'statusCode': 200,'body': data
}
Unable to import module 'lambda_function': No module named 'pycurl'
我按照教程 https://aws.amazon.com/fr/premiumsupport/knowledge-center/lambda-layer-simulated-docker/ 创建了一个层,但是在使用 docker 生成层时出现以下错误(我提取了有趣的部分):
Could not run curl-config: [Errno 2] No such file or directory: 'curl-config': 'curl-config'
我什至尝试在我自己的机器上生成刚刚启动的层:
pip install -r requirements.txt -t python/lib/python3.6/site-packages/
zip -r mypythonlibs.zip python > /dev/null
然后将 zip 作为层上传到 aws 中,但是在启动 lambda 时出现另一个错误:
Unable to import module 'lambda_function': libssl.so.1.0.0: cannot open shared object file: No such file or directory
似乎该层必须建立在某种扩展目标环境上。
解决方法
经过几个小时的挠头,我设法解决了这个问题。
TL;DR: 使用从 aws 继承的 docker 镜像构建层,但使用所需的库,例如 libcurl-devel
、openssl-devel
、{{ 1}}。看看技巧注 3 :)
详细方法:
- 先决条件:已安装 Docker
- 在一个空目录中,复制包含
python36-devel
的requirements.txt
(在我的例子中:pycurl
) - 在同一目录中,创建以下
pycurl~=7.43.0.5
(参见注释 3):
Dockerfile
- 构建 docker 镜像:
FROM public.ecr.aws/sam/build-python3.6
RUN yum install libcurl-devel python36-devel -y
RUN yum install openssl-devel -y
ENV PYCURL_SSL_LIBRARY=openssl
RUN ln -s /usr/include /var/lang/include
- 使用此图像构建层(参见注释 2),运行:
docker build -t build-python3.6-pycurl .
- 通过运行压缩图层:
docker run -v "$PWD":/var/task "build-python3.6-pycurl" /bin/sh -c "pip install -r requirements.txt -t python/lib/python3.6/site-packages/; exit"
-
将文件
zip mylayer.zip python > /dev/null
作为一个层发送到 aws 并使您的 lambda 指向它(使用控制台,或遵循教程 https://aws.amazon.com/fr/premiumsupport/knowledge-center/lambda-layer-simulated-docker/)。 -
测试您的 lambda 并庆祝!
注意 1. 如果你想使用 python 3.8,只需将 3.6 或 36 改为 3.8 和 38。
注意 2. 重新生成图层时不要忘记删除 python 文件夹,必要时使用管理员权限。
注意 3。 注意 DockerFile 最后一行中的符号链接。没有它,mylayer.zip
将无法找到一些头文件,例如 gcc
。
注意 4. 使用 Python.h
后端编译 pycurl
,因为它是 lambda 执行环境中使用的 ssl 后端。否则在执行 lambda 时会出现 openssl
错误。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。