使用无服务器 Python 模板的 DynamoDB 为 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": "$10"
}

日志输出为:

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

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

我尝试更改变量名称和值无济于事。

sls deploy

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

解决方法

假设这是正确的 event 对象:

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

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

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