我正在使用M2Crypto库创建一个简单的AWS Lambda函数。我按照here创建部署包的步骤进行了操作。 lambda函数在EC2 Linux实例(AMI)上运行良好。
这是我的功能定义:
from M2Crypto import BIO, RSA, EVP
def verify(event, context):
pem = "-----BEGIN PUBLIC KEY-----\n{0}\n-----END PUBLIC KEY-----".format("hello")
bio = BIO.MemoryBuffer(str.encode(pem))
print(bio)
return
当我运行Lambda时,我遇到以下问题,我也尝试从/ lib64目录中包含libcrypto.so.10,但没有帮助。
运行Lambda 时出现/var/task/M2Crypto/_m2crypto.so:符号sk_deep_copy,版本libcrypto.so.10未在文件libcrypto.so.10中定义,带有链接时间参考`
Python: 2.7
M2Crypto: 0.27.0
答案 0 :(得分:1)
我猜想M2Crypto是用不同版本的OpenSSL构建的,而不是Lambda上的版本。见the relevant code。如果没有(上游维护者在这里发言),请在https://gitlab.com/m2crypto/m2crypto/issues
提交错误答案 1 :(得分:1)
我只想在@ mcepl的答案中添加更多细节。最重要的是AWS Lambda上的OpenSSL版本和构建M2Crypto库的环境(在我的情况下为ec2)应该匹配。
要检查Lambda上的openssl版本,请在处理程序中使用print:
print(ssl.OPENSSL_VERSION)
要在构建环境中检查openssl版本,请使用:
$ openssl version
一旦匹配,就可以了。
不要在构建环境中降级或升级OpenSSL以匹配Lambda环境。我不得不在ec2上降级我的openssl以匹配lambda运行时环境。
sudo yum -y downgrade openssl-devel-1.0.1k openssl-1.0.1k
希望它能帮助任何尝试使用M2Crypto的人:)
答案 2 :(得分:0)
在此处复制my answer以获得类似问题:
AWS lambda在旧版本的Amazon Linux(amzn-ami-hvm-2017.03.1.20170812-x86_64-gp2)上运行代码,如官方文档中所述 https://docs.aws.amazon.com/lambda/latest/dg/current-supported-versions.html
因此,要运行依赖于共享库的代码,需要在同一环境中对其进行编译,以便可以正确链接。
在这种情况下,我通常要做的是使用docker容器创建virtualenv。然后可以将virtualenv与lambda代码打包在一起。
请注意,如果需要使用yum(在Docker容器中)安装任何东西,则必须使用与Amazon Linux版本相同的发行服务器:
yum --releasever=2017.03 install ...
virtualenv也可以使用EC2实例而不是docker容器来构建(尽管我发现docker方法更容易)。只要确保用于EC2的AMI与lambda使用的AMI相同即可。