首页 > 解决方案 > 在 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 的版本,它们会有所不同:

我不认为答案是在 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文件中

并上传到 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

标签: aws-lambdam2crypto

解决方案


首先,我在 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”。

我不确定我是否需要这两项更改来解决我的问题,但它现在可以正常工作,经过三天的故障排除后,我不敢触摸它以查看是否是其中一个使它工作。


推荐阅读