

Die vorliegende Übersetzung wurde maschinell erstellt. Im Falle eines Konflikts oder eines Widerspruchs zwischen dieser übersetzten Fassung und der englischen Fassung (einschließlich infolge von Verzögerungen bei der Übersetzung) ist die englische Fassung maßgeblich.

# Tutorial \$11: Verwenden von Filtern zur Verarbeitung aller Ereignisse mit Amazon DynamoDB und AWS Lambda Verwendung der AWS CLI
<a name="Streams.Lambda.Tutorial"></a>

 

In diesem Tutorial erstellen Sie einen AWS Lambda Trigger zur Verarbeitung eines Streams aus einer DynamoDB-Tabelle.

**Topics**
+ [Schritt 1: Erstellen einer DynamoDB-Tabelle mit einem aktivierten Stream](#Streams.Lambda.Tutorial.CreateTable)
+ [Schritt 2: Erstellen einer Lambda-Ausführungsrolle](#Streams.Lambda.Tutorial.CreateRole)
+ [Schritt 3: Erstellen eines Amazon-SNS-Themas](#Streams.Lambda.Tutorial.SNSTopic)
+ [Schritt 4: Erstellen und Testen einer Lambda-Funktion](#Streams.Lambda.Tutorial.LambdaFunction)
+ [Schritt 5: Erstellen und Testen eines Auslösers](#Streams.Lambda.Tutorial.CreateTrigger)

Das Szenario für dieses Tutorial ist Woofer, ein einfaches soziales Netzwerk. Woofer-Benutzer kommunizieren mit einer kurzen Textnachricht *Barks* („Bellen”), die an andere Woofer-Benutzer gesendet werden. Das folgende Diagramm zeigt die Komponenten und den Workflow für diese Anwendung.

![\[Woofer-Anwendungsworkflow mit einer DynamoDB-Tabelle, einem Stream-Datensatz, einer Lambda-Funktion und einem Amazon-SNS-Thema\]](http://docs.aws.amazon.com/de_de/amazondynamodb/latest/developerguide/images/StreamsAndTriggers.png)


1. Ein Benutzer schreibt ein Element in eine DynamoDB-Tabelle (`BarkTable`). Jedes Element in der Tabelle steht für eine Textnachricht („Bark”).

1. Ein neuer Stream-Datensatz wird erstellt, um zu berücksichtigen, dass ein neues Element der `BarkTable` hinzugefügt wurde.

1. Der neue Stream-Record löst eine AWS Lambda Funktion () `publishNewBark` aus.

1. Wenn der Stream-Datensatz angibt, dass ein neues Element `BarkTable` hinzugefügt wurde, liest die Lambda-Funktion die Daten aus dem Stream-Datensatz und veröffentlicht eine Nachricht für ein Thema im Amazon Simple Notification Service (Amazon SNS).

1. Die Nachricht wird von den Abonnenten des Amazon-SNS-Themas empfangen. (In diesem Tutorial ist der einzige Abonnent eine E-Mail-Adresse.)

**Bevor Sie beginnen**  
Dieses Tutorial verwendet die AWS Command Line Interface AWS CLI. Folgen Sie den Anweisungen im [AWS Command Line Interface -Benutzerhandbuch](https://docs.aws.amazon.com/cli/latest/userguide/) zum Installieren und Konfigurieren der AWS CLI.

## Schritt 1: Erstellen einer DynamoDB-Tabelle mit einem aktivierten Stream
<a name="Streams.Lambda.Tutorial.CreateTable"></a>

In diesem Schritt erstellen Sie eine DynamoDB-Tabelle (`BarkTable`), um alle Textnachrichten von Woofer-Benutzern zu speichern. Der Primärschlüssel besteht aus `Username` (Partitionsschlüssel) und `Timestamp` (Sortierschlüssel). Bei beiden Attributen handelt es sich um Zeichenfolgen.

Für `BarkTable` ist ein Stream aktiviert. Später in diesem Tutorial erstellen Sie einen Trigger, indem Sie dem Stream eine AWS Lambda Funktion zuordnen.

1. Verwenden Sie den folgenden Befehl, um die Tabelle zu erstellen.

   ```
   aws dynamodb create-table \
       --table-name BarkTable \
       --attribute-definitions AttributeName=Username,AttributeType=S AttributeName=Timestamp,AttributeType=S \
       --key-schema AttributeName=Username,KeyType=HASH  AttributeName=Timestamp,KeyType=RANGE \
       --provisioned-throughput ReadCapacityUnits=5,WriteCapacityUnits=5 \
       --stream-specification StreamEnabled=true,StreamViewType=NEW_AND_OLD_IMAGES
   ```

1. Suchen Sie in der Ausgabe nach dem `LatestStreamArn`.

   ```
   ...
   "LatestStreamArn": "arn:aws:dynamodb:region:accountID:table/BarkTable/stream/timestamp
   ...
   ```

   Notieren Sie sich die `region` und die `accountID`, da Sie sie für die anderen Schritte in diesem Tutorial benötigen.

## Schritt 2: Erstellen einer Lambda-Ausführungsrolle
<a name="Streams.Lambda.Tutorial.CreateRole"></a>

In diesem Schritt erstellen Sie eine AWS Identity and Access Management (IAM-) Rolle (`WooferLambdaRole`) und weisen ihr Berechtigungen zu. Diese Rolle wird von der Lambda-Funktion verwendet, die Sie in [Schritt 4: Erstellen und Testen einer Lambda-Funktion](#Streams.Lambda.Tutorial.LambdaFunction) erstellen. 

Außerdem legen Sie eine Richtlinie für die Rolle fest. Die Richtlinie enthält alle Berechtigungen, die die Lambda-Funktion zur Laufzeit benötigt.

1. Erstellen Sie eine Datei mit dem Namen `trust-relationship.json` und dem folgenden Inhalt.

------
#### [ JSON ]

****  

   ```
   {
      "Version":"2012-10-17",		 	 	 
      "Statement": [
        {
          "Effect": "Allow",
          "Principal": {
            "Service": "lambda.amazonaws.com"
          },
          "Action": "sts:AssumeRole"
        }
      ]
    }
   ```

------

1. Geben Sie den folgenden Befehl ein, um `WooferLambdaRole` zu erstellen.

   ```
   aws iam create-role --role-name WooferLambdaRole \
       --path "/service-role/" \
       --assume-role-policy-document file://trust-relationship.json
   ```

1. Erstellen Sie eine Datei mit dem Namen `role-policy.json` und dem folgenden Inhalt. (Ersetzen Sie `region` und `accountID` durch Ihre AWS Region und Konto-ID.)

------
#### [ JSON ]

****  

   ```
   {
       "Version":"2012-10-17",		 	 	 
       "Statement": [
           {
               "Effect": "Allow",
               "Action": [
                   "logs:CreateLogGroup",
                   "logs:CreateLogStream",
                   "logs:PutLogEvents"
               ],
               "Resource": "arn:aws:logs:us-east-1:111122223333:*"
           },
           {
               "Effect": "Allow",
               "Action": [
                   "dynamodb:DescribeStream",
                   "dynamodb:GetRecords",
                   "dynamodb:GetShardIterator",
                   "dynamodb:ListStreams"
               ],
               "Resource": "arn:aws:dynamodb:us-east-1:111122223333:table/BarkTable/stream/*"
           },
           {
               "Effect": "Allow",
               "Action": [
                   "sns:Publish"
               ],
               "Resource": [
                   "*"
               ]
           }
       ]
   }
   ```

------

   Die Richtlinie enthält vier Anweisungen, damit `WooferLambdaRole` folgende Aufgaben ausführen kann:
   + Führen Sie eine Lambda-Funktion (`publishNewBark`). Die Funktion erstellen Sie zu einem späteren Zeitpunkt in diesem Tutorial.
   + Greifen Sie auf Amazon CloudWatch Logs zu. Die Lambda-Funktion schreibt zur Laufzeit Diagnosen in CloudWatch Logs.
   + Lesen von Daten aus dem DynamoDB Stream für `BarkTable`.
   + Veröffentlichen Sie Nachrichten in Amazon SNS.

1. Führen Sie den folgenden Befehl aus, um die Richtlinie `WooferLambdaRole` anzufügen:

   ```
   aws iam put-role-policy --role-name WooferLambdaRole \
       --policy-name WooferLambdaRolePolicy \
       --policy-document file://role-policy.json
   ```

## Schritt 3: Erstellen eines Amazon-SNS-Themas
<a name="Streams.Lambda.Tutorial.SNSTopic"></a>

In diesem Schritt erstellen Sie ein Amazon-SNS-Thema (`wooferTopic`) und abonnieren es für eine E-Mail-Adresse. Ihre Lambda-Funktion verwendet dieses Thema zum Veröffentlichen neuer Barks von Woofer-Benutzern.

1. Geben Sie den folgenden Befehl ein, um ein neues Amazon-SNS-Thema zu erstellen.

   ```
   aws sns create-topic --name wooferTopic
   ```

1. Geben Sie den folgenden Befehl ein, um `wooferTopic` für eine E-Mail-Adresse zu abonnieren. (Ersetzen Sie `region` bzw. `accountID` durch Ihre AWS -Region bzw. die Konto-ID und `example@example.com` durch eine gültige E-Mail-Adresse.)

   ```
   aws sns subscribe \
       --topic-arn arn:aws:sns:region:accountID:wooferTopic \
       --protocol email \
       --notification-endpoint example@example.com
   ```

1. Amazon SNS sendet eine Bestätigungsnachricht an Ihre E-Mail-Adresse. Klicken Sie auf den Link **Confirm subscription** (Abonnement bestätigen) in dieser E-Mail, um Ihr Abonnement abzuschließen.

## Schritt 4: Erstellen und Testen einer Lambda-Funktion
<a name="Streams.Lambda.Tutorial.LambdaFunction"></a>

In diesem Schritt erstellen Sie eine AWS Lambda Funktion (`publishNewBark`) zur Verarbeitung von `BarkTable` Stream-Datensätzen.

Die `publishNewBark`-Funktion verarbeitet nur die Stream-Ereignisse, die neuen Elementen in `BarkTable` entsprechen. Die Funktion liest Daten eines entsprechenden Ereignisses und ruft Amazon SNS auf, um es zu veröffentlichen.

1. Erstellen Sie eine Datei mit dem Namen `publishNewBark.js` und dem folgenden Inhalt. Ersetzen Sie `region` und `accountID` durch Ihre AWS Region und Konto-ID.

   ```
   'use strict';
   var AWS = require("aws-sdk");
   var sns = new AWS.SNS();
   
   exports.handler = (event, context, callback) => {
   
       event.Records.forEach((record) => {
           console.log('Stream record: ', JSON.stringify(record, null, 2));
   
           if (record.eventName == 'INSERT') {
               var who = JSON.stringify(record.dynamodb.NewImage.Username.S);
               var when = JSON.stringify(record.dynamodb.NewImage.Timestamp.S);
               var what = JSON.stringify(record.dynamodb.NewImage.Message.S);
               var params = {
                   Subject: 'A new bark from ' + who,
                   Message: 'Woofer user ' + who + ' barked the following at ' + when + ':\n\n ' + what,
                   TopicArn: 'arn:aws:sns:region:accountID:wooferTopic'
               };
               sns.publish(params, function(err, data) {
                   if (err) {
                       console.error("Unable to send message. Error JSON:", JSON.stringify(err, null, 2));
                   } else {
                       console.log("Results from sending message: ", JSON.stringify(data, null, 2));
                   }
               });
           }
       });
       callback(null, `Successfully processed ${event.Records.length} records.`);
   };
   ```

1. Erstellen Sie eine ZIP-Datei mit `publishNewBark.js`. Wenn Sie das ZIP-Befehlszeilen-Dienstprogramm verwenden, geben Sie dazu den folgenden Befehl ein.

   ```
   zip publishNewBark.zip publishNewBark.js
   ```

1. Beim Erstellen der Lambda-Funktion geben Sie den Amazon-Ressourcennamen (ARN) für `WooferLambdaRole` an, den Sie in [Schritt 2: Erstellen einer Lambda-Ausführungsrolle](#Streams.Lambda.Tutorial.CreateRole) erstellt haben. Geben Sie den folgenden Befehl ein, um diesen ARN abzurufen.

   ```
   aws iam get-role --role-name WooferLambdaRole
   ```

   Suchen Sie in der Ausgabe nach dem ARN für `WooferLambdaRole`.

   ```
   ...
   "Arn": "arn:aws:iam::region:role/service-role/WooferLambdaRole"
   ...
   ```

   Verwenden Sie den folgenden Befehl, um die Lambda-Funktion zu erstellen. *roleARN*Ersetzen Sie es durch den ARN für`WooferLambdaRole`.

   ```
   aws lambda create-function \
       --region region \
       --function-name publishNewBark \
       --zip-file fileb://publishNewBark.zip \
       --role roleARN \
       --handler publishNewBark.handler \
       --timeout 5 \
       --runtime nodejs16.x
   ```

1. Testen Sie die `publishNewBark`-Funktion. Stellen Sie dazu eine Eingabe bereit, die einem echten Datensatz aus DynamoDB Streams ähnelt.

   Erstellen Sie eine Datei mit dem Namen `payload.json` und dem folgenden Inhalt. Ersetzen Sie `region` und `accountID` durch Ihre AWS-Region und die Konto-ID:

   ```
   {
       "Records": [
           {
               "eventID": "7de3041dd709b024af6f29e4fa13d34c",
               "eventName": "INSERT",
               "eventVersion": "1.1",
               "eventSource": "aws:dynamodb",
               "awsRegion": "region",
               "dynamodb": {
                   "ApproximateCreationDateTime": 1479499740,
                   "Keys": {
                       "Timestamp": {
                           "S": "2016-11-18:12:09:36"
                       },
                       "Username": {
                           "S": "John Doe"
                       }
                   },
                   "NewImage": {
                       "Timestamp": {
                           "S": "2016-11-18:12:09:36"
                       },
                       "Message": {
                           "S": "This is a bark from the Woofer social network"
                       },
                       "Username": {
                           "S": "John Doe"
                       }
                   },
                   "SequenceNumber": "13021600000000001596893679",
                   "SizeBytes": 112,
                   "StreamViewType": "NEW_IMAGE"
               },
               "eventSourceARN": "arn:aws:dynamodb:region:account ID:table/BarkTable/stream/2016-11-16T20:42:48.104"
           }
       ]
   }
   ```

   Verwenden Sie den folgenden Befehl, um die `publishNewBark`-Funktion zu erstellen.

   ```
   aws lambda invoke --function-name publishNewBark --payload file://payload.json --cli-binary-format raw-in-base64-out output.txt
   ```

   Wenn der Test erfolgreich war, sehen Sie die folgende Ausgabe.

   ```
   {
       "StatusCode": 200,
       "ExecutedVersion": "$LATEST"
   }
   ```

   Darüber hinaus enthält die `output.txt`-Datei folgenden Text.

   ```
   "Successfully processed 1 records."
   ```

   Außerdem erhalten Sie in wenigen Minuten eine neue E-Mail-Nachricht.
**Anmerkung**  
AWS Lambda schreibt Diagnoseinformationen in Amazon CloudWatch Logs. Wenn Fehler mit Ihrer Lambda-Funktion auftreten, können Sie folgende Diagnoseverfahren zur Fehlerbehebung verwenden:  
Öffnen Sie die CloudWatch Konsole unter [https://console.aws.amazon.com/cloudwatch/](https://console.aws.amazon.com/cloudwatch/).
Wählen Sie im Navigationsbereich **Logs** (Logs) aus.
Wählen Sie die folgende Protokollgruppe aus: `/aws/lambda/publishNewBark`
Wählen Sie den aktuellen Protokoll-Stream aus, um die Ausgabe (und Fehler) der Funktion zu sehen.

## Schritt 5: Erstellen und Testen eines Auslösers
<a name="Streams.Lambda.Tutorial.CreateTrigger"></a>

In [Schritt 4: Erstellen und Testen einer Lambda-Funktion](#Streams.Lambda.Tutorial.LambdaFunction) haben Sie die Lambda-Funktion getestet, um sicherzustellen, dass sie korrekt ausgeführt wird. In diesem Schritt erstellen Sie einen *Auslöser*, indem Sie die Lambda-Funktion (`publishNewBark`) mit einer Ereignisquelle (dem `BarkTable`-Stream) verknüpfen.

1. Wenn Sie den Auslöser erstellen, müssen Sie den ARN für den `BarkTable`-Stream angeben. Geben Sie den folgenden Befehl ein, um diesen ARN abzurufen.

   ```
   aws dynamodb describe-table --table-name BarkTable
   ```

   Suchen Sie in der Ausgabe nach dem `LatestStreamArn`.

   ```
   ...
    "LatestStreamArn": "arn:aws:dynamodb:region:accountID:table/BarkTable/stream/timestamp
   ...
   ```

1. Geben Sie den folgenden Befehl ein, um den Auslöser zu erstellen. Ersetzen Sie `streamARN` durch den tatsächlichen Stream-ARN.

   ```
   aws lambda create-event-source-mapping \
       --region region \
       --function-name publishNewBark \
       --event-source streamARN  \
       --batch-size 1 \
       --starting-position TRIM_HORIZON
   ```

1. Testen Sie den Auslöser. Geben Sie dazu den folgenden Befehl ein, um `BarkTable` ein Element hinzuzufügen.

   ```
   aws dynamodb put-item \
       --table-name BarkTable \
       --item Username={S="Jane Doe"},Timestamp={S="2016-11-18:14:32:17"},Message={S="Testing...1...2...3"}
   ```

   Sie erhalten in wenigen Minuten eine neue E-Mail-Nachricht.

1. Öffnen Sie die DynamoDB-Konsole und fügen Sie `BarkTable` weitere Elemente hinzu. Sie müssen Werte für die Attribute `Username` und `Timestamp` angeben. (Sie sollten auch einen Wert für `Message` angeben, auch wenn er nicht erforderlich ist.) Sie erhalten eine neue E-Mail-Nachricht für jedes Element, das Sie `BarkTable` hinzufügen.

   Die Lambda-Funktion verarbeitet nur neue Elemente, die Sie `BarkTable` hinzufügen. Wenn Sie ein Element in der Tabelle aktualisieren oder löschen, hat die Funktion keine Auswirkung.

**Anmerkung**  
AWS Lambda schreibt Diagnoseinformationen in Amazon CloudWatch Logs. Wenn Fehler mit Ihrer Lambda-Funktion auftreten, können Sie folgende Diagnoseverfahren zur Fehlerbehebung verwenden.  
Öffnen Sie die CloudWatch Konsole unter [https://console.aws.amazon.com/cloudwatch/](https://console.aws.amazon.com/cloudwatch/).
Wählen Sie im Navigationsbereich **Logs** (Logs) aus.
Wählen Sie die folgende Protokollgruppe aus: `/aws/lambda/publishNewBark`
Wählen Sie den aktuellen Protokoll-Stream aus, um die Ausgabe (und Fehler) der Funktion zu sehen.