AWS Germany – Amazon Web Services in Deutschland

Modernisierung des Moodle LMS mit AWS Serverless Containern

Original von Hendry Anwar – Senior Solutions Architect
Übersetzt durch Mehdi Yosofie – Associate Solutions Architect

Die englische Version diese Artikels kann hier gefunden werden.

Moodle ist eine beliebte Open-Source Lern-Management-Plattform. Viele Lerninstitutionen benutzen Moodle um ihren Studierenden eine digitale Lernplattform anzubieten mit der diese ihre Lernziele erreichen können – insgesamt sind es 396 Millionen Nutzer weltweit in 239 Ländern (Stand Oktober 2023). Viele Bildungseinrichtungen haben sich durch die Covid-19 Restriktionen angepasst und von vor-Ort Lernen zum Online-Lernen umgestellt. Moodle’s globale Community, das Plugin Ökosystem und kein-Kosten-Modell haben diesen Wandel unterstützt.

Moodle ist eine monolithische, in PHP entwickelte Anwendung mit einer typischen Datenbank wie MySQL oder PostgreSQL. Normalerweise speichert Moodle seine Anwendungsdaten in der Datenbank sowie in einem Dateisystem namens Moodledata. Um die Leistung zu verbessern, unterstützt Moodle Cache Lösungen wie Redis oder Memcached.


Abbildung 1: High Level Architektur der Infrastrukturkomponenten in Moodle

Viele Bildungseinrichtungen betreiben Moodle auf einer physichen oder einer virtuellen Maschine. Diese Einrichtungen möchten die Skalierbarkeit ihrer Moodle Anwendung gewährleisten um sowohl den Betrieb und die Überwachung zu erleichtern als auch Betriebskosten zu optimieren. Ein Weg, dies anzugehen, ist die Verwendung von Container Technologie. Container ermöglichen Entwicklern, den Anwendungscode zusammen mit den Abhängigkeiten und der Konfiguration zu bündeln. Das macht die Bereitstellung der Anwendung portabel und automatisierbar. Lernen Sie in diesem Artikel wie man Moodle mit der Serverless-Container-Technologie auf Amazon Web Services (AWS) bereitstellen und ausführen kann.

Warum Container auf AWS? Vorteile von Serverless Container für Moodle

AWS bietet Amazon Elastic Container Service (ECS), einen vollständig verwalteten Container-Orchestrierungsservice, mit dem Sie containerisierte Anwendungen einfach bereitstellen, verwalten und skalieren können. Darüber hinaus bietet die Bereitstellung von Moodle auf Amazon ECS zusätzliche Vorteile im Vergleich zur Ausführung auf physischer Hardware oder VM-basierender Umgebungen.

Serverless Container mit AWS Fargate

Amazon ECS understützt AWS Fargate als Startoption um die Bereitstellung containerbasierender Anwendungen auf durch AWS voll verwalteter Serverless Infrastruktur zu ermöglichen. Mit AWS Fargate können sich Kunden auf das Bereitstellen und Verwaltung der Moodle Anwendung fokussieren statt auf den Betrieb der zugrundeliegenden Infrastruktur. AWS Fargate beseitigt den Betriebsaufwand für Skalierung, Patches, Schutz und Verwaltung von Servern. Dabei wird jeder ECS-Task in einer eigenen, abgetrennten Laufzeitumgebung ausgeführt.

Integrierte Überwachung

Amazon ECS mit AWS Fargate als Startoption ist mit Amazon CloudWatch Container Insights integriert, welches mit einem Klick freigeschaltet werden kann um Metriken und Logs von Anwendungen zu sammeln, aggregieren und zusammenzufassen. Amazon CloudWatch sammelt automatisch Metriken von der Anwendung wie beispielsweise CPU-, RAM-, Speicher-, Netzwerk- und Diagnose-Informationen um Kunden bei der schnellen Beseitigung von Leistungsproblemen zu unterstützen.


Abbildung 2. Amazon CloudWatch Container Insights Kartenansicht von Ressourcen in Amazon ECS.

Abbildung 3. Amazon Cloudwatch Insights Performance Monitoring Dashboard


