【问题标题】:Cannot use Requests-Module on AWS Lambda无法在 AWS Lambda 上使用请求模块
【发布时间】:2017-04-06 02:15:46
【问题描述】:

我需要在每天运行一次的 python 脚本中进行休息调用。 我无法使用 AWS Lambda 将“请求”包打包到我的 python 包中。我收到错误消息:“无法导入模块 'lambda_function':没有名为 lambda_function 的模块”

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

这是我已经做过的:

  1. zip 和项目文件夹(包括子文件夹)的权限设置为 `chmod 777`。所以权限应该不是问题。
  2. 脚本本身位于根文件夹中。当你打开 zip 文件时,你会直接看到它。
  3. 我使用 `sudo pip install requests -t PATH_TO_ROOT_FOLDER` 将 requests 包安装到项目的根文件夹中

一切的命名是这样的:

  • 压缩文件:lambda_function.zip
  • py 文件:lambda_function.py
  • 处理程序方法:lambda_handler(event, context)
  • “webconfig: lambda_function.lambda_handler”中的处理程序定义

最后我要运行的文件是这样的:

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'

我很高兴能得到任何帮助。我已经在这个问题上使用了多个小时。

【问题讨论】:

  • 在您的问题中,pip install 命令中 -t 选项的位置不正确 - 它必须是 pip install requests -t PATH_TO_ROOT_FOLDER 。你是不是打错了,或者这就是你真正运行它的方式?
  • @Leon:对。刚刚检查了历史,我就像你在这里提到的那样做了。 :) 所以这并没有导致问题。
  • 你在本地使用什么版本的Python?
  • @Leon: 2.7.12 (15chars)

标签: python python-2.7 amazon-web-services aws-lambda


【解决方案1】:

编辑:2019 年 10 月 21 日,Botocore 删除了请求的供应商版本:https://github.com/boto/botocore/pull/1829

编辑 2:(2020 年 3 月 10 日):Lambda 服务在 AWS 开发工具包中捆绑请求模块的弃用日期现在是 2021 年 1 月 30 日。https://aws.amazon.com/blogs/compute/upcoming-changes-to-the-python-sdk-in-aws-lambda/

要使用 requests 模块,您可以简单地从 botocore.vendored 导入 requests。例如:

from botocore.vendored import requests

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

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

【讨论】:

  • 是否担心这些可能会在以后的版本中消失? “虽然这些供应商的依赖项仍在 botocore 包中,但不应使用它们,因为它们将来会被删除”botocore.amazonaws.com/v1/documentation/api/latest/…
  • 这应该是公认的答案。帮助像我这样的人节省了大量时间。
  • 我不会再使用这种方法了。 botocore 的官方 repo 有一条警告说 botocore.vendred 请求将在未来被删除。
  • @MichaelBrant,您需要上传请求库作为函数的一部分。 docs.aws.amazon.com/lambda/latest/dg/…
  • 注意 - 这似乎不再有效。 AttributeError: module 'botocore.vendored.requests' has no attribute 'get'
【解决方案2】:

如果您在 AWS Lambda 上使用 Python,并且需要使用 requests,您最好使用 urllib3,它目前在 AWS Lambda 上受支持,您可以直接导入,检查urllib3 站点上的示例。

import urllib3

http = urllib3.PoolManager()
r = http.request('GET', 'http://httpbin.org/robots.txt')

r.data
# b'User-agent: *\nDisallow: /deny\n'
r.status
# 200

【讨论】:

  • 这是最好的答案。
【解决方案3】:

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

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

【讨论】:

  • 你的脚本会返回 json 吗?我正在尝试做类似的事情,但不断得到“不可序列化的 json”。但是我没有'import json'......代码在没有'import json'的情况下在本地工作正常,所以不知道为什么它不在Lambda中。
  • @kafka 您可能需要导入 json 库。虽然不确定,但 AWS 使用 python 2.7 而不是 3.x。我的脚本没有返回 json。
  • 是的,这里是 python 2.7。将尝试显式引用 json 库。目前正在重新包装。
  • 好吧,这里不高兴,在您的代码中,您只需返回“hello lambda_helper”,我想从 API 返回整个 JSON 响应尽管...如果您不知道我,请不要担心可能会做一个新问题
  • 我返回状态码。但是,是的,我不太喜欢python。写那个脚本还不够。
