AWS NAT Gateway Timeout behaviour

In the last weeks I worked a lot with java netty sockets and run in half-open TCP connections. This mean the connection is only open on the client site but the server closed the connection.

I could not reproduce the issue in my local environment, refactor on the application source didn’t help me and so I burned down a lot of hours to get a stable connection to the socket server without success.

After a while we go down to TCP Level to get more information what happened.

The environment with this issue was on AWS in a private network with a NAT gateway.

The Socket Server send a connection timeout after 15 seconds with a TCP-FIN. This goes throw the AWS NAT-gateway and send a TCP-RST to the application server. In this case the application server believes the connection is established, but it isn’t.

It could be fixed with change the NAT Gateway to a NAT Instance on AWS which will send also the TCP-FIN or add the application server connected directly to the public network.

Add the end there was also some other issues with the NAT Gateway and long-time timeouts on Web-Socket level.

Some Links for more Information are here:

“Timeout behavior: When a connection times out, a NAT gateway returns an RST packet to any resources behind the NAT gateway that attempt to continue the connection (it does not send a FIN packet).”

Netty Github issue discussion

Half-open Connection on wikipedia

AWS Mail Server.

Zum verrückt werden …

Ich hab auf einer EC2 Instance einen Mailserver aufgesetzt der sich um die Emails der gerösteten Domains kümmern soll.

Dann Postfix und Dovecod konfiguriert. Das ist ja eigentlich recht simpel und schnell gemacht. Aber die Betonung liegt auf eigentlich. Nach ein paar Stunden Gefummel lief dann alles. Getestet hab ich dann in Outlook Email abrufen versenden Fehler frei.
Okay noch eine testmail an mein Google Account.   (Stellt euch den Sound von Zonk vor).

Relay Fehler… narf wtf!!!

Okay nach Stunden länger suche und etlichen Thread rund um das Thema sowie versuche gelesenes zu verwenden, die aber mit meinem Problem nichts zu tun hatten.. zumindest weiß ich das jetzt.

Das Problem ist der Reverse DNS Eintrag. Dieser muss bei Amazon extra beantragt werden. Solang dieser fehlt können keine E-Mails versendet werden.

Großes Kino

Backups wtf …

Eigentlich bin ich sehr sorgfältig mit Backups, eigentlich …

Langzeit Daten speichere Ich auf Amazon S3, Alles an Dokumente und Excel landen in Google Drive ebenso alle Bilder. Programmcode liegt auf GIT oder BitBucket und in meiner Dropbox… und dann das.

Nach gut 3 Jahren benötige ich tatsächlich wieder mein PHP Framework. Kein Ding ist ja alles gesichert … denkste.

Mein 500GB Development Festplatte ist altersbedingt in die Knie gegangen, kein Problem neue rein Code der benötigt wird auschecken und weiter gehts. In den letzten 3 Jahren hab ich mich hauptsächlich mit Coldfusion, Java, C# und SQF C++. So das meine PHP Webprojekte weiterhin in dem unendlichen Wolkenspeicher liegen. Also hab ich mir die Tage meinen Kram gezogen und ein wenig in alten Projekten geschwelgt. Ziel war es mein Framework was ich 2007 angefangen habe zu schreiben, wieder zu verwenden. Bis hier war ich mir sicher das alles in den Backups liegt. Hier sind auch einige Projekte hinterlegt. Mein Clan Content Management System aus dem Jahr 2000. World of eSport von 2005 und einiges an nie fertig gewordene Projekte. Aber kein Framework…

Tatsächlich liegt der Code weder bei Git noch Bitbucket. Auch in den Cloud Speichern ist nichts zu finden. Eine Wiederherstellung der Daten von der HDD ist auch nicht mehr möglich da diese bereits Sachgemäß entsorgt wurde.

Leider ist auch das letzte DVD Backup schon veraltet, 2009 steht auf der Scheibe.

Moral von der Geschichte: Wer seine Daten nicht ordentlich Backupt hat Pech gehabt.

Bis dahin Happy Backup Dude

Docker und Amazon Container Service

Ein Wochenende voller WTF ist vorbei. Themen des Wochenendes waren Dicker, AWS und die blaue Wolke (Cloud) .

Zuerst hab ich viel Zeit verbracht mich intensiver mit Docker zu beschäftigen. Zu allererst Docker Registry: Man logt sich mit Hilfe des Befehls „docker login“ ein und kann nun seine Container ins docker hub schieben. Dazu benutzt man den Befehl „docker push myApp“. Und tada das repository wurde auf docker hub angelegt. Jetzt liegen dort als … Was genau.. die lokal gebauten Container. Blöd nur das zum Beispiel mein railo Container der eine Webseite birgt den Source Code von meinem lokalen Windows Platte gezogen hat. Dieser fehlt nun. Also kein Source Code im Container.

Was nun?

Lesen Lesen Lesen Lesen Lesen wtf Lesen Lesen ahhhh :