Abbildung 4. Amazon CloudWatch logs Insights

Schwankende Anwendungslast mit schneller Skalierung zuverlässig bewältigen

Container haben üblicherweise eine schnellere Startzeit verglichen mit virtuellen Machinen weil sie wenig Overhead haben, z.B. keinen Kernel starten und keine Hardware erkennen müssen. Zusätzlich können Kunden mit der Verbesserung der Skalierbarkeit durch AWS Fargate, bei der der Amazon ECS Service Scheduler benutzt wird, bis zu 500 Fargate-Tasks in weniger als einer Minute pro Service starten. Durch das schnelle Skalieren kann die Moodle Anwendung besser auf die schwankende Nutzung reagieren, etwa während Prüfungszeiträumen oder ganz allgemein bei der täglichen Mehrnutzung zu Unterrichtszeiten. Das kann Lernenden eine zuverlässige und konsistente Erfahrung beim Zugriff auf Moodle bieten. Die schnellere Skalierung und Startzeit reduzieren auch die Nowendigkeit für das Betriebsteam, Rechenkapazität im Voraus bereitzustellen, um erwarteten Spitzenwerten gerecht zu werden.

Kosten optimieren

Indem Kunden AWS Fargate nutzen, können sie ECS-Tasks für Moodle so einstellen, dass immer die richtige Anzahl an vCPU und RAM benutzt wird um Rechenkapazität nicht überzudosieren, und somit Kosten zu sparen. AWS Fargate hat eine weitere Option namens Fargate Spot, welche es Kunden erlaubt, ECS-Tasks für Moodle auf nicht genutzte Rechenkapazität mit einem Rabatt von bis zu 70% auszuführen. Die Lösung in diesem Artikel ist mit einem Verhältnis von 3:1 für Fargate Spot konfiguriert, das heißt mit vier Replikate an ECS-Tasks laufen drei auf Fargate Spot und eine läuft auf normalem Fargate.

AWS Architektur um Moodle LMS mit AWS Serverless Containern auszuführen

Nachdem wir auf die Vorteile Moodle mit AWS Serverless Containern auszuführen, eingegangen sind, untersuchen wir nun die Architektur für die Lösung.

Abbildung 5. Architektur Diagramm um Moodle mit Serverless Containern auf AWS auszuführen. Die Architektur zeigt eine modulare Ansicht mit AWS Diensten, die im Folgenden detaillierter erklärt wird.

Die Lösung wird mit dem AWS Cloud Development Kit (CDK) bereitgestellt, welches Nutzern erlaubt Cloud Ressourcen mit der Programmiersprache ihrer Wahl zu definieren. Die Lösung ist auf zwei Verfügbarkeitszonen bereitgestellt um hohe Verfügbarkeit zu gewährleisten.

Am Anwendungsendpunkt wurde eine Amazon CloudFront-Distribution erstellt und wird als Endpunkt für Endnutzer genutzt um die Moodle Anwendung zu erreichen. Amazon CloudFront verbessert die Leistung der Anwendung, indem die Inhalte in der Nähe der Endnutzer mit geringerer Latenz bereitgestellt werden. Die Lösung erstellt und assoziiert eine AWS Web Application Firewall (AWS WAF) Web-Zugriffskontrolle (ACL) mit der CloudFront-Distribution, die mit einer verwalteten Amazon IP-Reputationsliste konfiguriert wird. In dieser Web-ACL können bei Bedarf auch zusätzliche Regeln aktiviert werden. Hinter Amazon CloudFront wird die Last auf die Moodle Anwendung mit einem Application Load Balancer (ALB) ausgeglichen und mit einem TLS-Zertifikat, das im AWS Certificate Manager gespeichert ist, gesichert und verschlüsselt übertragen. ALB verteilt den eingehenden Verkehr automatisch über mehrere Moodle Instanzen. Es überwacht den Zustand der registrierten Ziele und leitet den Verkehr nur an die funktionierenden Ziele weiter. Ändert sich der eingehende Verkehr über die Zeit, skaliert der ALB auch den Load Balancer entsprechend.

