2016-04-11 11 views
6

Ho una Lambda che viene attivata da uno stream DynamoDB. Lambda esegue alcune elaborazioni e quindi crea una notifica su un argomento in SNS. Idealmente, vorrei includere l'intero nuovo documento nella notifica che esce su SNS in modo che i clienti downstream non debbano colpire DynamoDB per ottenere i dati.Come convertire dal protocollo filo DynamoDB in oggetto Python nativo manualmente con boto3?

Il problema che sto incontrando è che i dati provenienti dal flusso DynamoDB sono in formato di filo DynamoDB (le mappe includono il tipo di dati come chiave). Quando invio la notifica ai client downstream, non voglio che capiscano il formato wire DynamoDB per analizzare il messaggio (ad esempio, se passo a un nuovo data store sottostante, dovrei ricreare quel formato).

Ovviamente il client boto3 è in grado di analizzare questo formato in un oggetto Python, c'è un modo per accedere al parser da solo? Per quanto posso dire, viene chiamato come parte del recupero dei dati da DynamoDB ma non riesco a trovare un modo per chiamarlo da solo.

risposta

9

Ho una situazione simile e ho usato il seguente un approccio come questo:

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]) 

Questo approccio funziona per me. Il dizionario risultante d contiene l'oggetto convertito anziché la versione in formato wire passata al gestore.

Problemi correlati