如何让 NaCL 在 AWS Lambda 正常工作?

Lui*_*ock 5 python python-3.x docker nacl-cryptography aws-lambda

我正在AWS lambda 上使用Pychromeless 存储库并取得成功。

\n\n

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

\n\n

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

\n\n

与补充

\n\n

invalid ELF header\n\xc2\xa0

\n\n

在 AWS Lambda 上运行该函数时。

\n\n

我知道这是一个与 AWS Lambda 环境相关的特定问题,因为我可以在 Mac 上的 docker 中运行该函数。

\n\n

这是我的requirements.txt 文件

\n\n
boto3==1.6.18\nbotocore==1.9.18\nselenium==2.53.6\nchromedriver-install==1.0.3\nbeautifulsoup4==4.6.1\ncertifi==2018.11.29\nchardet==3.0.4\neditdistance==0.5.3\nfuture==0.17.1\nidna==2.7\npython-telegram-bot==10.1.0\nrequests==2.19.1\nsoupsieve==1.7.3\nurllib3==1.23\nPyNaCl==1.3.0\n
Run Code Online (Sandbox Code Playgroud)\n\n

这是 dockerfile

\n\n
FROM lambci/lambda:python3.6\nMAINTAINER tech@21buttons.com\n\nUSER root\n\nENV APP_DIR /var/task\n\nWORKDIR $APP_DIR\n\nCOPY requirements.txt .\nCOPY bin ./bin\nCOPY lib ./lib\n\nRUN mkdir -p $APP_DIR/lib\nRUN pip3 install -r requirements.txt -t /var/task/lib\n
Run Code Online (Sandbox Code Playgroud)\n\n

和生成文件:

\n\n
clean:\n    rm -rf build build.zip\n    rm -rf __pycache__\n\nfetch-dependencies:\n    mkdir -p bin/\n\n    # Get chromedriver\n    curl -SL https://chromedriver.storage.googleapis.com/2.37/chromedriver_linux64.zip > chromedriver.zip\n    unzip chromedriver.zip -d bin/\n\n    # Get Headless-chrome\n    curl -SL https://github.com/adieuadieu/serverless-chrome/releases/download/v1.0.0-37/stable-headless-chromium-amazonlinux-2017-03.zip > headless-chromium.zip\n    unzip headless-chromium.zip -d bin/\n\n    # Clean\n    rm headless-chromium.zip chromedriver.zip\n\ndocker-build:\n    docker-compose build\n\ndocker-run:\n    docker-compose run lambda src/lambda_function.lambda_handler\n\n\nbuild-lambda-package: clean fetch-dependencies\n    mkdir build\n    cp -r src build/.\n    cp -r bin build/.\n    cp -r lib build/.\n    pip install -r requirements.txt -t build/lib/.\n    cd build; zip -9qr build.zip .\n    cp build/build.zip .\n    rm -rf build\n
Run Code Online (Sandbox Code Playgroud)\n\n

如果没有解密部分,代码就可以很好地工作。所以这个问题100%与PyNaCl有关。

\n\n

有什么帮助解决这个问题吗?

\n

Lin*_*nPy 0

我想你可以尝试PyNaCl这样设置:

SODIUM_INSTALL=system pip3 install pynacl
Run Code Online (Sandbox Code Playgroud)

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

看到这个

在最新版本中PyNaCl更新为,libsodium 1.0.16.因此可能不兼容AWS

因此您可以将其删除PyNaClrequirements.txt添加到您的Dockerfile

RUN SODIUM_INSTALL=system pip3 install pynacl -t /var/task/lib
Run Code Online (Sandbox Code Playgroud)

或者也许像这样设置dockerfilePyNaCl保留requirements.txt

ARG SODIUM_INSTALL=system
Run Code Online (Sandbox Code Playgroud)

在安装 PyNaCI 之前尝试设置钠:

RUN wget https://download.libsodium.org/libsodium/releases/libsodium-1.0.15.tar.gz \ && tar xzf libsodium-1.0.15.tar.gz \ && cd libsodium-1.0.15 \ && ./configure \ && make install