Der eingehende Datenverkehr, der über den ALB verteilt wird, wird von einem Pool von Moodle Instanzen empfangen, die auf Amazon ECS mit einer Kombination aus AWS Fargate und AWS Fargate Spot basierenden Tasks ausgeführt werden. Der Amazon ECS Dienst orchestriert automatisch mehrere ECS-Tasks, die die Moodle Container ausführen. Das Container-Image der Anwendung basiert auf einem mit einigen Modifikationen ergänzten Bitnami Moodle Docker Image welches unter anderem eine Redis Cache Integration ermöglicht. Das Container Image ist auf Amazon Elastic Container Registry (Amazon ECR) gespeichert, welcher ein vollständig verwaltetes Container-Register bereitstellt.

Um Moodledata Dateien über verschiedene Moodle Instanzen zu zentralisieren und zu teilen, ist für diese Lösung ein gemeinsames Dateisystem notwending. Amazon Elastic File System (Amazon EFS) ist ein einfach zu bedienendes, serverloses und elastisches Dateisystem das man “einmalig einrichten und vergessen” kann. Amazon EFS vereinfacht die Einrichtung, Skalierung und kostengünstige Optimierung von Dateispeicher auf AWS. Amazon EFS wird bereitgestellt und auf den ECS-Tasks eingehängt, um als zugrundeliegendes Moodle- und Moodledata-Dateisystem verwendet zu werden. Die Moodle Datenbank ist auch zentralisiert und in Amazon Relational Datebase Service (Amazon RDS) bereitgestellt. Mit Amazon RDS, einem verwalteten Service, können Sie eine relationale Datenbank in der Cloud einrichten, betreiben und skalieren. Es bietet Kosteneffizienz, anpassbare Kapazität und übernimmt zeitaufwändige Datenbankverwaltungsaufgaben, damit Sie sich auf Ihre Anwendung und Ihr Geschäft konzentrieren können.

Um die Gesamtleistung der Anwendung zu verbessern, hat Moodle einen integrierten Cache Mechanismus, um den Speicher, das Dateisystem oder den externen Cache-Server wie Memcached oder Redis zu benutzen. Diese Lösung benutzt Amazon ElastiCache für Redis als zentralen Cache-Speicher. Amazon ElastiCache für Redis vereinfacht die Bereitstellung und Ausführung von Redis-protokollkonformen Serverknoten in AWS.

Moodle LMS auf Serverless Containern mit AWS ausführen

Voraussetzungen

  1. AWS Command Line Interface (AWS CLI) installieren und mit einem AWS Identity and Access Management (IAM) Benutzer konfigurieren.
  2. AWS CDK installieren
  3. Docker installieren
  4. Git installieren
  5. Den Quellcode mit folgendem Kommando auf Ihre Maschine klonen:
    git clone https://github.com/aws-samples/aws-cdk-ecs-refarch-moodle.git

Domain Name und TLS Zertifikat einrichten

  1. Einen öffentlichen Domainnamen aufsetzen um ein öffentliches Zertifikat in ACM zu beantragen. Falls Sie noch keinen öffentlichen Domainnamen haben, können Sie Amazon Route53 nutzen um eine neue Domain zu registrieren. Dieser Domainname wird auch für den alternativen CloudFront Domainnamen benutzt.
  2. Zwei öffentliche Zertifikate mit ACM für Ihren Domainnamen beantragen. Das erste ist für den ALB und dort, wo diese Lösung bereitgestellt wird (z.B. in eu-central-1); das zweite ist für CloudFront in der us-east-1 Region. Zum Beispiel: moodle.example.com oder *.example.com. Verwenden Sie die ARN des Zertifikats in den Bereitstellungsschritten.

Moodle Container-Image auf Amazon ECR veröffentlichen

