Python lambda函数返回KeyError

jv4diomz  于 2023-01-27  发布在  Python
关注(0)|答案(4)|浏览(181)

我尝试用Python 3.6创建一个简单的Lambda函数。
该函数应在请求查询字符串参数中获取userId(我在DynamoDB中的主键),如果数据库中存在项目,则返回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 Gateway尝试时,它返回以下错误

{
"errorMessage": "'userId'",
"errorType": "KeyError",
"stackTrace": [
    [
        "/var/task/index.py",
        7,
        "lambda_handler",
        "userId = event["userId"]"
    ]
]
}
  • 我错过什么了吗?
  • 很难理解“事件”,文档声明它是一个python字典,但是当从Postman或API网关调用时,我如何打印它的结果并实际调试lambda呢?
5ssjco0h

5ssjco0h1#

您使用的是event["userId"],这意味着发送请求负载(例如

GET API : api/users/
Request Body payload:

{
"userId":"1234"
}

那么上面的代码就可以工作了,假设你想把userId作为path参数发送

GET API :api/user/{userId}

然后你可以在lambda函数中访问

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

最好添加print语句print(event)并检查cloudwatch日志中的日志

b5lpy0ml

b5lpy0ml2#

这为我解决了发帖请求的问题

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

如果你使用的是无服务器框架,你也可以在你的http事件下添加下面的代码。但是我不认为这是必要的。

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

unhi4e5o3#

确保在创建HTTP方法时未选择“Lambda代理”。代理不会转换/修改请求,因此“事件”将为空

ttvkxqim

ttvkxqim4#

在我的例子中,Python Lambda需要一个名为exclude的键,为了解决通过API Gateway调用时获得响应的问题,我需要用Map模板更新集成请求:

相关问题