Python lambda函数返回KeyError

时间:2017-11-28 16:01:32

标签: python python-3.x amazon-web-services aws-lambda

我尝试使用Python 3.6创建简单的Lambda函数。

该函数应该在请求查询字符串参数中获取userId(我在DynamoDB中的主键),如果DB中存在项目则返回200,这是我的lambda函数

import boto3
import os
from boto3.dynamodb.conditions import Key, Attr

def lambda_handler(event, context):

  userId = event["userId"]

  dynamodb = boto3.resource('dynamodb')
  table = dynamodb.Table(os.environ['Customers'])
  items = table.query(
  KeyConditionExpression=Key('userId').eq(userId)
  )

  return items["Items"]

当我在Lambda接口中进行测试时,它会工作并返回正确的用户,但是当从Postman尝试或使用API​​网关时,它会返回以下错误

{
"errorMessage": "'userId'",
"errorType": "KeyError",
"stackTrace": [
    [
        "/var/task/index.py",
        7,
        "lambda_handler",
        "userId = event["userId"]"
    ]
]
}
  • 我在这里缺少什么?
  • 努力理解"事件" ,文档声明它是一个python 字典,但我如何打印它的结果,并实际调试lambda 从Postman或API Gateway调用时?

3 个答案:

答案 0 :(得分:2)

您正在使用event["userId"],这意味着发送请求有效负载,例如

GET API : api/users/
Request Body payload:

{
"userId":"1234"
}

然后上面的代码工作,假设你想发送userId作为路径参数

GET API :api/user/{userId}

然后你可以访问lambda函数

userId = (event['pathparameters']['userId'])

更好地添加print语句 打印(事件)并检查cloudwatch日志中的日志

答案 1 :(得分:1)

这为我解决了发布请求

import json
def lambda_handler(event, context):    
    data = json.loads(event["body"])
    email = data['email']

如果您使用的是无服务器框架,您还可以在 http 事件下添加以下代码。但我觉得没那个必要。

request:
  parameters:
    application/json: '{"email":"$input.params(''email'')"}'

答案 2 :(得分:-1)

在我的情况下,我的Python Lambda需要一个名为exclude的键。为了解决通过API网关调用时获得此响应的问题,我需要使用映射模板更新集成请求:

Mapping Template