Ich verwende DynamoDB-Streams, um Daten mit Lambda mit Elasticsearch zu synchronisieren

Das Format der Daten (von https: // docs .aws.amazon.com / amazondynamodb / latest / developmenterguide / Streams.Lambda.Tutorial.html) sieht aus wie:

"NewImage": {
                "Timestamp": {
                    "S": "2016-11-18:12:09:36"
                },
                "Message": {
                    "S": "This is a bark from the Woofer social network"
                },
                "Username": {
                    "S": "John Doe"
                }
            },

Also zwei Fragen.

  1. Was ist das "S", das der Stream anfügt. Ich gehe davon aus, dass es sich um eine Zeichenfolge oder einen Stream handelt, kann jedoch keine Dokumentation finden.

  2. Gibt es eine Option, um dies aus dem Stream auszuschließen, oder muss ich Code in meine Lambda-Funktion schreiben, um ihn zu entfernen?

0
Harsha Laxman 22 Feb. 2020 im 22:12

3 Antworten

Beste Antwort

Was Sie sehen, sind die DynamoDB-Daten Typbeschreibungen . Auf diese Weise werden Daten in DynamoDB gespeichert (oder zumindest über die Low-Level-APIs verfügbar gemacht). Es gibt SDKs in verschiedenen Sprachen, die dies in JSON konvertieren.

1
Jason Wadsworth 22 Feb. 2020 im 19:34

Das S gibt an, dass der Wert des Attributs einfach ein Attributtyp für skalare Zeichenfolgen (S) ist. Der Schlüsselname jedes DynamoDB-Elementattributs ist immer eine Zeichenfolge, obwohl der Attributwert keine skalare Zeichenfolge sein muss. 'Benennungsregeln und Datentypen 'beschreibt jeden Attributdatentyp. Eine Zeichenfolge ist ein Skalartyp, der sich von einem Dokumenttyp oder einem festgelegten Typ unterscheidet.

Es gibt verschiedene Ansichten eines Stream-Datensatzes, es gibt jedoch keine Stream-Ansicht, in der der Attributwertcode des Elements weggelassen und auch der Attributwert angegeben wird. Jeder mögliche StreamViewType wird unter " Erfassen der Tabellenaktivität mit DynamoDB-Streams '.

Habe Spaß!

0
starpebble 27 Feb. 2020 im 16:35

Für Python: https: //boto3.amazonaws .com / v1 / documentation / api / latest / _modules / boto3 / dynamodb / types.html

'TypeSerializer'

deserializer = boto3.dynamodb.types.TypeDeserializer()
dic = {key: deserializer.deserialize(val) for key,val in record['dynamodb']['NewImage'].items()}

def decimal_default(obj):
    if isinstance(obj, decimal.Decimal):
        return float(obj)
    raise TypeError

json.dumps(dic, default=decimal_default)

Wenn Sie in elasticsearch indizieren möchten, müssen Sie eine andere json.loads () ausführen, um in ein Python-Wörterbuch zu konvertieren.

0
Harsha Laxman 22 Feb. 2020 im 23:47