使用无服务器 Python 模板的 DynamoDB 为主体提供 KeyError

DynamoDB using the Serverless Python Template gives KeyError for body

lambda函数的代码如下:

import json
import logging
import os
import time
import uuid

import boto3
dynamodb = boto3.resource('dynamodb')

def create(event, context):
    data = json.loads(event['body'])
    if 'text' not in data:
        logging.error("Validation Failed")
        raise Exception("Couldn't create the todo item.")
    
    timestamp = str(time.time())

    table = dynamodb.Table(os.environ['DYNAMODB_TABLE'])

    item = {
        'id': str(uuid.uuid1()),
        'name': data['text'],
        'description': data['text'],
        'price': data['text'],
        
        'createdAt': timestamp,
        'updatedAt': timestamp,
    }

    # write the todo to the database
    table.put_item(Item=item)

    # create a response
    response = {
        "statusCode": 200,
        "body": json.dumps(item)
    }

    return response

使用 AWS Lambda 测试功能的测试是:

{
  "name": "Masks",
  "description": "A box of 50 disposable masks",
  "price": ""
}

日志输出为:

START RequestId: 5cf1c00a-dba5-4ef6-b5e7-b692d8235ffe Version: $LATEST
[ERROR] KeyError: 'body'
Traceback (most recent call last):
  File "/var/task/todos/create.py", line 12, in create
    data = json.loads(event['body'])END RequestId: 5cf1c00a-dba5-4ef6-b5e7-b692d8235ffe

为什么“正文”给我一个关键错误?我该如何解决?该模板直接来自 www.severless.com,并且基于在线教程,人们使用完全相同的代码,但具有不同的值,是否成功?

我试过更改变量名称和值,但无济于事。

sls deploy

确实成功创建了 table,但我无法向其中输入任何数据。 编辑 1:对于那些不熟悉 AWS 的 Lambda 测试功能的人,使用 Postman 输入相同的数据会导致 502 网关错误。

假设这是正确的 event 对象:

{
  "name": "Masks",
  "description": "A box of 50 disposable masks",
  "price": ""
}

您匹配此事件的代码应该是:

import json
import logging
import os
import time
import uuid

import boto3

dynamodb = boto3.resource('dynamodb')

def create(event, context):
   
    timestamp = str(time.time())

    table = dynamodb.Table(os.environ['DYNAMODB_TABLE'])

    item = {
        'id': str(uuid.uuid1()),
        'name': event['name'],
        'description': event['description'],
        'price': event['price'],        
        'createdAt': timestamp,
        'updatedAt': timestamp,
    }

    # write the todo to the database
    table.put_item(Item=item)

    # create a response
    response = {
        "statusCode": 200,
        "body": json.dumps(item)
    }

    return response