Projekte in AWS

Erstellen einer modernen Webanwendung

Bereitstellen einer Webanwendung, Anbinden an eine Datenbank und Analysieren des Benutzerverhaltens

Modul 5: Erfassen des Benutzerverhaltens

In diesem Modul werden Sie das Verhalten von Benutzern mit AWS Lambda und anderen serverlosen Services erfassen.

Übersicht

Ihre Mythical Mysfits-Website ist inzwischen einsatzbereit. Im Folgenden werden Sie die Interaktion Ihrer Benutzer mit der Website und den Mysfits besser verstehen lernen. Benutzeraktionen auf der Website, die zu Datenänderungen in Ihrem Backend führen, z. B. die Adoption oder das Liken von Mysfits, lassen sich recht einfach analysieren.

Wesentlich schwieriger sind Aktionen, die Ihre Benutzer vor der Entscheidung, ein Mysfit zu liken oder zu adoptieren, auf der Website durchführen. Gerade diese Aktionen könnten Ihnen jedoch helfen, das Benutzererlebnis zu verbessern und so die Adoption von Mysfits künftig zu beschleunigen. Um die dazu benötigten Erkenntnisse zu beschaffen, werden wir im Frontend der Website die Fähigkeit implementieren, eine kleine Anforderung an einen neu zu erstellenden API-Mikroservice zu senden, wenn ein Mysfit-Profil aufgerufen wird. Diese Datensätze werden in Echtzeit von einer serverlosen Codefunktion verarbeitet, zusammengeführt und für künftige Analysezwecke gespeichert.

Die Grundsätze für die Gestaltung moderner Anwendungen sehen die Verwendung zweckgerichteter, entkoppelter und modularer Services vor. Anstatt den vorhandenen Mysfits-Service, mit dem wir bisher gearbeitet haben, um zusätzliche Methoden und Funktionen zu erweitern, werden wir daher einen neuen und entkoppelten Service erstellen, mit dem Ereignisse zu Benutzerklicks auf der Mysfits-Website erfasst werden. Dieser vollständige Stack wird mithilfe einer bereitgestellten CloudFormation-Vorlage dargestellt.

Architekturdiagramm

Benutzerverhalten erfassen

Warum wird für diese Implementierung AWS Lambda verwendet?

Lambda eignet sich hervorragend für datengestützte Anwendungen, die in Echtzeit auf Benutzeraktionen, sich ändernde Daten und Systemstatus reagieren müssen. Diese Anwendungen sind in der Regel an Datenspeicher angebunden, um Daten für Batch-Verarbeitung, Stream-Analyse und Rückschlüsse beim Machine Learning abzurufen und zu analysieren. Lambda ist für diese Anwendungen bestens ausgestattet. Der Service ist in Datenspeicher wie Kinesis Data Streams und Data Firehose, S3, CloudWatch Events, CloudWatch Logs und DynamoDB integriert und unterstützt zurzeit insgesamt 17 Ereignisquellen.   

In diesem Modul verwendete serverlose Ressourcen

AWS Kinesis Firehose-Bereitstellungsstream: Kinesis Firehose ist ein hochverfügbarer und verwalteter Echtzeit-Streaming-Dienst, der Datensätze erfasst und automatisch an verschiedene Speicherziele in AWS weiterleitet, z. B. einen Amazon S3-Bucket oder einen Data-Warehouse-Cluster in Amazon Redshift. Mit Kinesis Firehose können außerdem alle über den Stream empfangenen Datensätze automatisch an eine mit AWS Lambda erstellte serverlose Funktion übermittelt werden. Dadurch können mit von Ihnen erstelltem Code alle zusätzlich erforderlichen Verarbeitungs- oder Umwandlungsschritte durchgeführt werden, bevor die Datensätze zusammengeführt und am konfigurierten Zielort gespeichert werden.

