2016-08-15 26 views
8

私はawsラムダ関数を作成しようとしています。インスタンスにログインして何らかの作業をしています。スクリプトはラムダの外でうまく動作しますが、このhttps://aws.amazon.com/blogs/compute/scheduling-ssh-jobs-using-aws-lambda/と同じ命令を使ってパッケージ化すると動作しません。このエラーが発生します。cyptography.hazmat.bindings._constant_timeインポートエラーからのインポートエラー

libffi-72499c49.so.6.0.4: cannot open shared object file: No such file or directory: ImportError 
Traceback (most recent call last): 
    File "/var/task/lambda_function.py", line 12, in lambda_handler 
    key = paramiko.RSAKey.from_private_key(key) 
    File "/var/task/paramiko/pkey.py", line 217, in from_private_key 
    key = cls(file_obj=file_obj, password=password) 
    File "/var/task/paramiko/rsakey.py", line 42, in __init__ 
    self._from_private_key(file_obj, password) 
    File "/var/task/paramiko/rsakey.py", line 168, in _from_private_key 
    self._decode_key(data) 
    File "/var/task/paramiko/rsakey.py", line 173, in _decode_key 
    data, password=None, backend=default_backend() 
    File "/var/task/cryptography/hazmat/backends/__init__.py", line 35, in default_backend 
    _default_backend = MultiBackend(_available_backends()) 
    File "/var/task/cryptography/hazmat/backends/__init__.py", line 22, in _available_backends 
    "cryptography.backends" 
    File "/var/task/pkg_resources/__init__.py", line 2236, in resolve 
    module = __import__(self.module_name, fromlist=['__name__'], level=0) 
    File "/var/task/cryptography/hazmat/backends/openssl/__init__.py", line 7, in <module> 
    from cryptography.hazmat.backends.openssl.backend import backend 
    File "/var/task/cryptography/hazmat/backends/openssl/backend.py", line 15, in <module> 
    from cryptography import utils, x509 
    File "/var/task/cryptography/x509/__init__.py", line 7, in <module> 
    from cryptography.x509.base import (
    File "/var/task/cryptography/x509/base.py", line 15, in <module> 
    from cryptography.x509.extensions import Extension, ExtensionType 
    File "/var/task/cryptography/x509/extensions.py", line 19, in <module> 
    from cryptography.hazmat.primitives import constant_time, serialization 
    File "/var/task/cryptography/hazmat/primitives/constant_time.py", line 9, in <module> 
    from cryptography.hazmat.bindings._constant_time import lib 
ImportError: libffi-72499c49.so.6.0.4: cannot open shared object file: No such file or directory 
+0

あなたのライブラリのバージョンをチェックしてください - 特にopenssl – intotecho

+0

@intotechoどうすればいいですか?私はそれをインストールするときに私はpipからインストールします。私が行う唯一の2つのコマンドは 'pip install pycrypto'と' pip install paramiko'です。これは自分のサーバで実行するときに動作します。この問題は、aws lambdaに投げたときにのみ発生します –

+0

'pip freeze'はあなたのサーバ環境のすべてのライブラリをリストします。私はAWSをチェックする方法を知らない。あなたは、その指示が投稿されたブログを尋ねることができます。 – intotecho

答えて

17

このチュートリアルのzipコマンドにはパラメータがありません。私は今日パラマイフォに構築されているpysftpでこの問題に直面しました。 libffi-72499c49.so.6.0.4は、lib64/python2.7/site-packages/.libs_cffi_backendの中の隠しドットディレクトリにあります。あなたがvirtualenvの依存関係をどのように圧縮したかによって、意図せずにこのディレクトリを除外することができます。

  1. まず、そうでない場合は、暗号モジュールが正しくコンパイルされない場合があり、あなたのAmazon Linux instanceにインストールされていることを確認libffi-develのとOpenSSL-develのを作ります。

それらのパッケージが以前にインストールされていない場合は、削除してvirtualenvのを再構築

sudo yum install libffi-devel openssl-devel 

  1. 「。」を使用するサイトパッケージを圧縮していることを確認してください。 '*'の代わりに、名前がピリオドで始まるため隠されているファイルやディレクトリは含めません。

    cd path/to/my/helloworld-env/lib/python2.7/site-packages 
    zip -r9 path/to/zip/worker_function.zip . 
    cd path/to/my/helloworld-env/lib64/python2.7/site-packages 
    zip -r9 path/to/zip/worker_function.zip . 
    
+0

すごい!これは感謝を助けました! –

+3

この回答ありがとうございます!最初から始めている人のために。 Amazon Linuxのインスタンスは絶対に重要な部分です。そして 'pip install pycrypto'の前に' python-devel'と 'gcc'をインストールしたいかもしれません。 – warhod

+0

@warhod yeah!私の問題は、zipファイルを作成するためにamazonのLinuxインスタンスを使用したときに完全に修正されました。LambdaはAmazon Linux上で動作しますので、Amazon Linuxでzipやライブラリを作成してください。それはちょうど意味をなさない。 –

2

私の2セント:あなたは、可能な限り実際のラムダと同様の環境で&テストあなたのラムダ関数を構築することが、まだあなたのコントロール下で、私はLambdaCI's Docker imagesを使用することをお勧めしたい場合。それらは元のラムダファイルシステムのダンプに基づいています。また、ビルド固有のバリエーションもあります(タグbuild-python2.7build-python3.6が最も興味深い)。 これらの画像はあまり小さくはありません - 500mb以上ですが、ビルド時に頭痛を避けることができます。

Amazon Linuxよりも大きな利点は、すべてのパッケージのバージョンなどが実際のラムダと同じことです。ここで

私は自分自身を構築しました方法です:

cd PROJECT_DIR 
docker run --rm -it -v "$PWD":/var/task lambci/lambda:build-python2.7 bash 
### now in docker 
mkdir deps 
pip install -t deps -r requirements.txt 
# now all dependencies for our package are installed to deps/ directory, 
# without any garbage like wheel or setuptools - unlike when using virtualenv 
zip -r archive.zip MYCODE.py MYMODULE MYMODULE2.py 
cd deps 
# it's important to use . here, not * - or else some dot-starting directories will be omitted 
zip -r ../archive.zip . 
exit 
### now locally 
# just upload archive to lambda, with or without s3 

GitLab CIとそれを自動化するために、ちょうどその同じドッキングウィンドウの画像 を使用してデプロイスクリプト]セクションで、これらのコマンドを配置することを指示します。

deploy: 
    stage: deploy 
    image: lambci/lambda:build-python2.7 
    script: 
     - mkdir deps 
     - pip install -t deps -r requirements.txt 
     - zip -r archive.zip MYCODE.py MYMODULE MYMODULE2.py 
     - cd deps && zip -r ../archive.zip . && cd .. 
     - aws s3 cp archive.zip ${bucket}/${key} 
     - aws lambda update-function-code --function-name ${func} --s3-bucket ${bucket} --s3-key ${key} 
    variables: 
     bucket: ... 
     key: ... 
     func: ...