如何在AWS Lambda中升级OpenSSL满足Python程序运行需求?
适配Python 3.8 Lambda运行时的OpenSSL 1.1.1升级方案
核心说明
此前Node.js相关教程失效是因为不同语言运行时的层路径规则、二进制依赖编译环境要求不同,Python 3.8 Lambda运行时基于Amazon Linux 2,需要编译对应环境的二进制包再封装为层使用,配置时需优先加载层内的新版OpenSSL依赖。
步骤1:编译适配环境的OpenSSL二进制
- 本地启动和Lambda Python 3.8运行时完全一致的编译容器,执行命令:
docker run -it public.ecr.aws/sam/build-python3.8:latest /bin/bash - 进入容器后依次执行以下命令编译OpenSSL 1.1.1k:
# 安装编译依赖 yum install -y make gcc perl-core pcre-devel wget # 下载OpenSSL 1.1.1k源码 wget https://www.openssl.org/source/openssl-1.1.1k.tar.gz tar -xzf openssl-1.1.1k.tar.gz cd openssl-1.1.1k # 配置安装路径适配Lambda层的/opt目录结构 ./config --prefix=/opt/openssl --openssldir=/opt/openssl shared zlib make -j$(nproc) make install
步骤2:封装为Lambda层安装包
- 容器内执行以下命令整理层目录结构:
mkdir -p /tmp/layer/lib /tmp/layer/python/lib/python3.8/site-packages cp -r /opt/openssl/lib/* /tmp/layer/lib/ cp -r /opt/openssl/lib/python3.8/site-packages/* /tmp/layer/python/lib/python3.8/site-packages/ 2>/dev/null || true
- 打包层文件:
cd /tmp/layer zip -r openssl111k-layer.zip .
- 本地新开终端执行以下命令,将打包好的zip包从容器拷贝到本地(<容器ID>替换为实际运行的容器ID,可通过
docker ps查询):docker cp <容器ID>:/tmp/layer/openssl111k-layer.zip ./
步骤3:Lambda控制台配置
- 进入Lambda控制台的「层」管理页,创建新层,上传本地的openssl111k-layer.zip,兼容运行时勾选Python 3.8
- 打开目标Lambda函数的配置页,在「层」模块添加刚创建的自定义层
- 在函数的「环境变量」配置页新增/修改两个变量,让系统优先加载层内的新版OpenSSL:
- 变量名
LD_LIBRARY_PATH,值为/opt/lib:$LD_LIBRARY_PATH - 变量名
PATH,值为/opt/openssl/bin:$PATH
- 变量名
生效验证
在你的Python业务代码开头加入以下校验代码,触发函数运行后查看日志输出的OpenSSL版本:
import ssl print("当前使用的OpenSSL版本:", ssl.OPENSSL_VERSION)
如果日志输出当前使用的OpenSSL版本: OpenSSL 1.1.1k 25 Mar 2021即为配置成功,原有报错会自动消除。
内容的提问来源于stack exchange,提问作者Sebastian
相关产品推荐
相关产品推荐