Amazon S3-Bucket: In S3 wird ein neuer Bucket erstellt, in dem die verarbeiteten Datensätze zu Klickereignissen in Dateien zusammengeführt und als Objekte gespeichert werden.

AWS Lambda-Funktion: Mit AWS Lambda können Entwickler Codefunktionen erstellen, die ausschließlich die für die Logik erforderlichen Komponenten umfassen. Anschließend können sie ihren Code bereitstellen, aufrufen und im Hinblick auf Zuverlässigkeit und Skalierbarkeit optimieren, ohne eine Infrastruktur verwalten zu müssen. Die serverlose Codefunktion in diesem Tutorial wird mit AWS SAM definiert. Sie wird in Python erstellt und in AWS Lambda bereitgestellt. Anschließend werden die Klickdatensätze, über den Bereitstellungsstream empfangen werden, verarbeitet und erweitert. Der von uns bereitgestellte Code ist sehr einfach und die durch ihn vorgenommene Erweiterung könnte im Website-Frontend durchgeführt werden, ohne dass nachfolgende Verarbeitungsschritte notwendig sind. Von der Funktion werden außerdem zusätzliche Attribute zum Mysfit erfasst, auf das der Benutzer klickt, um die Aussagekraft des Klickdatensatzes (anhand der vom Website-Frontend bereits abgerufenen Daten) zu verbessern. In diesem Workshop soll der Code lediglich die Möglichkeiten für die Gestaltung der Architektur verdeutlichen, die sich daraus ergeben, dass zusätzlich erforderliche Verarbeitungs- oder Umwandlungsschritte mithilfe einer serverlosen Codefunktionen in Echtzeit durchgeführt werden, bevor die Datensätze gespeichert werden. Nachdem die Lambda-Funktion erstellt und der Kinesis Firehose-Bereitstellungsstream als Ereignisquelle der Funktion konfiguriert ist, werden vom Bereitstellungsstream automatisch Klickdatensätze als Ereignisse an die erstellte Codefunktion übermittelt. Im Gegenzug empfängt er die vom Code zurückgegebenen Antworten und sendet die aktualisierten Datensätze an den vorab konfigurierten Amazon S3-Bucket.

Eine Amazon API Gateway-REST-API: AWS Kinesis Firehose verfügt wie andere AWS-Services über eine Service-API. Über diese leiten wir mit der "PutRecord"-Operation Datensätze mit Klickereignissen an den Bereitstellungsstream weiter. Allerdings soll das Website-Frontend nicht direkt in die "PutRecord"-API von Kinesis Firehose integriert werden. Andernfalls müssten von unserem Frontend-Code AWS-Anmeldeinformationen verwaltet werden, die zur Autorisierung der API-Anforderungen an die "PutRecord"-API benötigt werden. Darüber hinaus würden Benutzer damit direkten Zugriff auf die zugrunde liegende AWS-API erhalten. Böswillige Benutzer könnten dann versuchen, dem Bereitstellungsstream absichtlich falsch formatierte oder manipulierte Datensätze hinzuzufügen, die dem Verständnis des Benutzerverhaltens abträglich sind. Deshalb werden wir stattdessen Amazon API Gateway verwenden, um einen AWS-Service-Proxy für die API-Funktion "PutRecord" von Kinesis Firehose zu erstellen. Auf diese Weise können wir unseren eigenen öffentlichen RESTful-Endpunkt bereitstellen, für den zur Autorisierung von Anforderungen keine Verwaltung von AWS-Anmeldeinformationen im Frontend erforderlich ist. Wir werden zudem in API Gateway eine Vorlage für die Anforderungszuordnung verwenden. Diese ermöglicht es uns, die Struktur für eine eigene Payload zu definieren, mit der Anforderungen zugelassen werden, die der erwarteten Struktur entsprechen. Anschließend können diese ordnungsgemäß formatierten Anforderungen in die von der API-Funktion "PutRecord" von Kinesis Firehose benötigte Struktur überführt werden.

