2016-11-22 68 views
8

我需要在每天运行一次的python脚本中执行一次rest-call。 我无法使用AWS Lambdas将“requests”包打包到我的python包中。我得到错误:“无法导入模块'lambda_function':没有名为lambda_function的模块”无法在AWS上使用Requests-Module Lambda

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

以下是我已经做了:

  1. 拉链和项目文件夹(包括子文件夹)的权限设置为文件模式`777`。所以权限不应该是一个问题。
  2. 脚本本身位于根文件夹内。当你打开zip文件时,你直接看到它。
  3. 我使用`须藤PIP安装请求-t PATH_TO_ROOT_FOLDER`安装请求包到项目的根文件夹

一切的命名如下:

  • zip文件: lambda_function.zip
  • PY-文件:lambda_function.py
  • 处理方法:lambda_handler(事件上下文)
  • 处理程序定义在“我们bconfig: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' 

我很高兴为任何形式的帮助。我已经在这个问题上使用了多个小时。

+1

在你的问题更多的模块,在'-t'选项的位置'点子install'命令不正确 - 它必须是“pip安装请求-t PATH_TO_ROOT_FOLDER”。你只是输错了,或者你真的这么做了吗? – Leon

+0

@Leon:对。刚查过历史,我就像你在这里提到的那样。 :)所以这不会导致问题。 – codepleb

+0

你在本地使用什么版本的Python? – Leon

回答

8

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

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

+0

你的脚本是否返回json呢?我正在尝试做类似的事情,但不断收到'不能json serialisable'。我没有'import json',但是...代码在本地没有'import json',所以不知道为什么它不在Lambda中。 – kafka

+0

@kafka您可能需要导入json库。不确定,但AWS使用Python 2.7而不是3.x.我的脚本不返回json。 – codepleb

+0

是啊python 2.7在这里。将尝试明确参考json库。目前重新包装。 – kafka

2

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

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

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

14

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

from botocore.vendored import requests 

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

你可以看到this gist知道,可以直接在AWS拉姆达进口