我收到无法封送响应:客户端错误类型的对象在 lambda 执行期间不可序列化 JSON



我有一个lambda函数,它运行一个python脚本,该脚本基本上从一个generandb表读取数据并写入另一个generardb表。当第一次执行脚本时,它给我带来了这个错误-

Lambda function (abc-Service-295-DummyFunction) returned error: ({"errorMessage": "Unable to marshal response: Object of type ClientError is not JSON serializable", "errorType": "Runtime.MarshalError", "stackTrace": []})

我发现了一些与此相关的stackoverflow答案,主要是说错误可能来自Datetime字段。源表确实有一些Datetime表单的属性,但我不确定我的脚本如何避免这个错误

这是我的代码-

import pprint
import boto3
from boto3.dynamodb.conditions import Key, Attr
def dynamo_bulk_reader(event):
dynamodb = boto3.resource('dynamodb', region_name=event['TargetRegion'])
table = dynamodb.Table(event['EnvironmentId']+'-abc-dynamo')
print("Exporting items from: " + str(table))
data = []

response = table.query(
IndexName = 'idx-RecType-SubsId',
KeyConditionExpression = Key('RecType').eq('CreditNote') & Key('SubsId').begins_with(str(event['BuisnessUnitId'])+'_'),
FilterExpression = Attr('Split').eq(0)
)
for i in range(len(response['Items'])):
if(abs(response['Items'][i]['CNAttr']['RemBal']) > 0):
data.append(response['Items'][i])
print("Finished exporting: " + str(len(data)) + " items.")
print("Data Exported: ")
pprint.pprint(data)
return data
def dynamo_bulk_writer(event):
dynamodb = boto3.resource('dynamodb', region_name=event['TargetRegion'])
table = dynamodb.Table(event['EnvironmentId']+'-xyz-dynamo2')
print("Importing items into: " + str(table))
for table_item in dynamo_bulk_reader(event):
with table.batch_writer() as batch:
response = batch.put_item(
Item = {
'SubsId'  : table_item['SubsId'],
'ItemId'  : table_item['ItemId'],
'RecType' : table_item['RecType'],
'BuId'    : int(table_item['SubsId'].split("_")[0])
}
)
print("Finished importing items...")
def lambda_handler(event,context):
try:
print("Event Received", event)
dynamo_bulk_writer(event)
except Exception as e:
return e

有人能帮我吗?我怎样才能消除这个错误?

您对DynamoDB的一个API调用返回了一个错误,但您没有捕获它,而是试图解析它,导致异常。尝试在您发出的任何API请求中实现错误处理:

try:
response = table.query(
IndexName = 'idx-RecType-SubsId',
KeyConditionExpression = Key('RecType').eq('CreditNote') & Key('SubsId').begins_with(str(event['BuisnessUnitId'])+'_'),
FilterExpression = Attr('Split').eq(0)
)
except Exception as e:
print(e)

将相同的try/except块添加到所有请求中,这样您就可以看到真正的失败原因。

最新更新