来自 cyptography.hazmat.bindings._constant_time 导入库的导入错误
Import Error from cyptography.hazmat.bindings._constant_time import lib
所以我正在尝试创建一个 aws lambda 函数,以登录到一个实例并执行一些操作。该脚本在 lambda 之外工作正常,但是当我使用与此 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
该教程中的 zip 命令缺少一个参数。我 运行 今天使用基于 paramiko 构建的 pysftp 解决了这个确切的问题。 libffi-72499c49.so.6.0.4
位于 lib64/python2.7/site-packages/.libs_cffi_backend
内的隐藏点目录中。根据您在 virtualenv 中压缩依赖项的方式,您可能无意中排除了该目录。
首先,请确保您的 Amazon Linux instance 上安装了 libffi-devel 和 openssl-devel,否则加密模块可能无法正确编译。
sudo yum install libffi-devel openssl-devel
如果之前没有安装这些包,请删除并重建您的 virtualenv。
确保在压缩站点包时使用“.”。而不是“*”,否则您将不会包含隐藏的文件和目录,因为它们的名称以句点开头。
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 .
我的 2 美分:如果你想在尽可能类似于实际 lambda 的环境中构建和测试你的 lambda 函数,但仍在你的控制之下,我建议使用 LambCI's Docker images。它们基于原始 lambda 文件系统的转储。它们还有特定于构建的变体(标签 build-python2.7
和 build-python3.6
对我们来说最有趣)。
这些图像不是很小 - 超过 500mb - 但它们可以让您在构建时避免任何头痛。
与 Amazon Linux 相比的重要好处是所有包版本等都与真正的 lambda 相同。
以下是我如何构建自己的:
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: ...
另一个对我来说效果很好的解决方案是安装 paramiko 需要的底层包的 linux 版本(bcrypt、cffi、cryptography 和 PyNaCl)并自行解压。
您可以使用:
pip download PyNaCl --platform manylinux1_x86_64 --no-deps -d lambda_project/python/lib/python3.8/site-packages
pip download cffi --platform manylinux1_x86_64 --no-deps -d lambda_project/python/lib/python3.8/site-packages
pip download bcrypt --platform manylinux1_x86_64 --no-deps -d lambda_project/python/lib/python3.8/site-packages
pip download cryptography --platform manylinux2014_x86_64 --no-deps -d lambda_project/python/lib/python3.8/site-packages
cd lambda_project/python/lib/python3.8/site-packages
unzip \*.whl
rm *.whl
paramiko 本身不依赖于平台,因此您可以正常操作:
pip install paramiko -t lambda_project/python/lib/python3.8/site-packages/.
我将它们放入 lambda 层中,这样一旦我让它工作,我就可以将同一个附加到我需要它的任何 lambda 中,但相同的概念应该直接在 lambda 上工作。
就我而言,当我在 运行 Python 3.6 机器上开发和打包时,我不小心在我的 Lambda 部署中指定了我想要 Python 3.7。他们需要匹配。
所以我正在尝试创建一个 aws lambda 函数,以登录到一个实例并执行一些操作。该脚本在 lambda 之外工作正常,但是当我使用与此 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
该教程中的 zip 命令缺少一个参数。我 运行 今天使用基于 paramiko 构建的 pysftp 解决了这个确切的问题。 libffi-72499c49.so.6.0.4
位于 lib64/python2.7/site-packages/.libs_cffi_backend
内的隐藏点目录中。根据您在 virtualenv 中压缩依赖项的方式,您可能无意中排除了该目录。
首先,请确保您的 Amazon Linux instance 上安装了 libffi-devel 和 openssl-devel,否则加密模块可能无法正确编译。
sudo yum install libffi-devel openssl-devel
如果之前没有安装这些包,请删除并重建您的 virtualenv。
确保在压缩站点包时使用“.”。而不是“*”,否则您将不会包含隐藏的文件和目录,因为它们的名称以句点开头。
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 .
我的 2 美分:如果你想在尽可能类似于实际 lambda 的环境中构建和测试你的 lambda 函数,但仍在你的控制之下,我建议使用 LambCI's Docker images。它们基于原始 lambda 文件系统的转储。它们还有特定于构建的变体(标签 build-python2.7
和 build-python3.6
对我们来说最有趣)。
这些图像不是很小 - 超过 500mb - 但它们可以让您在构建时避免任何头痛。
与 Amazon Linux 相比的重要好处是所有包版本等都与真正的 lambda 相同。
以下是我如何构建自己的:
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: ...
另一个对我来说效果很好的解决方案是安装 paramiko 需要的底层包的 linux 版本(bcrypt、cffi、cryptography 和 PyNaCl)并自行解压。
您可以使用:
pip download PyNaCl --platform manylinux1_x86_64 --no-deps -d lambda_project/python/lib/python3.8/site-packages
pip download cffi --platform manylinux1_x86_64 --no-deps -d lambda_project/python/lib/python3.8/site-packages
pip download bcrypt --platform manylinux1_x86_64 --no-deps -d lambda_project/python/lib/python3.8/site-packages
pip download cryptography --platform manylinux2014_x86_64 --no-deps -d lambda_project/python/lib/python3.8/site-packages
cd lambda_project/python/lib/python3.8/site-packages
unzip \*.whl
rm *.whl
paramiko 本身不依赖于平台,因此您可以正常操作:
pip install paramiko -t lambda_project/python/lib/python3.8/site-packages/.
我将它们放入 lambda 层中,这样一旦我让它工作,我就可以将同一个附加到我需要它的任何 lambda 中,但相同的概念应该直接在 lambda 上工作。
就我而言,当我在 运行 Python 3.6 机器上开发和打包时,我不小心在我的 Lambda 部署中指定了我想要 Python 3.7。他们需要匹配。