繁体   English   中英

脚本在压缩后可在AWS EC2上运行,但不适用于AWS Lambda

[英]Script works on AWS EC2, but not on AWS Lambda after zipping

我正在使用M2Crypto库创建一个简单的AWS Lambda函数。 我遵循了从此处创建部署程序包的步骤。 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部署程序包框架

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

我猜想M2Crypto是用与Lambda不同的OpenSSL版本构建的。 请参阅相关代码 如果不是(请上游维护者在这里讲话),请在https://gitlab.com/m2crypto/m2crypto/issues提交错误。

我只想在@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的人:)

在这里复制对类似问题的答案

AWS的λ运行的代码在一个旧版本的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 ... 

也可以使用EC2实例而不是docker容器来构建virtualenv(尽管我发现docker方法更容易)。 只要确保用于EC2的AMI与lambda使用的AMI相同即可。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM