如何让AWS Lambda上的NaCL正常运行?

时间:2019-09-09 11:12:32

标签: python python-3.x docker aws-lambda nacl-cryptography

我在AWS lambda上成功使用Pychromeless repo

现在我需要使用NaCL依赖项来解密字符串,但是我得到了

Unable to import module 'lambda_function': /var/task/lib/nacl/_sodium.abi3.so

补充

invalid ELF header

在AWS Lambda上运行该功能时。

我知道这是与AWS Lambda环境有关的特定问题,因为我可以在docker内部的Mac上运行该功能。

这是我的requirements.txt文件

boto3==1.6.18
botocore==1.9.18
selenium==2.53.6
chromedriver-install==1.0.3
beautifulsoup4==4.6.1
certifi==2018.11.29
chardet==3.0.4
editdistance==0.5.3
future==0.17.1
idna==2.7
python-telegram-bot==10.1.0
requests==2.19.1
soupsieve==1.7.3
urllib3==1.23
PyNaCl==1.3.0

这是dockerfile

FROM lambci/lambda:python3.6
MAINTAINER tech@21buttons.com

USER root

ENV APP_DIR /var/task

WORKDIR $APP_DIR

COPY requirements.txt .
COPY bin ./bin
COPY lib ./lib

RUN mkdir -p $APP_DIR/lib
RUN pip3 install -r requirements.txt -t /var/task/lib

和生成文件:

clean:
    rm -rf build build.zip
    rm -rf __pycache__

fetch-dependencies:
    mkdir -p bin/

    # Get chromedriver
    curl -SL https://chromedriver.storage.googleapis.com/2.37/chromedriver_linux64.zip > chromedriver.zip
    unzip chromedriver.zip -d bin/

    # Get Headless-chrome
    curl -SL https://github.com/adieuadieu/serverless-chrome/releases/download/v1.0.0-37/stable-headless-chromium-amazonlinux-2017-03.zip > headless-chromium.zip
    unzip headless-chromium.zip -d bin/

    # Clean
    rm headless-chromium.zip chromedriver.zip

docker-build:
    docker-compose build

docker-run:
    docker-compose run lambda src/lambda_function.lambda_handler


build-lambda-package: clean fetch-dependencies
    mkdir build
    cp -r src build/.
    cp -r bin build/.
    cp -r lib build/.
    pip install -r requirements.txt -t build/lib/.
    cd build; zip -9qr build.zip .
    cp build/build.zip .
    rm -rf build

没有解密部分,该代码就可以很好地工作。因此,该问题与PyNaCl有100%相关。

解决这个问题有帮助吗?

2 个答案:

答案 0 :(得分:0)

我认为您可以尝试像这样设置PyNaCl

SODIUM_INSTALL=system pip3 install pynacl

这将强制PyNaCl使用AWS提供的libsodium版本

请参阅this

{p>的最新版本中的

已更新为PyNaCl,因此可能与libsodium 1.0.16.不兼容

因此您可以从AWS中删除PyNaCl并将其添加到您的requirements.txt

Dockerfile

或者可以像这样设置RUN SODIUM_INSTALL=system pip3 install pynacl -t /var/task/lib 并将dockerfile保留在PyNaCl中:

requirements.txt

在安装PyNaCI之前,也请尝试设置钠盐:

ARG SODIUM_INSTALL=system

答案 1 :(得分:0)

好的,这就是我的方法。我必须在EC2 AMI Linux 2实例上构建所有内容。

amzn2-ami-hvm-2.0.20190823.1-x86_64-gp2(ami-0a1f49a762473adbd)

启动实例后,我使用this script安装Python 3.6(和pip)以及创建和激活虚拟环境。

对于docker部分,我遵循了this tutorial,但途中也遇到了一些麻烦(必须

sudo yum install polkit

sudo usermod -a -G docker ec2-user

重启

sudo curl -L https://github.com/docker/compose/releases/download/1.22.0/docker-compose-$(uname -s)-$(uname -m) -o /usr/local/bin/docker-compose

sudo chmod +x /usr/local/bin/docker-compose)。

但是无论如何,我还是设法在EC2实例上使用docker,构建了zip文件并将其上传到Lambda环境,在那里一切都按预期工作正常。

我认为docker是一个独立于主机的环境,但我想并非如此。