Python 无法在AWS Lambda上使用请求模块

Python 无法在AWS Lambda上使用请求模块,python,python-2.7,amazon-web-services,aws-lambda,Python,Python 2.7,Amazon Web Services,Aws Lambda,我需要在python脚本中执行rest调用,该脚本每天运行一次。 我无法使用AWS Lambdas将“requests”包打包到python包中。我收到错误:“无法导入模块‘lambda_函数’:没有名为lambda_函数的模块” 我将其分解为hello_world预定义脚本。我可以把它打包成一个zip文件并上传。一切正常。一旦我将“导入请求”放入文件中,就会出现此错误 以下是我已经做过的: zip和项目文件夹(包括子文件夹)的权限设置为“chmod 777”。所以权限应该不是问题 脚本本身位于

我需要在python脚本中执行rest调用,该脚本每天运行一次。 我无法使用AWS Lambdas将“requests”包打包到python包中。我收到错误:“无法导入模块‘lambda_函数’:没有名为lambda_函数的模块”

我将其分解为hello_world预定义脚本。我可以把它打包成一个zip文件并上传。一切正常。一旦我将“导入请求”放入文件中,就会出现此错误

以下是我已经做过的:

  • zip和项目文件夹(包括子文件夹)的权限设置为“chmod 777”。所以权限应该不是问题
  • 脚本本身位于根文件夹中。打开zip文件时,可以直接看到它
  • 我使用'sudo pip install requests-t PATH_TO_root_folder'将请求包安装到项目的根文件夹中`
  • 所有内容的命名如下所示:

    import requests
    import json
    
    
    def lambda_handler(event, context):
        url = 'xxx.elasticbeanstalk.com/users/login'
        headers = {"content-type": "application/json", "Authorization": "Basic Zxxxxxxxxx3NjxxZxxxxzcw==" }
        response = requests.put(url, headers=headers, verify=False)
        return 'hello lambda_handler'
    
    import json
    import requests
    
    def lambda_handler(event, context):
        # TODO implement
        response = requests.get('your_URL')
        return {
            'statusCode': 200,
            'body': json.dumps(response.json())
        }
    
    • zip文件:lambda_function.zip
    • py文件:lambda_function.py
    • 处理程序方法:lambda_处理程序(事件、上下文)
    • “webconfig:lambda_function.lambda_处理程序”中的处理程序定义
    最后我要运行的文件如下所示:

    import requests
    import json
    
    
    def lambda_handler(event, context):
        url = 'xxx.elasticbeanstalk.com/users/login'
        headers = {"content-type": "application/json", "Authorization": "Basic Zxxxxxxxxx3NjxxZxxxxzcw==" }
        response = requests.put(url, headers=headers, verify=False)
        return 'hello lambda_handler'
    
    import json
    import requests
    
    def lambda_handler(event, context):
        # TODO implement
        response = requests.get('your_URL')
        return {
            'statusCode': 200,
            'body': json.dumps(response.json())
        }
    

    我很高兴能得到任何帮助。我已经在这个问题上花了好几个小时。

    我终于解决了这个问题:我的zip文件中的结构被破坏。重要的是python脚本和打包的依赖项(作为文件夹)位于zip文件的根目录中。这解决了我的问题


    如果在数小时的尝试和失败后发现如此简单的错误,那就有点令人沮丧了。

    我相信您在lambda控制台上有
    lambda_function.py
    。您需要首先创建lambda function部署包,然后使用控制台上载包

    • 您可以在系统(本地)上创建目录,例如
      project dir
    • project dir
      中创建
      lambda_function.py
      ,从lambda控制台复制
      lambda_function.py
      的内容,并将其粘贴到
      project dir/lambda_function.py
    • pip安装请求-t/path/to/project dir
    • 压缩
      project dir
      目录的内容,这是您的部署包(压缩目录内容,而不是目录)

    转到Lambda控制台,选择“在代码输入类型中上载zip文件”并上载部署包。导入请求应无任何错误。

    编辑:2019年10月21日,Botocore删除了请求的供应商版本:

    编辑2:(2020年3月10日):Lambda服务捆绑AWS SDK中的请求模块的弃用日期现在是2021年1月30日。

    要使用请求模块,您只需从
    botocore.vendored
    导入
    请求即可。例如:

    from botocore.vendored import requests
    
    def lambda_handler(event, context):
       response = requests.get("https://httpbin.org/get", timeout=10)
       print(response.json())
    

    您可以查看了解更多可直接导入AWS lambda的模块。

    使用此命令下载文件夹包

    pip install requests -t .
    

    在本地计算机上运行此命令,然后压缩工作目录,然后上载到aws。

    如果您在aws Lambda上使用Python,并且需要使用请求,您最好使用,aws Lambda当前支持它,您可以直接导入它,请查看urllib3站点上的示例

    导入urllib3
    http=urllib3.PoolManager()
    r=http.request('GET','http://httpbin.org/robots.txt')
    r、 资料
    #b'用户代理:*\n默认:/deny\n'
    r、 地位
    # 200
    
  • 从AWS lambda控制台复制
    lambda_函数中的所有内容,并将其粘贴到新的python脚本中,并将其另存为
    lambda_函数.py

  • 创建一个新文件夹(我将其命名为package),并通过在终端中运行以下代码将
    请求
    模块保存在其中:pip install-t package requests

  • lambda_function.py
    移动到文件夹(包)中

  • 转到文件夹,选择所有内容并将其压缩

  • 返回AWS Lambda控制台。选择功能,在功能代码部分下,单击“操作”(右侧)并选择
    上载.zip文件

  • 上传文件夹。lambda_函数应自动上传

  • 快跑,尽情享受

  • python 3.8 windows 10

    lambda正在寻找一个特定的文件夹结构,我们将按照以下步骤()以这种方式重新创建:

  • 在桌面上创建一个名为“python”的文件夹,打开一个cmd终端:cd desktop
  • pip安装——目标python请求
  • 右键单击python文件夹并将其压缩,然后将压缩重命名为“requests.zip”-现在,如果查看压缩内部,您应该会看到python文件夹
  • aws控制台>lambda>图层>创建图层=>命名图层/upload requests.zip
  • aws控制台>功能>创建功能=>在“设计器”框中选择图层,然后选择“添加图层”。选择自定义图层并选择 你的图层
  • 单击设计器框中的lambda符号返回函数屏幕。现在您可以再次看到“函数代码”。单击lambda_function.py
  • 现在,您可以像这样导入请求:

    import requests
    import json
    
    
    def lambda_handler(event, context):
        url = 'xxx.elasticbeanstalk.com/users/login'
        headers = {"content-type": "application/json", "Authorization": "Basic Zxxxxxxxxx3NjxxZxxxxzcw==" }
        response = requests.put(url, headers=headers, verify=False)
        return 'hello lambda_handler'
    
    import json
    import requests
    
    def lambda_handler(event, context):
        # TODO implement
        response = requests.get('your_URL')
        return {
            'statusCode': 200,
            'body': json.dumps(response.json())
        }
    

    在您的问题中,
    -t
    选项在
    pip install
    命令中的位置不正确-它一定是
    pip install requests-t PATH_TO_ROOT_FOLDER
    。您是键入错误,还是这就是您真正运行它的方式?@Leon:对。只是检查了历史记录,我按照您在这里提到的那样做了。:)所以这并没有导致错误问题。你在本地使用什么版本的Python?@Leon:2.7.12(15个字符)你看过指南了吗?你的脚本会返回json吗?我也在尝试类似的操作,但会一直得到“not json serialisable”。但是我没有“import json”…没有“import json”的代码在本地可以正常工作,所以不确定为什么它不会在Lambda中运行。@kafka你可能需要导入json库。虽然不确定,但AWS