Indizieren neuer und vorhandener Amazon DynamoDB-Inhalte mit Amazon Elasticsearch Service.

Diagramm in cloudcraft.co gemacht

Was ich habe: Eine Amazon DynamoDB-Tabelle „elements“ mit ~ 49K Objekten.

Was ich brauche: Amazon Elasticsearch Service mit allen vorhandenen Artikeln in meiner Tabelle und allen neuen eingehenden Artikeln.

Was ich verwenden werde: Amazon Elasticsearch Service, Amazon DynamoDB, Amazon Lambda, Python-Skripte.

Zunächst sollten Sie einen Stream vom Typ Bildansicht für Ihre Tabelle erstellen (Dienste> DynamoDB> Tabellen> Wählen Sie Ihre Tabelle aus> Registerkarte Übersicht).

Kopieren Sie die ARN des Streams. Sie benötigen sie später.

Wechseln Sie zum Elasticsearch-Dienst (Dienste> Elasticsearch-Dienst) und erstellen Sie eine neue Domäne. Geben Sie Parameter wie Elasticsearch-Domänenname, Cluster, Knoten- / Speicherkonfiguration für Ihre Anforderungen an.

Ich habe die Domänenzugriffsrichtlinie nur zu Testzwecken als öffentlich festgelegt. Wählen Sie eine sicherere Option.

Kopieren Sie die ARN der Domain. Sie benötigen sie später.

Als Nächstes sollten Sie eine neue Rolle erstellen und Zugriffsrichtlinien dafür angeben. Wechseln Sie dazu zu Rollen (Dienste> IAM> Rollen) und erstellen Sie eine neue Rolle.

Wählen Sie den AWS-Servicerollentyp und den Lambda-Service als Service aus, der diese Rolle verwendet.

Wählen Sie AWSLambdaBasicExecutionRole als Berechtigungsrichtlinie aus und klicken Sie auf Weiter.

Geben Sie einen Namen für Ihre Rolle, in meinem Fall Dynamodb-to-es.

Jetzt ist es an der Zeit, der Rolle Richtlinien hinzuzufügen, die für den Zugriff auf die DB-, Stream- und Elasticsearch-Domäne erforderlich sind.

Klicken Sie auf "Inline-Richtlinie hinzufügen" und wählen Sie "Benutzerdefinierte Richtlinie".

Fügen Sie Access-to-the-DynamoDB hinzu (ersetzen Sie die Ressource durch Ihre Tabelle ARN; Sie finden sie in den Tabellendetails):

Es sollte so aussehen:

Fügen Sie Access-to-the-DynamoDB-Stream hinzu (ersetzen Sie die Ressource durch Ihre Tabelle ARN, die wir beim Erstellen des Streams erwähnt haben):

Es sollte so aussehen:

Fügen Sie Lambda-to-Amazon-ES hinzu (ersetzen Sie die Ressource durch Ihre Tabelle ARN, die wir beim Erstellen der Elasticsearch-Domäne erwähnt haben):

Beachten Sie, dass nach dem Domainnamen ein * steht.

Es sollte so aussehen:

Der nächste Schritt ist die Erstellung von Amazon Lambda. Erstellen Sie eine neue Funktion von Grund auf (Dienste> Lambda).

Fügen Sie einen DynamoDB-Trigger mit der ausgewählten geeigneten Tabelle und der Startposition für den Trimmhorizont hinzu. Sie können den Trigger an dieser Stelle aktivieren.

Geben Sie einen Namen für Ihre Funktion ein und wählen Sie Python 2.7-Laufzeit.

Fügen Sie im Bereich Lambda-Funktionscode das Skript dynamodb-to-es.py ein und geben Sie den Endpunkt Ihrer Elasticsearch-Domäne an.

Wählen Sie die Dynamodb-to-es-Rolle als Bestehende Rolle aus.

Im Untermenü Erweiterte Einstellungen können Sie ein größeres Zeitlimit auswählen, wenn Ihre Datensätze sehr umfangreich sind oder Sie mehrere Datensätze gleichzeitig speichern möchten.

