如何从AWS API将变量传递给Python Lambda

时间:2018-03-16 07:56:35

标签: python aws-lambda aws-api-gateway

我试过搜索,但我的googlefu让我失望。

我有一个基本的python lambda函数:

def lambda_handler(event, context):
    foo = event['bar']
    print(foo)

然后我尝试做一个POST,就像在curl中这样:

curl -X POST https://correctaddress.amazonaws.com/production/test \
-H 'x-api-key: CORRECTKEY' \
-H 'content-type: application/json' \
-H 'bar: Hello World' \

这可能会导致KeyError: 'bar'失败,因为我认为我作为事件['bar']传递的内容并未如此传递。

我试过event['body']['bar']也失败了。

如果我event['querystringparameters']['bar'],如果我使用GET,那么它将起作用:

curl -X POST https://correctaddress.amazonaws.com/production/test?bar=HelloWorld -H 'x-api-key: CORRECTKEY'

我知道我遗漏了一些关于事件字典的基本信息,以及它从POST中获取的内容,但我似乎无法找到正确的文档(不确定它是否在API或Lambda的文档中)。

我最终的目标是能够使用像这样的请求在python中编写一些东西:

import requests, json

url = "https://correctaddress.amazonaws.com/production/test"
headers = {'Content-Type': "application/json", 'x-api-key': "CORRECTKEY"}
data = {}
data['bar'] = "Hello World"
res = requests.put(url, json=data, headers=headers)

1 个答案:

答案 0 :(得分:4)

问题在于你执行curl命令的方式。

您正在使用-H(--header)参数添加参数。但是你期待一个JSON帖子请求。

为此,请将curl语句更改为以下内容:

curl -X POST https://correctaddress.amazonaws.com/production/test \
-H 'x-api-key: CORRECTKEY' \
-H 'content-type: application/json' \
--data '{"bar":"Hello World"}' \

这将使curl使用适当的正文发布请求。

在Python中,您可以使用与此类似的代码将postdata作为字典获取:

postdata = json.loads(event['body'])

您应该为无效的JSON,其他请求类型(例如GET)等添加一些错误检查