IAM-Rollen: Für Kinesis Firehose muss eine Servicerolle konfiguriert werden, mit der die empfangenen Datensätze als Ereignisse an die erstellte Lambda-Funktion und die verarbeiteten Datensätze an den Ziel-Bucket in S3 übermittelt werden. Zudem muss für die Amazon API Gateway-API eine neue Rolle erstellt werden, mit der für jede über die API empfangene Anforderung die API-Funktion "PutRecord" in Kinesis Firehose aufgerufen werden kann.

Anleitung für die Implementierung

  • A: Erstellen Sie ein neues CodeCommit-Repository.

    Dieser neue Stack, den Sie mit CloudFormation bereitstellen werden, wird nicht nur die für die Infrastrukturumgebung benötigten Ressourcen, sondern auch den Anwendungscode selbst enthalten, der von AWS Lambda zum Verarbeiten der Streaming-Ereignisse ausgeführt wird. Um die Erstellung unserer Infrastruktur und des Codes in einer Bereitstellung zu bündeln, werden wir ein weiteres AWS-Tool verwenden, das in der AWS Cloud9-IDE vorinstalliert ist: die AWS SAM-CLI. Für die Bereitstellung von Code für AWS Lambda-Funktionen im Service wird der Funktionscode in einer ZIP-Paketdatei zu einem Amazon S3-Bucket hochgeladen.

    Dieser Prozess wird von der SAM-CLI automatisch durchgeführt. Auf diese Weise können wird eine CloudFormation-Vorlage erstellen, die auf das lokale Verzeichnis im Dateisystem verweist, in dem der gesamte Code für unsere Lambda-Funktion gespeichert ist. Anschließend wird der Code von der SAM-CLI in eine ZIP-Datei gepackt und in den vorab konfigurierten Amazon S3-Bucket hochgeladen. Dann wird eine neue CloudFormation-Vorlage erstellt, in der das Verzeichnis in S3 angegeben wird, in die das erstellte ZIP-Paket für die Bereitstellung in AWS Lambda hochgeladen wurde. Zum Schluss stellen wir die von der SAM-CLI generierte CloudFormation-Vorlage in AWS bereit und können dann beobachten, wie die Umgebung zusammen mit der Lambda-Funktion, für die das über die SAM-CLI hochgeladene Codepaket zum Einsatz kommt, erstellt wird.

    Zunächst müssen wird jedoch ein neues CodeCommit-Repository erstellen, in dem der Code für den Streaming-Service gespeichert wird:

    aws codecommit create-repository --repository-name MythicalMysfitsStreamingService-Repository

    Kopieren Sie in der Antwort auf diesen Befehl den Wert für "cloneUrlHttp". Dieser sollte das folgende Format aufweisen: https://git-codecommit.REPLACE_ME_REGION.amazonaws.com/v1/repos/MythicalMysfitsStreamingService-Repository.

    Klonen Sie im nächsten Schritt dieses neue, leere Repository und kopieren Sie es in unsere IDE:

    cd ~/environment/
    git clone {insert the copied cloneValueUrl from above}
    B: Kopieren Sie die Codebasis für den Streaming-Service.

    Nun verschieben wir unser Arbeitsverzeichnis in dieses neue Repository:

    cd ~/environment/MythicalMysfitsStreamingService-Repository/

    Dann kopieren Sie die Anwendungskomponenten aus Modul 5 in das Verzeichnis im neuen Repository:

    cp -r ~/environment/aws-modern-application-workshop/module-5/app/streaming/* .

    Kopieren Sie ebenfalls die CloudFormation-Vorlage für dieses Modul und fügen Sie sie hier ein.

    cp ~/environment/aws-modern-application-workshop/module-5/cfn/* .
  • A: Installieren Sie mit pip die Abhängigkeiten für die Lambda-Funktion.

    Das Verzeichnis im Repository enthält nun alle bereitgestellten Artefakte:

    Eine CFN-Vorlage für die Erstellung des vollständigen Stacks

    Ein Python-Skript mit dem Code für unsere Lambda-Funktion: streamProcessor.py

    Diese Vorgehensweise entspricht dem von AWS-Kunden häufig verwendeten Ansatz. Die CloudFormation-Vorlagen werden zusammen mit dem Anwendungscode in einem Repository gespeichert. So erhalten Sie ein zentrales Verzeichnis, in dem alle Änderungen an der Anwendung und ihrer Umgebung nachverfolgt werden können.

    Wenn Sie sich den Code in der Datei "streamProcessor.py“ genauer anschauen, werden Sie feststellen, dass mit dem Python-Anforderungspaket eine API-Anforderung an den Mythical Mysfits-Service gesendet wird, der zuvor von Ihnen erstellt wurde. Die Laufzeitumgebung von AWS Lambda enthält standardmäßig keine externen Bibliotheken, weil die benötigten Versionen der verschiedenen Bibliotheken usw. je nach AWS-Kunde variieren.

    Sie müssen nun aus allen Bibliotheksabhängigkeiten und dem Code Ihrer Lambda-Funktion ein Paket erstellen und dieses zum Lambda-Service hochladen. Dazu werden wir pip verwenden, das Paketverwaltungsprogramm für Python-Pakete. Führen Sie im Cloud9-Terminal den folgenden Befehl aus, um das Anforderungspaket zusammen mit den zugehörigen Abhängigkeiten und Ihrem Funktionscode lokal zu installieren:

    pip install requests -t .

    Nachdem der Befehl ausgeführt wurde, sehen Sie, dass sich in Ihrem Repository-Verzeichnis nun weitere Python-Pakete befinden.

    B: Passen Sie den Code für die Lambda-Funktion an.

    Im Folgenden müssen wir eine Änderung im Code vornehmen, bevor unsere Lambda-Funktion bereitgestellt werden kann. In einer Zeile in der Datei "streamProcessor.py" muss der Wert für "ApiEndpoint" durch die API Ihres Mysfits-Services ersetzt werden. Dieser entspricht dem API-Endpunkt, den Sie in Modul 4 erstellt und im Website-Frontend verwendet haben.

    replace-api-endpoint

    Dieser Service wird für die Integration der Tabelle "MysfitsTable" in DynamoDB benötigt. Zwar könnten wir eine Lambda-Funktion erstellen, in die die DynamoDB-Tabelle direkt integriert ist, dies würde jedoch dem Sinn des ersten Mikroservice widersprechen. Wir würden wieder mit mehreren/separaten Codebasen arbeiten, in die die dieselbe Tabelle integriert ist. Stattdessen werden wir die Tabelle über den vorhandenen Service integrieren, um eine stärker entkoppelte und modulare Anwendungsarchitektur zu erhalten.

    C: Übermitteln Sie Ihren Code an CodeCommit.

    Übernehmen Sie den angepassten Code in das neue Repository, damit er in CodeCommit gespeichert wird:

    git add .
    git commit -m "New stream processing service."
    git push
  • A: Erstellen Sie einen S3-Bucket für die Pakete mit dem Lambda-Funktionscode.

    Nachdem die oben genannte Zeile in der Python-Datei geändert und der Code übermittelt wurde, können Sie den gesamten Funktionscode mit der AWS SAM-CLI einem Paket hinzufügen, dieses zu S3 hochladen und eine bereitstellbare CloudFormation-Vorlage erstellen, mit der der Streaming-Stack erstellt wird.

    Erstellen Sie zunächst mit der AWS-Befehlszeilenschnittstelle einen neuen Bucket in S3, in den die Pakete mit dem Lambda-Funktionscode hochgeladen werden sollen. Der Name des S3-Buckets muss für jeden AWS-Kunden weltweit eindeutig sein. Ersetzen Sie daher das Ende des Bucket-Namens durch eine für Sie eindeutige Zeichenfolge:

    B: Erstellen Sie mit der SAM-CLI ein Paket mit Ihrem Code für die Lambda-Funktion.

    Nachdem der Bucket erstellt wurde, können Sie mit der SAM-CLI ein Paket mit Ihrem Code erstellen, dieses hochladen und die CloudFormation-Vorlage anpassen. Denken Sie daran, den letzten Parameter des Befehls durch den Namen des Buckets zu ersetzen, den Sie eben erstellt haben. Für diesen Befehl wird außerdem angenommen, dass Sie im Terminal noch immer das Arbeitsverzeichnis im Repository geöffnet haben:

    sam package --template-file ./real-time-streaming.yml --output-template-file ./transformed-streaming.yml --s3-bucket replace-with-your-bucket-name

    Wenn der Befehl erfolgreich ausgeführt wurde, sehen Sie im Verzeichnis "./MythicalMysfitsStreamingService-Repository/" die neu erstellte Datei "transformed-streaming.yml". Wenn Sie sich den Inhalt anschauen, stellen Sie fest, dass der Parameter "CodeUri" der serverlosen Lambda-Funktion durch den Objektspeicherort ersetzt wurde, an den mit der SAM-CLI Ihr Code-Paket hochgeladen wurde.

    C: Stellen Sie den Stack mit AWS CloudFormation bereit.

    Als Antwort auf den in der SAM-CLI ausgeführten Befehl wird ebenfalls der CloudFormation-Befehl ausgegeben. Dieser muss ausgeführt werden, um den neuen vollständigen Stack zu erstellen. Da mit unserem Stack jedoch IAM-Ressourcen erstellt werden sollen, müssen Sie dem Befehl einen zusätzlichen Parameter hinzufügen. Führen Sie den folgenden Befehl aus, um den Streaming-Stack bereitzustellen:

    aws cloudformation deploy --template-file /home/ec2-user/environment/MythicalMysfitsStreamingService-Repository/cfn/transformed-streaming.yml --stack-name MythicalMysfitsStreamingStack --capabilities CAPABILITY_IAM

    Nachdem der Stack erstellt wurde, wird der gesamte Mikroservice für die Echtzeitverarbeitung erstellt.

    Wenn Sie zu einem späteren Zeitpunkt lediglich Änderungen am Code Ihrer Lambda-Funktion vornehmen und den restlichen CloudFormation-Stack unverändert beibehalten, können Sie dieselben Befehle für die AWS SAM-CLI und CloudFormation wie oben beschrieben ausführen. Dadurch bleibt die Infrastrukturumgebung unverändert und es wird nur der geänderte Code für Ihre Lambda-Funktion bereitgestellt.

  • A: Aktualisieren Sie den Inhalt der Website.

    Der Streaming-Stack ist einsatzbereit. Nun müssen Sie eine neue Version des Frontends der Mythical Mysfits-Website veröffentlichen. Diese enthält das JavaScript-Skript, mit dem bei jedem Klick auf ein Mysfit-Profil ein Ereignis an unseren Service gesendet wird.

    Sie finden Sie neue Datei "index.html" unter "~/environment/aws-modern-application-workshop/module-5/web/index.html".

    Diese Datei enthält dieselben Platzhalter wie die in Modul 4 verwendeten. Diese müssen ebenfalls aktualisiert werden. Zudem müssen Sie einen weiteren Platzhalter für den neuen Endpunkt des Streamverarbeitungsservices hinzufügen, den Sie zuvor erstellt haben. Für die verwendeten Variablenwerte können Sie in der "index.html"-Datei nachschauen, die Sie in Modul 4 bearbeitet haben.

    Führen Sie für den neuen Streaming-Stack den folgenden Befehl aus, um den neuen API Gateway-Endpunkt für Ihren Streamverarbeitungsservice abzurufen:

    aws cloudformation describe-stacks --stack-name MythicalMysfitsStreamingStack
    B: Senden Sie die neue Version der Website an S3.

    Ersetzen Sie in der Datei index.html den letzten Wert für " streamingApiEndpoint". Anschließend können Sie Ihre finale Version der Mythical Mysfits-Startseite veröffentlichen:

    aws s3 cp ~/environment/aws-modern-application-workshop/module-5/web/index.html s3://YOUR-S3-BUCKET/

    Aktualisieren Sie noch einmal die Mythical Mysfits-Website im Browser. Auf der Website wird nun jeder Benutzerklick auf ein Mysfit-Profil erfasst und veröffentlicht!

    Damit die verarbeiteten Datensätze angezeigt werden können, werden sie an den Ziel-Bucket in S3 gesendet, der für den Mythical Mysfits-Streaming-Stack erstellt wurde.

    Ihre moderne Anwendungsarchitektur ist nun fertig. Machen Sie sich unbedingt mit der AWS-Konsole und den Services vertraut, die Sie für die Mythical Mysfits-Website erstellt haben!

  • Denken Sie ebenfalls daran, alle während des Workshops erstellten Ressourcen zu löschen, um sicherzustellen, dass Sie nur so lange für diese Ressourcen bezahlen, wie Sie sie tatsächlich nutzen. Machen Sie sich außerdem in der AWS-Konsole mit den erstellten Ressourcen vertraut und löschen Sie sie anschließend.

    Die Ressourcen, die Sie in zwei Fällen mit AWS CloudFormation erstellt haben, können Sie einfach entfernen, indem Sie für jeden Stack den folgenden Befehl in der Befehlszeilenschnittstelle ausführen:

    aws cloudformation delete-stack --stack-name STACK-NAME-HERE

    Um alle erstellen Ressourcen zu entfernen, können Sie die folgenden AWS-Konsolen verwenden, die Ressourcen enthalten, die Sie während des Mythical Mysfits-Workshops erstellt haben:

Fazit

Dieser Workshop sollte Ihnen einen Eindruck davon vermitteln, wie Sie als Entwickler moderne Anwendungsarchitekturen mit AWS gestalten und erstellen können. Entwickler in AWS können Ressourcen mit der AWS-Befehlszeilenschnittstelle programmatisch bereitstellen, Definitionen für die Infrastruktur mithilfe von AWS CloudFormation wiederholt verwenden sowie Code-Änderungen mit der Suite von AWS-Entwicklertools für Codeservices automatisch vornehmen und bereitstellen. Darüber hinaus profitieren Sie von verschiedenen Funktionen für Datenverarbeitungs- und Anwendungsservices, für die keine Server bereitgestellt oder verwaltet werden müssen!

Um sich mit den internen Funktionsprinzipien der von Ihnen erstellten Mythical Mysfits-Website vertraut zu machen, können Sie sich im nächsten Schritt intensiver mit den bereitgestellten CloudFormation-Vorlagen und den darin deklarierten Ressourcen beschäftigen.

Wir hoffen, dass Ihnen der Workshop zur Erstellung moderner Anwendungen mit AWS gefallen hat! Dieses Tutorial ist ebenfalls in GitHub verfügbar, wo Sie unter "Issues" Kritik oder Wünsche äußern können. Sie können ebenfalls einen Pull Request in GitHub einreichen, wenn Sie an der Verbesserung des Codes mitarbeiten möchten.

Weitere Informationen zu Entwicklungsaufgaben in AWS finden Sie im AWS-Entwicklerzentrum.

Herzlichen Glückwunsch!

Sie haben eine moderne Webanwendung in AWS erstellt.
Teilen Sie Ihren Erfolg mit Ihren Freunden oder senden uns Ihr Feedback.

Twilight Glitter ist von Ihrer Arbeit beeindruckt.