In diesem Modul werden Sie die node.js-Anwendung in mehrere miteinander verbundene Services aufteilen und das Image jedes Service in ein Amazon Elastic Container Registry (Amazon ECR)-Repository verschieben. Erste Schritte

Die endgültige Anwendungsarchitektur verwendet den Amazon Elastic Container Service (Amazon ECS) und den Application Load Balancer (ALB). 

Übersicht über die Architektur

a. Client
Der Client stellt Datenverkehrsanfragen über Port 80.

b. Load Balancer
Der ALB leitet den externen Datenverkehr an den richtigen Service weiter. Der ALB prüft die Client-Anfrage und verwendet die Routing-Regeln, um die Anfrage an eine Instance und einen Port für die Zielgruppe zu leiten, die der Regel entspricht.

c. Zielgruppen
Jeder Service hat eine Zielgruppe, die die Instances und Ports der einzelnen für diesen Service laufenden Container verfolgt.

d. Microservices
Amazon ECS stellt jeden Service in einem Container in einem EC2-Cluster bereit. Jeder Container übernimmt nur ein einzelnes Feature.

Isolierung von Abstürzen
Selbst in den besten Entwicklungsabteilungen kommt es in der Produktion zu fatalen Abstürzen. Neben der Befolgung aller herkömmlichen Best Practices für den ordnungsgemäßen Umgang mit Abstürzen ist ein Ansatz, der die Auswirkungen solcher Abstürze begrenzen kann, die Entwicklung von Microservices. Bei einer guten Microservice-Architektur fällt nur ein Teil des gesamten Service aus, wenn einer der Microservices abstürzt. Der Rest Ihres Service kann weiterhin ordnungsgemäß funktionieren.

Isolation für Sicherheit
Wenn in einer monolithischen Anwendung eine Funktion der Anwendung eine Sicherheitsverletzung aufweist, z. B. eine Schwachstelle, die eine Remote-Codeausführung ermöglicht, dann müssen Sie davon ausgehen, dass ein Angreifer auch auf jede andere Funktion des Systems Zugriff hätte haben können. Dies kann gefährlich sein, wenn z. B. Ihre Funktion zum Hochladen von Avataren ein Sicherheitsproblem aufweist, das dazu führt, dass Ihre Datenbank mit Benutzerpasswörtern kompromittiert wird. Die Trennung der Funktionen in Microservices mit Amazon ECS ermöglicht es Ihnen, den Zugang zu AWS Ressourcen zu schützen, indem Sie jedem Service eine eigene AWS Identity and Access Management (IAM)-Rolle zuweisen. Wenn die Best Practices der Microservices befolgt werden, können sich Angreifer höchstens Zugang zu den Ressourcen eines einzelnen Service verschaffen und nicht serviceübergreifend auf andere Ressourcen zugreifen, ohne sich vorher Zugriff auf die anderen Services zu verschaffen.

Unabhängige Skalierung
Wenn Funktionen in Mikroservices aufgeteilt werden, können die Menge der Infrastruktur und die Anzahl der von jeder Microservice-Klasse verwendeten Instances unabhängig voneinander nach oben und unten skaliert werden. Dies erleichtert es, die Kosten für ein bestimmtes Feature zu messen und Features zu identifizieren, die möglicherweise zuerst optimiert werden müssen. Wenn der Ressourcenbedarf eines bestimmten Features problematisch ist, sind andere Features davon nicht betroffen und die Leistung wird somit nicht beeinträchtigt.

Entwicklungsgeschwindigkeit
Microservices senken die Risiken bei der Entwicklung und beschleunigen diese so. Bei monolithischer Software können sich neue Features schnell auf jedes andere Feature der Software auswirken. Entwickler müssen die Auswirkungen jedes hinzugefügten Codes sorgfältig abwägen und sicherstellen, dass er keine Fehler verursacht. Dagegen wird bei einer richtig aufgebauten Microservice-Architektur neuer Code für neue Features in einen neuen Service eingepflegt. Entwickler können sicher sein, dass jeder von ihnen verfasste Code den bestehenden Code nicht beeinflussen kann, es sei denn, sie stellen explizit eine Verbindung zwischen zwei Microservices her.

Veranschlagte Zeit: 20 Minuten

Verwendete Services:


