无法在AWS Lambda上使用Requests-Module

cod*_*leb 48 python amazon-web-services python-2.7 aws-lambda

我需要在python脚本中进行休息调用,每天运行一次.我无法使用AWS Lambdas将"requests"包打包到我的python-package中.我收到错误:"无法导入模块'lambda_function':没有名为lambda_function的模块"

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

这是我已经做过的事情:

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

一切的命名如下:

  • zip文件:lambda_function.zip
  • py-file:lambda_function.py
  • handler方法:lambda_handler(事件,上下文)
  • "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'
Run Code Online (Sandbox Code Playgroud)

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

Sin*_*Liu 176

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

from botocore.vendored import requests

def lambda_handler(event, context):
   response = requests.get("https://example.com/")
   print response.json()
Run Code Online (Sandbox Code Playgroud)

您可以看到这个要点,以了解可以直接在AWS lambda中导入的更多模块

  • 注意-这似乎不再起作用。```AttributeError:模块'botocore.vendored.requests'没有属性'get'```` (15认同)
  • 有人担心这些可能会在以后的版本中消失吗?"虽然这些出售的依赖项仍然在botocore包中,但它们不应该被使用,因为它们将来会被删除"https://botocore.amazonaws.com/v1/documentation/api/latest/index.html#upgrading-to -1-11-0 (14认同)
  • 是的,该博客说“Python 3.8 及更高版本的 Lambda 运行时不包含‘请求’模块。” (4认同)
  • 我不再使用这种方法。botocore的官方仓库有一个警告说,botocore.vendored请求将在将来被删除。 (2认同)
  • @MichaelBrant,您需要在功能中上传请求库。https://docs.aws.amazon.com/lambda/latest/dg/lambda-python-how-to-create-deployment-package.html (2认同)

小智 27

如果您在 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
Run Code Online (Sandbox Code Playgroud)

  • 这是最好的答案。 (3认同)

cod*_*leb 15

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

如果您在经过数小时的尝试和失败后发现如此简单的错误,这有点令人沮丧.


Ram*_*mis 13

大多数评论在某种程度上是正确的,但对于 AWS 初学者来说信息不足。这是我的长简历,访问请求功能需要做什么:

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

在此输入图像描述


Pra*_*nik 8

我相信你已经lambda_function.py在Lambda控制台上了.您需要首先创建Lambda函数部署包,然后使用控制台上载包.

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

转到Lambda控制台,选择代码条目类型的上传zip文件并上传部署包.导入请求应该没有任何错误.

  • 您可以在包含 lambda_function.py 的目录中使用“pip install requests -t .”(即 -t 之后的点),而不是键入完整的项目目录路径。(形成 qarly_blue 的答案)。奖励:也适用于 Windows (2认同)

qar*_*lue 7

使用此命令下载文件夹包

pip install requests -t .
Run Code Online (Sandbox Code Playgroud)

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

  • 不认为这适用于 AWS Lambda (4认同)

gra*_*ntr 5

蟒蛇 3.8 视窗 10

lambda 正在寻找特定的文件夹结构,我们将在以下步骤中以这种方式重新创建 ( https://docs.aws.amazon.com/lambda/latest/dg/configuration-layers.html#configuration-layers-创建): 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())
    }
Run Code Online (Sandbox Code Playgroud)