Automatisches build repository mit github. Fast schon perfekt. also auf github den Source Code des docker container gepushed. Siehe da alle Infos sind im docker hub inklusive der dockerfile. Was fehlt jetzt immer noch der Source Code. 2 Optionen habe ich nun ohne groß zu Überlegen. Entweder den Code mit in das repository … Pfui … Ein eigenes Repository. Besser, also Code pushen docker File anpassen docker pushen. Start build. Sehr gut so geht’s.

Aber nicht das was mir vorschwebte. Am Rande, ich hab es auch bis jetzt noch nicht erreicht. Ich möchte die Container in AWS laufen lassen über den ACS. Mein Quellcode soll nicht in einem public Repro liegen. Dockerfiles auch nicht. Also Setup für ein Closed Projekt.

Ein weiterer Test den ich gemacht habe war das Docker File aus dem automatmischen repository zu ziehen und den Code als Zipfile von aws S3. Zugriff des S3 nur auf aws Ebene. Wtf build fehlgeschlagen… wtf wo findet der build statt? Etwa Auf docker? -.-

Also nächstes Ziel vielleicht ec2 instance fürs docker. s3 als docker register Speicher. Privates repro des Codes auf github mit public key der ec2.

Die nächsten Tage werde ich wohl hier noch am richtigen Entwurf arbeiten. Sobald das passt geht’s an die API. Wer will schon immer klicken.

Trotzdem Erfolge.

Der Spass darf natürlich nicht fehlen. Also habe ich die ACS mit minecraft getestet. Docker gebaut gepushed eingetragen und tada. Erstmal je Runde daddeln. Config anpassen bungecore dazu packen und 10 Server anschmeißen. Gut 10 laufen manuelles anpassen der ips etc… Ne danke morgen vielleicht 🙂 aber nun kann ich auf 10 Servern zocken.

WTF

Railo & Amazon EC2 Instanzen

Vor einiger Zeit habe ich mich mit der „on the Fly installation“ von Railo auf einer Amazon EC2 instanze beschäftigt. Dabei habe ich viele Ansätze für ein einfaches Setup gefunden, leider entsprach nichts davon meinen Vorstellungen.

Bei meinen Recherchen bemerkte ich, dass man einfach ein shell Script als UserData übergeben kann… endlose Möglichkeiten tun sich da auf.

Dabei bin ich auch über das railo_ec2 shell Script von @Amaroom gestolpert. Da die Version ein etwas altes Railo Paket installiert habe ich das Script kurzerhand geforkt und aktualisiert. Zu finden ist das ganze auf Github.com

Auch wenn sich das Script von selbst erklärt vielleicht ein paar Kommentare:

Der erste Befehl führt ein upgrade aus, so das die aws Linux Version auf dem neusten Stand gebracht wird.

Anschließend wird tomcat7 und git installiert und tomcat in den „autostart“ gepackt.

Nun wird das aktuelle Railo mit Curl gezogen und in den vorbereiteten Ordner verschoben und mit den Tomcat user und der Tomcat Gruppe versehen.

ab Zeile 43 wird ein wenig die Tomcat catalina config geändert. Hier werden der Pfad zu Railo gesetzt sowie mapping und welcome file definiert.

Zum Abschluss wird noch, zu demozwecken, eine index.cfm angelegt und tomcat gestartet.

Ab hier hat man nun frei Hand. Anstelle der index.cfm kann nun mit git clone ein Repositorie gezogen werden und in den webapps/ROOT ordner gelegt werden.
Ein Beispiel wäre:

git clone https://github.com/TiagoReis-Webdevit/demoCMS.git  /usr/share/tomcat7/webapps/ROOT

chown -R tomcat.tomcat /usr/share/tomcat7/webapps/ROOT/

um das TiagoReis demoCMS zu installieren.

Um sich den Ärger mit nicht gesetzten Passwörtern im Web-Admin zu ersparen kann eine entsprechend vorkonfigurierte railo-web.xml.cfm in den Ordner /usr/share/tomcat7/webapps/ROOT/WEB-INF/railo/ geladen werden.

Alternative und von mir bevorzugt kann auch eine server.xml, in der Serverpasswort und defaul web admin Passwort bereits gesetzt sind, in das Verzeichnis /usr/share/tomcat7/railo4/railo-server/context/ kopiert werden.
Vor dem ersten Aufruf des Railo Admins existiert dieser Ordner nicht und muss entsprechen mit mkdir angelegt werden.

Dort können auch Datenbanken und Mail Server installiert werden. Natürlich bietet sich hier auch die Nutzung der aws Dienste an. Ein awsWrapper ist hier zu finden, der ist etwas verbugt aber anpassbar. Ansonsten schreibe ich grad einen Wrapper der hier zu finden ist.

Und schon können x Passwort gesicherte Railo Instanzen mit einem Git Projekt gestartet werden. Um ein Update der Application auf die Server zu spielen braucht man nur noch alles ins git zu pushen und die neue Instanzen des alten Servers starten, nicht vergessen die alten zu terminieren. Mit einer AutoScalling Group benötigt man nur noch die terminierung der Instanzen.