Vor der Bereitstellung der Lösung müssen Sie erst das Moodle-Container-Image lokal bauen und es in einem Container-Register wie Amazon ECR oder einem extern Register Ihrer Wahl veröffentlichen. In dieser Lösung wird Amazon ECR verwendet.

  1. Öffnen Sie ihren Command Line Interface Ihrer Wahl wie beispielsweise Terminal oder Command Prompt
  2. Vom obersten Verzeichnis des Quellcodes aus führen Sie folgenden Befehl aus, um das Container-Image zu erstellen: docker build -t moodle-image src/image/src
  3. Authentifizieren Sie sich zu Ihrem Standard AWS Account Register: aws ecr get-login-password --region [your-region] | docker login --username AWS --password-stdin [your-aws-account-id].dkr.ecr.[your-region].amazonaws.com
  4. Erstellen Sie ein neues ECR -Repository, um das Image zu speichern: aws ecr create-repository --repository-name moodle-image --region [your-region]
  5. Taggen Sie das Image um es auf Ihrer Repository zu übertragen: docker tag moodle-image:latest [your-aws-account-id].dkr.ecr.[your-region].amazonaws.com/moodle-image:latest
  6. Veröffentlichen Sie das Container-Image: docker push [your-aws-account-id].dkr.ecr.[your-region].amazonaws.com/moodle-image:latest

Bereitstellungsschritte

  1. Konfigurieren Sie den Kontext in der Datei src/cdk/cdk.json.
  1. Konfigurieren Sie app-config/albCertificateArn und app-config/cfCertificateArn mit dem ARN des ACM Zertifikatsb. Konfigurieren Sie app-config/cfDomain für CloudFront mit demselben Domainnamen wie mit dem der öffentlichen Zertifikate, die Sie während der Schrittes “Voraussetzungen” angefordert haben. Zum Beispiel: moodle.example.com.c. Konfigurieren Sie app-config/moodleImageUri mit der URI des Moodle Container-Image, das Sie vor den Bereitstellungsschritten hochgeladen haben. Zum Beispiel [your-aws-account-id].dkr.ecr.[your-region].amazonaws.com/moodle-image:latest2. Gehen Sie in das AWS CDK Anwendungsverzeichnis cd src/cdk und führen Sie npm install aus.
  2. Führen Sie cdk bootstrap aus, um das CDK Toolkit zu initialisieren. (Sie müssen dies nur einmal ausführen.)
  1. Führen Sie cdk deploy --all aus, um die CDK Anwendung bereitzustellen.
  2. Sobald die Anwendung erfolgreich bereitgestellt wurde, beginnt Moodle die initiale Installation, die ungefähr 15-20 Minuten dauert. Überprüfen Sie den Prozess indem Sie die Logs in der Amazon ECS Konsole ansehen.
  3. Nachdem die Installation beendet ist, können Sie auf den Anwendungsendpunkt, der als APPLICATIONLOADBALANCERDNSNAME ausgegeben wird, zugreifen.

Nach der Bereitstellung

  1. Optional: Sie können einen DNS-Eintrag konfigurieren, um auf den ALB-Endpunkt zu verweisen und die SSL-Warnung zu entfernen.
  2. Benutzen Sie den in der MOODLEUSERNAME-Ausgabe beschriebenen Benutzernamen und holen Sie das Passwort aus dem AWS Secrets Manager mit der in der MOODLEPASSWORDSECRETARN-Ausgabe beschriebenen ARN
  3. Um die Leistung der Moodle-Anwendung zu verbessern, konfigurieren Sie Moodle-Caching unter Verwendung des in der MOODLEREDISPRIMARYENDPOINTADDRESSANDPORT-Ausgabe beschriebenen Amazon ElastiCache Redis-Endpunkts.
    1. Tragen Sie den Amazon ElastiCache Redis-Endpunkt ein. Siehe dazu die offizielle Moodle-Dokumentation zum Hinzufügen von Cache-Store-Instanzen.
    2. Legen Sie den Anwendungs-Cache so fest, um die Redis Cache Speicher-Instanz zu benutzen, die im letzten Schritt hinzugefügt wurde. Siehe dazu die Moodle Dokumentation um den “Speicher festzulegen wenn kein Mapping vorhanden ist”.
  4. Sie können die Anzahl der Replikate der Moodle Instanz mit der Konfiguration app-config/serviceReplicaDesiredCount in der Datei src/cdk/cdk.json setzen. Optional können Sie app-config/serviceHealthCheckGracePeriodSeconds von 1800 auf 300 Sekunden setzen. Führen Sie cdk diff aus, um den Vergleich zwischen der aktuellen Version mit der bereits bereitgestellten Version zu sehen. Führen Sie dann cdk deploy —all aus, um die neuesten Änderungen auszuführen.
  5. Um die Moodle Anwendung vom CloudFront Endpunkt zu erreichen, müssen Sie einen CNAME DNS Eintrag erstellt haben, der den zuvor mit dem Wert in der CLOUDFRONTDNSNAME-Ausgabe eingerichteten Domainnamen verwendet. Zum Beispiel: moodle.example.com mit dem Wert abcd1234efgh.cloudfront.net. Wenn Sie einen 502-Fehlercode bekommen, könnte es sein, dass der TLS-Handshake zwischen CloudFront und ALB fehlschlägt, weil der Domainname im TLS-Zertifikat für ALB nicht mit dem Host-Header übereinstimmt, der von CloudFront weitergeleitet wird (der Host-Header in diesem Fall ist der Domainname, den Sie verwenden, um auf Amazon CloudFront zuzugreifen).

