无法在AWS Lambda上使用Requests-Module

时间:2016-11-22 11:59:54

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

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

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

这是我已经做过的事情:

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

    一切的命名如下:

    • zip-file:lambda_function.zip
    • py-file:lambda_function.py
    • 处理程序方法: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'
    

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

7 个答案:

答案 0 :(得分:133)

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

from botocore.vendored import requests

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

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

答案 1 :(得分:16)

如果您在AWS Lambda上使用Python,并且需要使用请求,则最好使用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

答案 2 :(得分:14)

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

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

答案 3 :(得分:6)

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

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

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

答案 4 :(得分:4)

python 3.8 视窗 10

lambda 正在寻找特定的文件夹结构,我们将在以下步骤中以这种方式重新创建 (https://docs.aws.amazon.com/lambda/latest/dg/configuration-layers.html#configuration-layers-create): 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 > 层 > 创建层 => 命名层/上传请求.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())
    }

答案 5 :(得分:3)

使用此命令下载文件夹包

pip install requests -t .

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

答案 6 :(得分:1)

  1. 复制while True: command = input("Enter a command (factor, isprime, end): ") command = command.lower() if command != "factor" and command != "isprime" and command != "end": print("Command", command,"not recognized. Try again!") elif command == "factor": num = int(input("Enter an integer > 1: ")) # primeFactorsOf(num) print("") elif command == "isprime": num = int(input("Enter an integer > 1: ")) # findPrime(num) print("") elif command == "end": print("Thanks for using our service! Goodbye.") break fron AWS lambda控制台中的内容,并将其粘贴到新的python脚本中,然后另存为lambda_function

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

  3. requests移至文件夹( package )。

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

  5. 返回AWS Lambda控制台。选择功能,然后在“功能代码”部分下,单击“操作”(在右侧),然后选择lambda_function.py

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

  7. 尽情享受。