Befolgen Sie die nachstehende Schritt-für-Schritt-Anleitung zum Aufteilen monolithischer Software. Klicken Sie auf die jeweilige Nummer eines Schritts, um den Bereich zu erweitern.

  • Schritt 1: Bereitstellen der ECR-Repositorys

    In den beiden vorherigen Modulen haben Sie Ihre Anwendung als Monolith mit einem einzigen Service und einem einzigen Container-Image-Repository bereitgestellt. Um die Anwendung in drei Microservices aufzuteilen, müssen Sie drei Repositorys (eines für jeden Dienst) in Amazon ECR bereitstellen.

    Unsere drei Services sind:

    1. users
    2. threads
    3. posts

    Erstellen Sie die drei Repositorys, indem Sie die folgenden Schritte für jeden Service wiederholen:

    • Navigieren Sie zur Amazon ECR-Konsole.
    • Wählen Sie Repository erstellen aus.
    • Legen Sie auf der Seite Repository anlegen im Feld Repository-Name ein Repository für den Service an (posts, threads oder users).
      ⚐ Hinweis: Ändern Sie nicht die Standardeinstellungen der Optionen für Tag-Unabänderlichkeit.

    Sie sollten über vier Repositorys in Amazon ECR verfügen. Zeichnen Sie die Repository-Informationen für jeden Mikroservice auf, den Sie angelegt haben. Diese Informationen werden in einem kommenden Schritt benötigt. Die benötigten Informationen liegen in folgendem Format vor:
    [account-id].dkr.ecr.[region].amazonaws.com/[service-name]

    repositories
  • Schritt 2: Authentifizieren von Docker mit AWS (optional)

    Sie benötigen Zugriff auf Docker, um die Images für jeden Service zu erstellen und zu übertragen. Wenn Sie an diesem Tutorial zu verschiedenen Zeitpunkten arbeiten, wurden Sie möglicherweise aus Docker ausgeloggt. Wenn dies der Fall ist, führen Sie die folgenden Schritte aus, um sich erneut in Docker anzumelden.

    • Führen Sie $(aws ecr get-login --no-include-email --region [your-region]) aus.
      Ersetzen Sie [your-region], z. B.: $(aws ecr get-login --no-include-email --region us-west-2)

    Wenn die Authentifizierung erfolgreich war, erhalten Sie die Bestätigung:  Anmeldung erfolgreich.

  • Schritt 3: Aufbau und Übertragung von Images für jeden Service

    Im Projektordner amazon-ecs-nodejs-microservices/3-microservices/services befinden sich Ordner mit Dateien für jeden Service. Beachten Sie, dass jeder Microservice im Wesentlichen ein Klon des vorherigen monolithischen Service ist.

    Wenn Sie die Datei db.json in jedem Service und im monolithischen API-Service vergleichen, wird die Spezialisierung der Services ersichtlich. Zuvor wurden posts, threads und users alle in einer einzigen Datenbankdatei gespeichert. Nun wird jeder Service in einer eigenen Datenbankdatei gespeichert.

    Öffnen Sie Ihr Terminal und stellen Sie folgenden Pfad ein: ~/amazon-ecs-nodejs-microservices/3-microservices/services

    Erstellen und Taggen der Images

    • Führen Sie im Terminal folgenden Befehl aus: docker build -t [service-name] ./[service-name]
      Ersetzen Sie [service-name], z. B.: docker build -t posts ./posts

    • Nachdem der Build abgeschlossen ist, markieren Sie das Image, damit Sie es in das Repository übertragen können:
      docker tag [service-name]:latest [account-ID].dkr.ecr.[region].amazonaws.com/[service-name]:v1
      Ersetzen Sie [service-name], [account-ID] und [region], z. B.: docker tag posts:latest [account-id].dkr.ecr.us-west-2.amazonaws.com/posts:v1

    • Übertragen Sie das Image an ECR: docker push [account-id].dkr.ecr.[region].amazonaws.com/[service-name]:v1
      Ersetzen Sie [service-name], [account-ID] und [region].

    In Ihrem ECR-Repository sollten die Images jetzt mit "v1" getaggt sein. 

    ♻ Wiederholen Sie diese Schritte für jedes Microservice-Image.  

    ⚐ HINWEIS: Erstellen und taggen Sie alle drei Images.