Jetzt können Sie einige Elemente in Ihre Tabelle einfügen / bearbeiten und dann zur Domänenseite gehen, um sicherzustellen, dass Indizes erstellt werden.

Grundsätzlich können Sie Anfragen an Ihre Elasticsearch richten, es gibt jedoch nur Elemente, die Sie nach der Erstellung des Elasticsearch-Dienstes und der Lambda-Funktion hinzugefügt / gelöscht haben.

Beispiel für eine Anfrage mit leerer Abfrage:

https://search-elementsdomain-bsbkhmwsd2u7zm2cukbmht2eqm.us-east-1.es.amazonaws.com/elements/_search?size=10&pretty=true&q=*

Beachten Sie, dass Sie den Tabellenindex nach dem Endpunkt angeben sollten.

Der zweite Teil dieses Beitrags befasst sich mit dem Hinzufügen von bereits vorhandenen Inhalten zu Elasticsearch Service aus DynamoDB.

Gehen Sie zu Rollen (Dienste> IAM> Rollen) und erstellen Sie eine neue Richtlinie. Legen Sie neue Berechtigungen wie auf den folgenden Bildern fest:

Geben Sie im Amazon Resource Field die ARN Ihrer Lambda-Funktion ein:

Kopieren Sie diese Richtlinie, Sie benötigen sie für Benutzerberechtigungen:

Gehen Sie zu dem Benutzer, der das Skript ausführen soll (Dienste> IAM> Benutzer) und fügen Sie eine benutzerdefinierte Inline-Richtlinie hinzu (vergessen Sie nicht, die Ressourcen in Ihre zu ändern):

Wenn Sie keinen Zugangsschlüssel haben - erstellen Sie ihn:

Kopieren Sie an einem sicheren Ort Ihre Zugangsschlüssel-ID und Ihren geheimen Zugangsschlüssel:

Erhöhen Sie die Lesekapazität für Ihre Tabelle (nur für die Skriptausführungszeit).

Um Lambda auf Amazon aufzurufen, sollten Sie das Skript post_to_es_from_dynamodb.py ausführen.

Tipp: Wenn Sie dieses Skript als Amazon Lambda ausführen möchten, sollten Sie beachten, dass das maximale Timeout 5 Minuten beträgt und in der Regel nicht ausreicht, um viele Datensätze zu verarbeiten.

Ändern Sie vor der Ausführung den Regionsparameter im Skript manuell:

Führen Sie diesen Befehl mit den entsprechenden Argumenten aus, um vorhandene Daten aus DynamoDb in Elasticsearch zu übertragen:

python post_to_es_from_dynamodb.py --tn "" --ak "" --sk "" --esarn "" --lf ""

Parameter Beispiele:

esarn: arn: aws: dynamodb: us-east-1: XXXXXXXXXXX: table / elements / stream / 2017-09-14T14: 16: 12.788
lf: arn: aws: lambda: us-east-1: XXXXXXXXXXX: funktion: dynamostream-to-es

So zeigen Sie die Parameterdefinition an:

python post_to_es_from_dynamodb.py --help

Tipp: Wenn es kein Modul mit dem Namen boto3 gibt, können Sie Folgendes ausführen:

pip install boto3

Tipp: Wenn Sie Amazon CLI auf Ihrem Computer installiert haben, müssen Sie Ihre lokalen AWS-Parameter (AWS secret / access / region) wie in den oben mit dem Befehl „aws configure“ verwendeten Argumenten konfigurieren.

Jetzt können Sie die Anfrage durchführen:

https://search-elementsdomain-bsbkhmwsd2u7zm2cukbmht2eqm.us-east-1.es.amazonaws.com/elements/_search?size=10&pretty=true&q=*

Wie Sie auf dem Bild unten sehen können, wurde die Anzahl der Artikel erhöht:

Endlich können Sie Einheiten mit geringerer Kapazität festlegen, um die Kosten zu senken.

Nun können Sie Ihren Elasticsearch-Service mit Ihrer DynamoDB nutzen!

Inspiriert von diesem und jenem. Сreated nur für pädagogische Zwecke.

Alle Skripte und Richtlinien finden Sie hier. Fühlen Sie sich frei, Fragen zu stellen!