aws-lambda - 在 lambda 上使用 M2Crypto 的问题(适用于 EC2)
问题描述
我正在尝试在 AWS Lambda 中使用 M2Crypto 安装 python 函数。
我使用Lambda AMI 映像启动了一个 EC2 实例,将 M2Crypto 安装到一个 virtualenv 中,并且能够让我的函数在 EC2 上运行。
然后我压缩了站点包并上传到 Lambda。我收到了这个错误
无法导入模块“epd_M2Crypto”:/var/task/M2Crypto/_m2crypto.cpython-36m-x86_64-linux-gnu.so:符号 sk_deep_copy,版本 libcrypto.so.10 未在文件 libcrypto.so.10 中定义链接时间参考
这里和这里有类似的问题和提示。我尝试在 zip 文件中上传有问题的库(libcrypto.so.10),但仍然出现相同的错误。我假设错误意味着 libcrypto.so.10 的 EC2 版本(用于安装 M2Crypto)与 Lambda 上的版本(我试图运行)不同,所以 M2Crypto 抱怨。
如果我查看 openssl 的版本,它们会有所不同:
- OpenSSL 1.0.0-fips 2010 年 3 月 29 日(lambda 版本)
- OpenSSL 1.0.2k-fips 2017 年 1 月 26 日(ec2 版本)
我不认为答案是在 ec2 上降级 openssl,因为 1.0.0 版本已过时(AWS 应用了安全补丁,但版本仍显示为 1.0.0)。(而且 yum 没有这么旧的版本)
这是我在 EC2 实例上用于使其在 EC2 上运行的步骤:
$ sudo yum -y update
$ sudo yum -y install python36
$ sudo yum -y install python-virtualenv
$ sudo yum -y groupinstall "Development Tools"
$ sudo yum -y install python36-devel.x86_64
$ sudo yum -y install openssl-devel.x86_64
$ mkdir ~/forlambda
$ cd ~/forlambda
$ virtualenv -p python3 venv
$ source venv/bin/activate
$ cd ~
$ pip install M2Crypto -t ~/forlambda/venv/lib/python3.6/site-packages/
$ cd ~/forlambda/venv/lib/python3.6/site-packages/
$ (create python function that uses M2Crypto)
$ zip -r9 ~/forlambda/archive.zip .
然后添加到zip文件中
- /usr/bin/openssl
- /usr/lib64/libcrypto.so.10
- /usr/lib64/libssl.so.10
并上传到 Lambda,这就是我现在卡住的地方。
我需要做些什么来让 Lambda 使用我在上传的 zip 中包含的 libcrypto.so.10 版本吗?
我的功能:
"""
Wrapper for M2Crypto
https://github.com/mcepl/M2Crypto
https://pypi.org/project/M2Crypto/
"""
from __future__ import print_function
from M2Crypto import RSA
import base64
import json
def decrypt_string(string_b64):
rsa = RSA.load_key('private_key.pem')
string_encrypted = base64.b64decode(string_b64)
bytes = rsa.private_decrypt(string_encrypted, 1)
string_plaintext = bytes.decode("utf-8")
response = {
's': string_plaintext,
'status': "OK",
'statuscode': 200
};
return response
def lambda_handler(event, context):
response = ""
action = event['action']
if action == "decrypt":
string_b64 = event['s']
response = decrypt_string(string_b64)
return response
解决方案
首先,我在 EC2 实例上运行此命令,以确保在我的 .zip 中包含正确的 .so 文件:
$ ldd -v _m2crypto.cpython-36m-x86_64-linux-gnu.so
ldd 命令的输出(为简洁而编辑):
libssl.so.10 => /lib64/libssl.so.10 (0x00007fd5f1892000)
libcrypto.so.10 => /lib64/libcrypto.so.10 (0x00007fd5f1433000)
根据上面的输出,我将 /lib64/libcrypto.so.10 包含在我的 .zip 中。
此外(在 AWS Support 的建议下),在 Lambda 控制台的“环境变量”下,我添加了一个值为“/var/task”的键“LD_LIBRARY_PATH”。
我不确定我是否需要这两项更改来解决我的问题,但它现在可以正常工作,经过三天的故障排除后,我不敢触摸它以查看是否是其中一个使它工作。
推荐阅读
- unix - rsyslog 是否转发评论(#)?
- mysql - 为什么记录在 40 秒后到达
- excel - 有没有办法使用自动化将图片从内存加载到 excel 中?
- google-cloud-platform - GCP:无法连接到 Datalab
- python - 仅返回 x 变量方程之前的数字
- javascript - 如何在 react-native 中使用 node.js 和 Socket.io 实现实时聊天?
- c++ - C++ OpenCV卡尔曼滤波器构造函数错误
- grep - GREP:如何匹配正数或负数?
- python - 在python中使用带有多个and条件的when语句
- javascript - 切换具有多个值的选择器 CSS