【解决方案4】:

我相信您在 Lambda 控制台上有 lambda_function.py。您需要先创建 Lambda 函数部署包,然后使用控制台上传该包。

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

进入 Lambda 控制台,在代码输入类型中选择上传 zip 文件并上传您的部署包。导入请求应该可以正常工作。

【讨论】:

  • 您可以在包含 lambda_function.py 的目录中使用 pip install requests -t .(即 -t 后的一个点),而不是输入完整的项目目录路径。 (形成 qarly_blue 的回答)。奖励:也适用于 Windows
【解决方案5】:

使用此命令下载文件夹包

pip install requests -t .

在您的本地机器上运行此命令,然后压缩您的工作目录,然后上传到 aws。

【讨论】:

  • 不要认为这适用于 AWS Lambda
  • 这个答案与 pramod munemanik 下面的答案一起是目前最好的答案
【解决方案6】:

python 3.8 windows 10

lambda 正在寻找特定的文件夹结构,我们将按照以下步骤以这种方式重新创建 (https://docs.aws.amazon.com/lambda/latest/dg/configuration-layers.html#configuration-layers-create):

  1. 在桌面上创建一个名为“python”的文件夹,打开一个 cmd 终端:cd desktop
  2. pip install --target python 请求
  3. 右键单击您的 python 文件夹并将其压缩,然后将 zip 重命名为“requests.zip” - 现在,如果您查看 zip 内部,您应该会看到 python 文件夹。
  4. aws 控制台 > lambda > 层 > 创建层 => 命名层/上传 requests.zip
  5. aws 控制台 > 功能 > 创建功能 => 在“设计器”框中选择图层,然后“添加图层”。选择自定义图层并选择 你的图层。
  6. 通过单击设计器框中的 lambda 符号返回功能屏幕。现在您可以再次看到“功能代码”。点击 lambda_function.py

现在您可以像这样导入请求:

import json
import requests

def lambda_handler(event, context):
    # TODO implement
    response = requests.get('your_URL')
    return {
        'statusCode': 200,
        'body': json.dumps(response.json())
    }

【讨论】:

    【解决方案7】:
    1. 从 AWS lambda 控制台复制您在 lambda_function 中的所有内容并将其粘贴到新的 Python 脚本中,并将其另存为 lambda_function.py

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

    3. lambda_function.py 移动到文件夹(package)中。

    4. 转到文件夹并选择所有内容并压缩它们。

    5. 返回 AWS Lambda 控制台。选择函数并在函数代码部分下,单击“操作”(在右侧)并选择Upload a .zip file

    6. 上传文件夹。 lambda_function 应该会自动上传。

    7. 跑步和享受。

    【讨论】:

    【解决方案8】:

    大部分内容在某种程度上是正确的,但对于 AWS 初学者来说信息量不足。这是我访问请求功能需要做的长简历:

    1。为 AWS Lambda 函数创建根文件夹
    % mkdir lambda-function
    
    2。进入 crated 根文件夹
    % cd lambda-function
    
    3。为 AWS Lambda 创建入口点 Python 文件。
    % vi lambda_function.py
    
    4。将代码粘贴到 lambda_function.py
    import requests
    def lambda_handler(event, context):   
        response = requests.get("https://www.test.com/")
        print(response.text)
        return response.text 
    
    5。安装请求库。注意:已创建包文件夹
    % pip install --target ./package requests
    
    6。进入包内
    % cd package
    
    7。压缩包
    zip -r ../deployment-package.zip .
    
    8.进入父文件夹
    % cd ..
    
    9。 Zip部署包和lambda函数文件
    % zip -g deployment-package.zip lambda_function.py
    
    1. 在 AWS Lambda 函数中,点击“上传来源”并选择“.zip 文件”。导航到您的 zip 包 zip 文件:deployment-package.zip。
    2. 上传后所有文件都将在 AWS Lambda 函数中。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-07-14
      • 1970-01-01
      • 2021-10-18
      • 2018-09-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多