web-dev-qa-db-ja.com

cyptography.hazmat.bindings._constant_timeインポートライブラリからのインポートエラー

だから私はawsラムダ関数を作成し、インスタンスにログインして何かをしようとしています。そして、スクリプトはラムダの外でも問題なく機能しますが、これと同じ手順を使用してパッケージ化すると https://aws.Amazon.com/blogs/compute/scheduling-ssh-jobs-using-aws-lambda/ 動作しません。このエラーがスローされます。

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
19

そのチュートリアルのZipコマンドにはパラメーターがありません。今日、paramikoに基づいて構築されたpysftpでこの正確な問題に遭遇しました。 libffi-72499c49.so.6.0.4lib64/python2.7/site-packages/.libs_cffi_backend内の隠しドットディレクトリにあります。 virtualenvで依存関係をどのように圧縮したかに応じて、このディレクトリを誤って除外した可能性があります。

  1. まず、libffi-develとopenssl-develが Amazon Linuxインスタンス にインストールされていることを確認してください。そうでない場合、暗号化モジュールが正しくコンパイルされない可能性があります。

    Sudo yum install libffi-devel openssl-devel
    

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

  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 .
    
25
Gabriel Totusek

私の2セント:可能な限り実際のラムダと同様の環境でラムダ関数をビルドしてテストしたいが、それでも制御したい場合は、 LambCIのDockerイメージ を使用することをお勧めします。それらは、元のラムダファイルシステムのダンプに基づいています。また、ビルド固有のバリアント(タグbuild-python2.7およびbuild-python3.6は私たちにとって最も興味深いものです)。これらの画像は非常に小さくはありません-500 MB以上-構築時に頭痛を回避することができます。

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で自動化するには、同じDockerイメージを使用するように指示し、これらのコマンドをデプロイスクリプトセクションに配置します。

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: ...
5
MarSoft