Bereitstellung einer Rails-Anwendung mit Amazon ECS
Marcin Doliwa
Software Engineer
In diesem Tutorial möchte ich Ihnen zeigen, wie Sie eine Rails-Beispielanwendung mit dem Amazon Elastic Container Service (ECS) bereitstellen können.
Erzeugen wir sie, indem wir schienen neue beispiel-schienen-appund generiert dann eine grundlegende Controller-Aktion Schienen g Controller Willkommensindex und die Festlegung von Routen auf den Wurzelpfad als "root to: welcome#index".
Unser Ziel ist es, dass diese Begrüßungsseite mit ECS eingerichtet wird.
Erstellen eines Repositorys mit Amazon Elastic Container Registry (ECR)
Amazon ECR ist eine Container-Registry. Wir werden sie verwenden, um die Images unserer App zu speichern und sie daraus zu ziehen, damit sie auf ECS laufen.
Gehen Sie zu Ihrem AWS-Panelsuchen Sie nach Elastischer Container Registry und klicken Sie Los geht's. Sie sehen dann den unten stehenden Bildschirm:
Wir erstellen ein privates Repository und nennen es muster-schienen-app.
Das Repository ist da, aber es ist leer. Wir wollen, dass es das Bild unserer App enthält. Dies ist der nächste Schritt.
# wirft Fehler, wenn Gemfile seit Gemfile.lock geändert wurde
RUN bundle config --global frozen 1
WORKDIR /app
COPY Gemfile Gemfile.lock ./
RUN bundle install
COPY .
CMD ["rails", "server", "-b", "0.0.0.0"]
Dann sollten wir ein Image erstellen und es in das ECR-Repository stellen.
Zuvor müssen wir die Assets mit `rails assets:precompile` vorkompilieren.
Rufen Sie nun das erstellte Repository auf. Am oberen Rand des Bildschirms sehen Sie ein Push-Befehle anzeigen mit Einzelheiten zu dieser Vorgehensweise.
In meinem Fall (Linux) führe ich es mit diesen AWS-Anweisungen aus:
Vergewissern Sie sich, dass Ihr Benutzer für diesen Vorgang zugelassen ist. Ich habe meinem Benutzer die Richtlinie AmazonElasticContainerRegistryPowerUser hinzugefügt, die wie folgt aussieht:
Ich möchte, dass die Außenwelt nur eine Verbindung zu meinem Application Load Balancer herstellen kann. Er leitet den Datenverkehr an Container weiter, die in unserem ECS-Cluster laufen.
Gehe zu EC2-Dienste -> Lastausgleich -> Lastverteiler, klicken Load Balancer erstellenauswählen Anwendungslastausgleicher und klicken Sie auf das erstellen. Taste.
Setzen Sie den Namen auf muster-schienen-app-albverwenden Sie Ihre Standard-VPC und wählen Sie alle ihre Subnetze aus.
Es bleiben uns Sicherheitsgruppen und Hörer und Weiterleitung Abschnitte.
Sicherheitsgruppen
Wir werden eine neue Sicherheitsgruppe für unseren Load Balancer erstellen. Sie funktioniert wie eine Firewall; wir legen die Regeln für eingehenden und ausgehenden Verkehr fest. Wir wollen eingehenden http-Verkehr (TCP-Port 80) akzeptieren und den gesamten ausgehenden Verkehr zulassen.
Klicken Sie dazu auf die Schaltfläche "Neue Sicherheitsgruppe erstellen" Link.
Im Abschnitt "Grundlegende Details", setzen Sie Name und Beschreibung, lassen Sie die Standard-VPC.
In meinem Fall - Name: "muster-schienen-app-alb-sg", Beschreibung: "http von außen, alles von innen"
Fügen Sie die eingehende Regel mit Typ hinzu: HTTP und Quelle: Überall-IPv4. Lassen Sie die Regeln für ausgehende Verbindungen unverändert.
Klicken Sie auf Sicherheitsgruppe erstellenGehen Sie dann zurück zur Registerkarte, auf der Sie den Application Load Balancer erstellt haben, aktualisieren Sie die Sicherheitsgruppen und fügen Sie die soeben erstellte Gruppe hinzu, während Sie die Standardgruppe entfernen.
Hörer und Weiterleitung
In diesem Abschnitt legen wir fest, wohin der Load Balancer den Datenverkehr weiterleiten soll. verlassen HörerProtokoll und Hafen als HTTP und 80, da dies genau das ist, was wir wollen, und klicken Sie auf "Zielgruppe erstellen" Link.
Setzen Sie den Namen auf "muster-schienen-app-alb-tg". Die einzige Änderung ist die Portnummer. Wir werden sie an Port 3000 übergeben, da dies der Port für unsere Rails-App ist. Ignorieren Sie den nächsten Schritt (Registrierte Ziele) und erstellen Sie die Zielgruppe.
Gehen Sie nun zurück zu der Registerkarte, auf der wir den Application Load Balancer erstellt haben, aktualisieren Sie die Zielgruppe und wählen Sie die gerade erstellte aus.
Wir haben unseren Application Load Balancer fertig, jetzt können wir mit ECS spielen.
Erstellen eines ECS-Clusters
Es gibt eine Menge beängstigender Begriffe, die Sie sehen werden - Cluster, Aufgaben, Aufgabendefinition, Dienste. Um es einfacher zu machen, stellen Sie sich den Cluster als eine Gruppe von Servern (EC2-Instanzen) vor. Auf jedem dieser Server werden Tasks ausgeführt, bei denen es sich um eine Gruppe von Containern handelt, die zusammen laufen. Die Aufgabendefinition beschreibt, welche Container zu einer bestimmten Gruppe gehören und welche Ressourcen wir ihnen zuweisen möchten (Speicher, CPU). Die Dienste behalten diese Aufgaben im Auge, um sicherzustellen, dass in unserem Cluster immer die richtige Anzahl gesunder Aufgaben läuft.
Vor diesem Hintergrund sollten wir unseren Cluster erstellen.
Gehen Sie auf die ECS-Seite und klicken Sie auf die Schaltfläche Cluster Link und Cluster erstellen Schaltfläche. Wählen Sie die " ".EC2 + Linux-Vernetzung" ein und klicken Sie Nächster Schritt.
Setzen Sie den Clusternamen auf "beispiel-schienen-app-cluster". Wählen Sie den EC2-Instance-Typ, ich habe den t2-micro-Typ gewählt, da er im Free-Tier-Tarif verfügbar ist. Belassen Sie die Anzahl der Instanzen bei 1.
Verwenden Sie im Netzwerkbereich Ihre Standard-VPC und wählen Sie alle Subnetze aus. Klicken Sie auf "Erstellen", warten Sie ein wenig und voilà, wir haben einen neuen ECS-Cluster erstellt.
Definition der Aufgabe
Klicken Sie auf das Aufgaben-Definitionen Link, dann Neue Aufgabendefinition erstellen Schaltfläche. Wählen Sie die EC2 Option und klicken Sie auf Nächster Schritt. Die Anwendung, die wir ausführen werden, ist sehr einfach, so dass wir hier nur ein paar Optionen benötigen.
Einstellung Definition der Aufgabe Name zu "beispiel-schienen-app", dann gehen Sie direkt zum Container-Definitionen Abschnitt und klicken Sie auf "Behälter hinzufügen". Benennen Sie den Container als "beispiel-schienen-app", und legen Sie den Speicherort des Bildes im Format "repository-url/image:tag". Gehen Sie in der neuen Browser-Registerkarte zum ECR, um den Bild-URI zu kopieren. In meinem Fall war es: "212516879399.dkr.ecr.eu-central-1.amazonaws.com/sample-rails-app:latest".
Setzen Sie Ihr Speicherlimit auf die empfohlenen 300-500MiB. Und nun das Schwierigste: Port Mapping.
Unsere Anwendung läuft innerhalb eines Containers auf Port 3000. Geben Sie also 3000 als Container-Port ein. Als Host-Port geben wir 0 ein, was im Grunde bedeutet, dass ein zufälliger Port gewählt wird. Glücklicherweise kennt unser Application Load Balancer diese Port-Zuordnung und kann den Datenverkehr korrekt umleiten. Wir können sogar mehrere Aufgaben auf dieser einen Instanz laufen lassen.
Fügen Sie die Umgebungsvariable RAILS_ENV und setzen es auf Produktion.
Jetzt klicken hinzufügen um unsere Containerdefinition hinzuzufügen und klicken Sie auf erstellen. um die Einrichtung der Aufgabendefinition zu beenden.
Dienst
Wir haben unseren Cluster, den Load Balancer und die Aufgabendefinition. Nun müssen wir diese Aufgaben irgendwie innerhalb unseres Clusters ausführen. Dies ist die Aufgabe der Dienste. Gehen Sie zu dem neu erstellten Cluster, wählen Sie die Dienstleistungen und klicken Sie auf die Registerkarte erstellen. Taste.
Setzen Sie den Starttyp auf EC2, fügen Sie den Namen "beispiel-schienen-app-service". Setzen Sie die Anzahl der Aufgaben auf 1 und klicken Sie auf Nächster Schritt. Wählen Sie auf dieser Seite das Optionsfeld "Application Load Balancer" und wählen Sie die vorhandene IAM-Rolle dafür aus. Im Abschnitt "Container to load balance" sollten Sie bereits einen korrekten Container "sample-rails-app:0:3000" eingegeben haben, dann klicken Sie auf "Add to load balancer".
Für "Production listener port" wählen Sie 80:HTTP; als Zielgruppenname verwenden Sie den Namen, den wir zuvor erstellt haben - "muster-schienen-app-alb-tg" und klicken Sie Nächster Schritt. Lassen Sie Automatische Skalierung Optionen so wie sie sind, klicken Sie auf Nächster Schritt und Dienst erstellen.
Aktualisieren Sie die ECS-Sicherheitsgruppe
Sie können die Seite für die Erstellung von Clustern aufrufen und die Aufgaben Auf den Registerkarten sollte eine Aufgabe laufen. Der Dienst hat sie gestartet. Gehen Sie nun zur EC2-Service-Seite, klicken Sie auf Load Balancers und sehen Sie sich die Details unseres Application Load Balancers an. Sie sollten dort seinen DNS-Namen sehen. Kopieren Sie ihn und öffnen Sie ihn im Browser. Er sollte Sie zu unserer Anwendung führen. Leider erhalten wir die Meldung "504 Zeitüberschreitung des GatewaysFehler".
Das Problem liegt in der Sicherheitsgruppe unseres Clusters. Ihre eingehenden Regeln lassen den vom Load Balancer eingehenden Verkehr nicht zu. Um das Problem zu beheben, gehen Sie zurück zum EC2-Panel und klicken Sie auf die Schaltfläche Sicherheitsgruppen Link. Es gibt eine neue Gruppe, die bei der Erstellung des Clusters erstellt wurde. Sie sollte einen Namen haben, der mit "EC2ContainerService-Beispiel-schienen-anwendung-cluster". Klicken Sie darauf und bearbeiten Sie die eingehenden Regeln. Da wir jeglichen Datenverkehr von unserer VPC zulassen wollen, gehen Sie zum Amazon VPC-Panel und überprüfen Sie, wie Ihre VPC IPv4 CIDR lautet. Setzen Sie den Regeltyp auf "Gesamter Verkehr" und die Quelle auf IPv4 CIDR. Speichern Sie diese Regel und versuchen Sie, den DNS-Namen des Balancers zu laden.