脚本适用于AWS EC2,但在压缩后不适用于AWS Lambda

时间:2017-12-05 12:34:09

标签: amazon-web-services aws-lambda m2crypto

我正在使用M2Crypto库创建一个简单的AWS Lambda函数。我按照here创建部署包的步骤进行了操作。 lambda函数在EC2 Linux实例(AMI)上运行良好。

这是我的功能定义:

CloudOAuth.py

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 Deployment Package skeleton

当我运行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

3 个答案:

答案 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相同即可。