Native AWS Elastic Beanstalk Applikationen

Es gibt 2 Möglichkeiten in D geschriebene Anwendungen auf AWS Elastic Beanstalk zu verwenden. Eine Möglichkeit ist die D Anwendung als Docker Container in Elastic Beanstalk auszuführen. Die zweite Möglichkeit ist als Platform Go anzugeben und die D Anwendung innerhalb eines ZIP Archivs an Elastic Beanstalk zu übergeben. Dieses Tutorial beschreibt die Verwendung der Go Platform.

Voraussetzung für dieses Tutorial ist die Installation von LDC auf WSL.

Webserver-Umgebung

Erstelle eine neue Datei application.d mit folgendem Inhalt:

/+ dub.sdl:
    name "application"
    dependency "vibe-d:http" version="0.8.6-alpha.2"
    dependency "vibe-d:tls" version="*"
    subConfiguration "vibe-d:tls" "notls"
+/

import vibe.core.core : runApplication;
import vibe.http.server;

void main() {
    listenHTTP(":5000", &handleRequest);
    runApplication();
}

void handleRequest(HTTPServerRequest req, HTTPServerResponse res)
{
    if (req.path == "/")
        res.writeBody("Hello, World!");
}

Mit Hilfe von vibe.d wird ein HTTP Server auf dem Port 5000 gestartet. AWS Elastic Beanstalk erwartet eine unter Linux ausführbare Datei. Starte eine Windows Kommandozeile und gib folgenden Befehl ein.

wsl dub build --single application.d -b plain

Eine unter Linux ausführbare Datei mit dem Namen application wurde erstellt. Führe diesen Befehl aus um deine Applikation in eine Zip Datei zu packen:

wsl zip -r app.zip ./application

Dadurch dass das Linux Tool zip verwendet wird, behält die Datei application auch die Information, dass es sich um eine ausführbare Datei handelt.

Auf AWS Elastic Beanstalk kannst du nun eine neue Webserver-Umgebung anlegen, als Platform Go wählen und die Datei app.zip auswählen.

Worker-Umgebung

AWS gibt in seiner aktuellen Dokumentation an, dass SQS Nachrichten als HTTP requests an Port 80 der Server Anwendungen geschickt werden. Für die Go Platform ist das nicht korrekt. Hier muss die Server Anwendung, wie auch bei der Webserver-Umgebung, auf Port 5000 eingestellt sein.

In diesem Beispiel benutze ich die HTTP Server Komponente arsd-official:cgi.

/+ dub.sdl:
    name "application"
    dependency "arsd-official:cgi" version="4.0.1"
    subConfiguration "arsd-official:cgi" "embedded_httpd"
+/

import arsd.cgi;

void main() 
{
    cgiMainImpl!(handle, Cgi, defaultMaxContentLength)(["--port", "5000"]);
}

void handle(Cgi cgi)
{
    if (cgi.requestMethod == cgi.RequestMethod.POST && cgi.requestUri == "/")
    {
        string json = cgi.postJson;
        cgi.setResponseStatus("200 OK");
    }
    else cgi.setResponseStatus("404 File Not Found");
}

Auch hier wird wieder ein HTTP Server auf Port 5000 gestartet. Den Inhalt der SQS Message wird in der Variable json gespeichert und kann weiter ausgewertet werden.

Genauso wie bei der Webserver Elastic Beanstalk Anwendung muss die Applikation wieder unter Linux kompiliert und in eine Zip Datei gepackt werden.

.ebextensions

Über Konfigurationsdateien in einem Ordner .ebextensions können Startparameter für die AWS Elastic Beanstalk Applikation gesetzt werden.

Falls z.B. die Anwendung unter Windows in ein Zip Archiv gepackt wurde, geht das Executable Kennzeichen verloren. Dieses Kennzeichen kann nachträglich wieder gesetzt werden, wie im folgenden Beispiel beschrieben.

Erstelle einen Ordner mit dem Namen .ebextensions und eine Datei set_perms.config innerhalb dieses Ordners mit folgendem Inhalt:

container_commands:
  set_perms:
    command: "chmod 777 application"

Füge den Ordner .ebextensions dem Zip Archiv hinzu.