Amazon EC2 Node.js und Chat installieren

Amazon EC2 Node.js und Chat installieren

Nachdem ich im letzten Beitrag das Erstellen einer Instanz in der Amazon EC2 – also der Amazon Elastic Compute Cloud – näher beschrieben habe, will ich nun zeigen, wie man sich mit dieser Instanz verbinden und anschließend Node.js installieren kann.

Als Praxisbeispiel dafür dient der eXperinox Chat, der aktuell auf einem virtuellen Server läuft. Am Ende dieses Artikels soll der Chat in der Cloud laufen.

Verbindung mit der Linux Instanz herstellen

Nachdem die Instanz in der Cloud läuft, können wir eine Verbindung zu dieser herstellen.

Putty & PuttyGen

Wer wie ich Windows benutzt, kann unter anderem Putty verwenden, um eine Verbindung zur Instanz herzustellen. Amazon selbst bietet eine sehr gute Beschreibung, wie man anhand des Key-Files, welches man zum Start der Instanz erzeugt und heruntergeladen hat, sich mit Putty zu einer laufenden Instanz verbinden kann.

Hier deshalb nur kurz in Stichworten:

  • anhand von PuttyGen einen Key erzeugen, welcher mit Putty verwendet werden kann
  • Putty aufrufen und unter Session / Host Name ec2-user@dein-public-dns-name eingeben (der Teil hinter dem @ ist der Public DNS wie bei der laufenden Instanz angegeben)
  • Verbindungstyp SSH, Port 22
  • Connection / SSH / Auth / „private key file for authentication“
    von PuttyGen generiertes PPK File laden und Open klicken
  • Wenn man in PuttyGen eine PassPhrase angegeben hat, diese nun eingeben

Wir sind drin!

Nach dem Einloggen bekommt man eventuell zuerst eine Meldung, dass Updates notwendig sind.

Diese mit

sudo yum update

installieren.

Wir haben nun also ein lauffähiges Linux System auf dem neuesten Stand und können damit beginnen, Anwendungen und eigene Applikationen aufzusetzen.

Installation von Node.js

Nachdem ich bisher in Sachen Linux eher der Sparte „n00b“ – also den Anfängern angehöre – suche ich zuerst nach einer entsprechenden Anleitung zur Installation von Node.js in Amazon EC2 und werde auch prompt fündig.

Kurz zusammengefasst, was in dieser Anleitung zu finden ist:

Der yum Package Manager enthält kein node Repository, weshalb wir Node.js selber basteln müssen. Dazu benötigen wir die entsprechenden Tools und holen uns danach die node-Sourcen direkt aus dem Git-Repository, um es in weiterer Folge kompilieren zu können.

sudo yum install gcc-c++ make
sudo yum install openssl-devel
sudo yum install git

git clone git://github.com/nodejs/node.git
cd node

An dieser Stelle müssen wir entscheiden, welche node Version die aktuelle Version ist bzw. welche wir verwenden wollen. Das Kompilieren dauert dann etwas (ca. 10-15 Minuten).

git checkout v4.4.0
./configure
make
sudo make install

Damit haben wir node.js nun in unserer Instanz fertig installiert und sollten es damit verwenden können.

Node Package Manager

Um Zusatz-Packages für Node installieren zu können, benötigt man den Node Package Manager.

Zuerst muss man die Pfad-Variable anpassen. Achtung – im verlinkten Artikel wird sudoers auf eine nicht empfohlene Art und Weise editiert. Empfohlen ist die Verwendung von visudo. Damit wird verhindert, dass man sich durch Fehleingaben das System abschießt.

sudo visudo

Zeile secure_path suchen und :/usr/local/bin anhängen.

Defaults    secure_path = /sbin:/bin:/usr/sbin:/usr/bin:/usr/local/bin

Package Manager installieren:

git clone https://github.com/isaacs/npm.git
cd npm
sudo make install

Hello World für einen Basistest

Um unsere Installation zu testen, wollen wir das Altbekannte „Hello World!“ in node.js implementieren.

Express ist ein node.js Framework für Webanwendungen, welches viele Dinge für Webanwendungen vereinfacht.

package.json
{
   "name": "sample",
   "version": "0.0.1",
   "dependencies": {
     "express": "^4.12.3"
   }
 }

Mit

npm install

wird express nun installiert.

Wer den NPM (Node Package Manager) nicht kennt: einfach ausgedrückt definiert man über package.json sämtlich Module, die die eigene Anwendung benötigt und der NPM macht es sehr einfach, all diese Module zu installieren bzw. auf Stand zu halten.

Die Applikation sieht dann wie folgt aus:

app.js
var express = require("express");
var app = express();
app.get("/",function(req,res){
         res.send("<h1>Hello from the gutter!</h1>");
 }
);

