【问题标题】:How to Have NaCL at AWS Lambda Properly Working?如何让 AWS Lambda 上的 NaCL 正常工作?
【发布时间】:2019-09-09 11:12:32
【问题描述】:

我在 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 环境相关的特定问题,因为我可以在我的 Mac 上的 docker 内运行该函数。

这是我的 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

还有makefile:

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

没有解密部分,代码运行良好。所以这个问题是 100% 与 PyNaCl 相关的。

对解决这个问题有帮助吗?

【问题讨论】:

  • 这么快? numpy/core/multiarray.so/lib/nacl/_sodium.abi3.so 是两个不同的东西。唯一的相似之处是 lambda 抛出的错误:invalid ELF header。请不要让我的问题无效,伙计。
  • 好吧,我正在使用 docker。所以,我期待我的 dockerfile 有一些有用的提示/行。如果我需要“启动一个 ec2 实例并创建具有必要依赖项的 virtualenv”,那么 docker 有什么用?
  • 你如何运行你的容器?
  • 用我的 makefile 更新问题。

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


【解决方案1】:

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

SODIUM_INSTALL=system pip3 install pynacl

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

this

PyNaCl的最后一个版本中更新为libsodium 1.0.16.所以可能与AWS不兼容

所以您可以从requirements.txt 中删除PyNaCl 并将其添加到您的Dockerfile

RUN SODIUM_INSTALL=system pip3 install pynacl -t /var/task/lib

或者可以像这样设置dockerfile并将PyNaCl保留在requirements.txt中:

ARG SODIUM_INSTALL=system

在安装 PyNaCl 之前也尝试设置钠:

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

【讨论】:

  • 有趣。那么这条SODIUM_INSTALL=system pip install pynacl 行在哪里呢?
  • 完成。现在错误已经改变。 AWS Lambda 说:Unable to import module 'lambda_function': No module named 'nacl'。我必须说两件事:1)我的 lambda 函数上有 import nacl.secretimport nacl.encoding,2)在我的机器上运行 docker 一切正常。
  • 对不起,您需要像其他模块一样使用 pip3
  • 所有选项在我的机器上运行 docker 运行良好。没有一个选项适用于 AWS Lambda:pynacl on "requirements.txt" = Unable to import module 'lambda_function': /var/task/lib/nacl/_sodium.abi3.so: invalid ELF header。没有它=Unable to import module 'lambda_function': No module named 'nacl'。 *dockerfile 是按照你说的那样设置的。
  • 查看更新,现在我没有想法了 :) 如果你找到它,请发布 tue 解决方案
【解决方案2】:

好的,我就是这样做的。我必须在 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 是一个独立于主机的环境,但我想事实并非如此。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-01-07
    • 1970-01-01
    • 2019-04-24
    • 2015-05-08
    • 2020-08-27
    • 2018-06-11
    • 2016-08-27
    • 1970-01-01
    相关资源
    最近更新 更多