请求帮助从DynamoDB触发lambda函数

时间:2018-07-31 13:09:02

标签: amazon-web-services amazon-s3 aws-lambda amazon-dynamodb

我一直遵循在YouTube https://www.youtube.com/watch?v=jgiZ9QUYqyM上发布的指南,这绝对是我想要的。我发布了我的代码以及AWS中所有内容的图像。

我有一个dynamodb表,并通过触发器将其链接到我的s3存储桶。该触发器给了我上面发布的一些错误消息。 “小数('1')不可JSON序列化”。尽管我正在用helloworld进行测试。

这是代码:

import boto3
import json
import os
s3 =  boto3.client('s3')
ddb = boto3.resource('dynamodb')
table = ddb.Table('test_table')


def lambda_handler(event, context):
  response = table.scan()
  body = json.dumps(response['Items'])
  response = s3.put_object(Bucket='s3-testing',
  Key = 's3-testing.json' ,
  Body=body,
  ContentType='application/json')

有人可以指出我正确的方向吗?这些是我得到的摘录

https://i.stack.imgur.com/I0jAn.png

https://i.stack.imgur.com/2hMc9.png

这是执行日志:

Response:
{
  "stackTrace": [
    [
      "/var/task/lambda_function.py",
      20,
      "lambda_handler",
      "body = json.dumps(response['Items'])"
    ],
    [
      "/usr/lib64/python2.7/json/__init__.py",
      244,
      "dumps",
      "return _default_encoder.encode(obj)"
    ],
    [
      "/usr/lib64/python2.7/json/encoder.py",
      207,
      "encode",
      "chunks = self.iterencode(o, _one_shot=True)"
    ],
    [
      "/usr/lib64/python2.7/json/encoder.py",
      270,
      "iterencode",
      "return _iterencode(o, 0)"
    ],
    [
      "/usr/lib64/python2.7/json/encoder.py",
      184,
      "default",
      "raise TypeError(repr(o) + \" is not JSON serializable\")"
    ]
  ],
  "errorType": "TypeError",
  "errorMessage": "Decimal('1') is not JSON serializable"
}

功能日志:

    START RequestId: 31719509-94c7-11e8-a0d4-a9b76b7b212c Version: $LATEST
Decimal('1') is not JSON serializable: TypeError
Traceback (most recent call last):
  File "/var/task/lambda_function.py", line 20, in lambda_handler
    body = json.dumps(response['Items'])
  File "/usr/lib64/python2.7/json/__init__.py", line 244, in dumps
    return _default_encoder.encode(obj)
  File "/usr/lib64/python2.7/json/encoder.py", line 207, in encode
    chunks = self.iterencode(o, _one_shot=True)
  File "/usr/lib64/python2.7/json/encoder.py", line 270, in iterencode
    return _iterencode(o, 0)
  File "/usr/lib64/python2.7/json/encoder.py", line 184, in default
    raise TypeError(repr(o) + " is not JSON serializable")
TypeError: Decimal('1') is not JSON serializable

2 个答案:

答案 0 :(得分:1)

小数对象不可json序列化。考虑使用辅助函数将小数转换为浮点数。 (json.dumps()使用默认功能)

import boto3
import json
import os

from decimal import Decimal
s3 =  boto3.client('s3')
ddb = boto3.resource('dynamodb')
table = ddb.Table('test_table')


def lambda_handler(event, context):
  response = table.scan()
  body = json.dumps(response['Items'], default=handle_decimal_type)
  response = s3.put_object(Bucket='s3-testing',
  Key = 's3-testing.json' ,
  Body=body,
  ContentType='application/json')


def handle_decimal_type(obj):
  if isinstance(obj, Decimal):
      if float(obj).is_integer():
         return int(obj)
      else:
         return float(obj)
  raise TypeError

答案 1 :(得分:0)

问题在于Dynamo Python库正在将数字值转换为Decimal对象,但是默认情况下它们不是JSON可序列化的,因此json.dumps会崩溃。您将需要为json.dumps提供一个用于Decimal对象的转换器。

请参见Python JSON serialize a Decimal object