app.listen(80);

Dann app.js starten:

sudo node app.js

… und voila: wenn wir die Public DNS im Webbrowser ansurfen, sehen wir den Text „Hello from the gutter!“ am Schirm.

Der eXperinox Chat in der Cloud

Nachdem nun also Node.js einwandfrei läuft, geht es nun daran, den eXperinox Chat zum Laufen zu bringen. Grundsätzlich ist unser Chat ja nicht anderes, als eine simple Node.js Applikation. Trotzdem gibt es das ein oder andere, was in diesem Zusammenhang noch erwähnenswert ist.

File Upload

Die Chat-Applikation wollen wir einfach in die Cloud uploaden können. Das Tool, welches sich hier anbietet, ist FileZilla.

FileZilla gibt es für Linux, Windows und Mac und es beherrscht auch Secure FTP. Um mit FileZilla Dateien in die Cloud transferieren zu können, definiert man zuerst in den Einstellungen eine SFTP Verbindung in die Cloud.

Einstellungen -> Verbindung -> SFTP -> Schüsseldatei hinzufügen
Das *.pem File auswählen, welches man beim Erstellen der Instanz heruntergeladen hat und Ok klicken.

ServerManager starten und dort „Neuer Server“ anklicken.

Unter Server dann die Public DNS der Instanz eintragen, als Protokoll SFTP auswählen. Verbindungsart „Normal“ und als Benutzer ec2-user eintragen. Kein Passwort angeben und „Verbinden“ anklicken. Man sollte nun eine Verbindung in die Cloud haben und kann nun die entsprechenden Files übertragen.

Im Falle unseres Chats, der ja wie schon erwähnt Node.js verwendet, erstelle ich zuerst ein eigenes Verzeichnis und lade mit FileZilla package.json hoch. Dann mit Putty verbinden, ins Verzeichnis chat wechseln und

npm install

ausführen. Damit werden die von unserem Chat verwendeten Module installiert.

Dann unsere Chat-Files hochladen.

Security-Group

Unser Chat wird über einen anderen Port angesprochen, als es eine normale Webseite tut (Port 80). Grund: auf dem aktuellen Chat-Server ist Port 80 bereits durch Apache belegt. Deshalb müssen wir das in der Security Group entsprechend anpassen.

Das geht wirklich sehr einfach, indem man die „Inbound Rules“ entsprechend anpasst. Entweder man geht über das Hauptmenü (Network & Security / Security Groups) dort hin oder man klickt bei der Liste der laufenden Instanzen diese an und navigiert dann über den entsprechenden Link bei der Beschreibung unter Security Groups dort hin.

Node.js Anwendung in der Cloud laufen lassen

Nun kann ich den Chat starten. Grundsätzlich scheint er zu funktionieren, aber die Verbindung wird immer wieder abgebrochen, sobald ich Putty beende.

Der eXperinox Chat läuft in der Cloud
Der eXperinox Chat läuft in der Cloud

Damit eine Node.js Anwendung nicht beendet wird, sobald man die Terminal Verbindung beendet, muss man noch einen weiteren Schritt unternehmen.

Es gibt verschiedene Tools, die es ermöglichen, einen Prozess selbst nach Beenden einer Terminal-Verbindung weiter laufen zu lassen. Eines dieser Tools ist forever. Ich für meinen Teil kann mich glücklich schätzen, weil Iwan aka shlainn forver schon in den Dependencies eingetragen hat. Aus diesem Grund ist forever in meiner Linux-Instanz schon installiert.

Man muss den Chat nun nur noch über forever starten und schon läuft er weiter, wenn ich Putty beende.

forever start apps.js

Eigenes AMI speichern

Amazon EC2 ermöglicht es, von einer laufenden Instanz anhand von „Create Image“ ein AMI zu generieren. Damit ist es möglich, auf Basis eines vorhandenen Images, wie dem „nackten“ Amazon Linux als Basis, entsprechende Applikationen zu installieren und daraus am Ende ein eigenes AMI zu erstellen.

Dieses AMI kann man dann in weiterer Folge dazu verwenden, um weitere Instanzen daraus zu erstellen. So können wir unsere für den Chat fertig konfigurierte Maschine speichern.

Achtung: ein gespeichertes AMI verursacht Kosten! Das Erstellen eines eigenen AMI kostet zwar nichts, aber das AMI benötigt entsprechend zusätzlichen Speicherplatz. Und dieser verursacht am Ende Kosten.

Es wird auch empfohlen, die Instanz zu stoppen. Dabei ist zu beachten, dass die Instanz nach einem Neustart eine neue Public DNS bekommt.

Am Ende sei noch auf den Blog-Artikel von Iwan verwiesen, der die Funktionsweise unseres Chats im Detail beschreibt.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.