2016-04-11 1 views
6

У меня есть Лямбда, которая запускается потоком DynamoDB. Lambda выполняет некоторую обработку, а затем создает уведомление по теме в SNS. В идеале я хотел бы включить весь новый документ в уведомление, которое выходит на SNS, так что нисходящим клиентам не нужно ударять DynamoDB для получения данных.Как преобразовать из проводного протокола DynamoDB в собственный объект Python вручную с помощью boto3?

Проблема, с которой я столкнулся, заключается в том, что данные, поступающие из потока DynamoDB, находятся в формате проводов DynamoDB (карты включают тип данных в виде ключа). Когда я отправляю уведомление нижестоящим клиентам, я не хочу, чтобы им приходилось разбираться в проводном формате DynamoDB для синтаксического анализа сообщения (например, если я переключусь на новое базовое хранилище данных, мне пришлось бы воссоздать этот формат).

Очевидно, клиент boto3 способен разобрать этот формат в объект Python, есть ли способ получить доступ к парсеру самостоятельно? Насколько я могу судить, это называется частью сбора данных из DynamoDB, но я не могу найти способ назвать это самостоятельно.

ответ

9

У меня похожая ситуация, и я использовал следующий подход, как это:

from boto3.dynamodb.types import TypeDeserializer 

deser = TypeDeserializer() 

... 
<in handler> 
    for record in event['Records']: 
     old = record['dynamodb'].get('OldImage') 
     new = record['dynamodb'].get('NewImage') 
     if old: 
      d = {} 
      for key in old: 
       d[key] = deser.deserialize(old[key]) 

Этот подход работает для меня. Результирующий словарь d содержит преобразованный объект, а не версию в виде провода, переданную обработчику.