在AWS Lambda上使用的加密包中找不到恒定时间模块

时间:2016-06-24 00:17:34

标签: python amazon-web-services paramiko aws-lambda pycrypto

[我是Python 2.7和AWS Lambda的新手,感谢任何帮助]

我按照AWS Lambda tutorial创建了一个virtualenv,以包含与使用paramiko相关联的Python库,将文件作为AWS Lambda上的计划任务复制到SFTP服务器,以运行以下脚本:

import paramiko

def worker_handler(event, context):

    host = "sftpserver.testdpom.com" 
    port = 22
    transport = paramiko.Transport((host, port))

    sftp = paramiko.SFTPClient.from_transport(transport)

    username = "xxxx"
    password = "xxxxxx"

    transport.connect(username = username, password = password)

    sftp = paramiko.SFTPClient.from_transport(transport)

    sftp.put("test.txt", "test.txt")
    sftp.close()
    transport.close()

    return
    {
        'message' : "Script execution completed. See Cloudwatch logs for complete output"
    }

python脚本在我的本地计算机上正常工作但是当我在AWS Lambda上测试包时,我收到错误“ImportError:No module named _constant_time”并在下面显示堆栈跟踪。

您能否在AWS Lambda环境中考虑此错误的任何可能原因?

  File "/var/task/paramiko/kex_group1.py", line 111, in _parse_kexdh_reply
    self.transport._verify_key(host_key, sig)
  File "/var/task/paramiko/transport.py", line 1617, in _verify_key
    key = self._key_info[self.host_key_type](Message(host_key))
  File "/var/task/paramiko/rsakey.py", line 58, in __init__
    ).public_key(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 2235, 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: No module named _constant_time

1 个答案:

答案 0 :(得分:7)

由于lambda在amazon linux实例下运行,你基本上需要:

  1. 启动亚马逊linux ec2实例
  2. 创建virtualenv并pip install您需要的所有包
  3. scp将文件下移到本地部署包所在的位置
  4. 这一切都是由于pip install如何以不同的方式处理问题,这取决于你是在linux还是mac(而且我也在假设Windows)。

    这是一个启动脚本,可以让ec2实例加快速度

    #!/bin/bash
    
    sudo yum upgrade -y
    sudo yum group install -y "Development tools"
    
    sudo yum install -y \
        python27 \
        libffi libffi-devel \
        openssl openssl-devel
    
    virtualenv venv
    source venv/bin/activate
    
    pip install paramiko
    

    paramiko包将在/path/to/venv/lib/python2.7/site-packages/paramiko中,cryptography内容将在path/to/venv/lib64/python2.7/cryptography

    我一直在我的本地mac上使用pip install的组合,并在包不起作用时执行此操作(例如paramikopsycopg2),并且很少有其他有用的软件包,人们已经预编译并在其他地方专门为lambda设置了github。

    HTH!