2017-01-19 27 views
0

私はDynamoDBストリームによってトリガされたラムダ関数を持っています。私の問題は、受け取ったイベントの奇妙なフォーマットです(各キー/値のタイプ)。AWS DynamoDBストリームPythonネイティブフォーマットに変換する

完全なドキュメントをネイティブのPython形式(タイプなし)に変換するための回避策が存在します。将来的には、私は別の形式(複数のdict /リストレベル)を持っている他のDynamoDBのテーブルストリームと、このラムダを使いたいので、私は例

ダイナミックな解決策を探しています:

{ 
    "Records": [ 
    { 
     "eventID": "1", 
     "eventVersion": "1.0", 
     "dynamodb": { 
     "Keys": { 
      "Id": { 
      "N": "101" 
      } 
     }, 
     "NewImage": { 
      "Message": { 
      "S": "New item!" 
      }, 
      "Id": { 
      "N": "101" 
      } 
     }, 
     "StreamViewType": "NEW_AND_OLD_IMAGES", 
     "SequenceNumber": "111", 
     "SizeBytes": 26 
     }, 
     "awsRegion": "us-west-2", 
     "eventName": "INSERT", 
     "eventSourceARN": "arn:aws:dynamodb:us-west-2:account-id:table/ExampleTableWithStream/stream/2015-06-27T00:48:05.899", 
     "eventSource": "aws:dynamodb" 
    }, 
    { 
     "eventID": "2", 
     "eventVersion": "1.0", 
     "dynamodb": { 
     "OldImage": { 
      "Message": { 
      "S": "New item!" 
      }, 
      "Id": { 
      "N": "101" 
      } 
     }, 
     "SequenceNumber": "222", 
     "Keys": { 
      "Id": { 
      "N": "101" 
      } 
     }, 
     "SizeBytes": 59, 
     "NewImage": { 
      "Message": { 
      "S": "This item has changed" 
      }, 
      "Id": { 
      "N": "101" 
      } 
     }, 
     "StreamViewType": "NEW_AND_OLD_IMAGES" 
     }, 
     "awsRegion": "us-west-2", 
     "eventName": "MODIFY", 
     "eventSourceARN": "arn:aws:dynamodb:us-west-2:account-id:table/ExampleTableWithStream/stream/2015-06-27T00:48:05.899", 
     "eventSource": "aws:dynamodb" 
    }, 
    { 
     "eventID": "3", 
     "eventVersion": "1.0", 
     "dynamodb": { 
     "Keys": { 
      "Id": { 
      "N": "101" 
      } 
     }, 
     "SizeBytes": 38, 
     "SequenceNumber": "333", 
     "OldImage": { 
      "Message": { 
      "S": "This item has changed" 
      }, 
      "Id": { 
      "N": "101" 
      } 
     }, 
     "StreamViewType": "NEW_AND_OLD_IMAGES" 
     }, 
     "awsRegion": "us-west-2", 
     "eventName": "REMOVE", 
     "eventSourceARN": "arn:aws:dynamodb:us-west-2:account-id:table/ExampleTableWithStream/stream/2015-06-27T00:48:05.899", 
     "eventSource": "aws:dynamodb" 
    } 
    ] 
} 

おかげ

答えて

2

私はこれまで使ってきましたが、それまでは役に立ちました:

from boto3.dynamodb.types import TypeDeserializer 

serializer = TypeDeserializer() 

def deserialize(data): 
    if isinstance(data, list): 
     return [deserialize(v) for v in data] 

    if isinstance(data, dict): 
     try: 
      return serializer.deserialize(data) 
     except TypeError: 
      return { k : deserialize(v) for k, v in data.iteritems() } 
    else: 
     return data 
+0

ニース!それは完璧です。 – Matt

関連する問題