Hinweis: Aufgrund der Softwarearchitektur von Moodle werden einige langwierige Vorgänge synchron ausgeführt. Zum Beispiel, wenn ein Administrator ein Plugin installieren und dann die Anfrage senden möchte. Anstatt die Aufgabe im Hintergrund auszuführen, verarbeitet Moodle die Anfrage und der Browser wartet darauf, dass der Moodle-Server die Installation abschließt und eine Antwort zurückgibt, was einige Zeit in Anspruch nehmen kann. Die aktuelle CloudFront-Origin-Antwortzeitüberschreitung ist auf das maximal standardmäßig erlaubte Limit von 60 Sekunden eingestellt. Ich empfehle, dies auf 180 Sekunden zu erhöhen, um mögliche Probleme zu vermeiden, die durch eine vorzeitige Verbindungsunterbrechung seitens Amazon CloudFront während noch laufender Vorgänge verursacht werden könnten. Sie können die Anfrage zur Erhöhung des Timeouts stellen, indem Sie ein Ticket beim AWS Support erstellen. Sobald die Anfrage genehmigt wurde, können Sie den Wert für app-config/cfDistributionOriginTimeoutSeconds entsprechend der von Ihnen angeforderten Dauer konfigurieren. Alternativ kann der Admistrator einen Application Load Balancer-Endpunkt verwenden, um langwierige Vorgänge auszuführen.

Aufräumen

Sie sollten in Betracht ziehen, die Anwendungsinfrastruktur zu löschen, sobald Sie sie nicht mehr benötigen, um Kosten zu sparen. Um dies zu tun, befolgen Sie diese Schritte:

  1. Öffnen Sie Ihre bevorzugte Befehlszeile
  2. Wechseln Sie von Hauptverzeichnis des Quellcodes in das CDK-Anwendungsverzeichnis mit dem Befehl cd src/cdk.
  3. Führen Sie cdk destroy —all aus, um die CDK-Anwendung zu löschen.

In diesem Beitrag ging es darum wie man die Moodle LMS mithilfe von Serverless Container-Technologien auf AWS bereitstellen kann, um die mühsame Serververwaltung zu reduzieren, den zuverlässigen Umgang mit stark schwankendem Datenverkehr durch schnelles Skarieren mit AWS Fargate zu ermöglichen, die Anwendungen mit integriertem Monitoring über Amazon CloudWatch zu überwachen und Kosten zu optimieren, indem Sie AWS Fargate Spot verwenden. Wenn Sie diese Lösung verwenden und Kommentare zur Verbesserung abgeben möchten, können Sie Feedback auf der Github Projektseite über die “Issues”-Funktion hinterlassen.

Sébastien Stormacq
Hendry Anwar In seiner Funktion als leitender Lösungsarchitekt bei Amazon Web Services (AWS) unterstützt Hendry Kunden dabei, ihre Geschäftsziele zu erreichen, indem er wirkungsvolle Technologien und Lösungen einführt, die skalierbar, zuverlässig, sicher und optimiert sind. Hendry ist in Jakarta, Indonesien, ansässig.