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

Webserver-Umgebung

Erstelle eine neue Datei application.d mit folgendem Inhalt:

/+ dub.sdl:
	name "application"
	dependency "vibe-d" version="~>0.8.4"
	dependency "vibe-d:tls" version="*"
	subConfiguration "vibe-d:tls" "none"
+/

import vibe.vibe;

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 Beanstalk erwartet eine unter Linux ausführbare Datei. Seit Windows 10 gibt es die Möglichkeit, innerhalb von Windows ein Ubuntu Linux System auszuführen. Starte eine Windows Kommandozeile in dem Verzeichnis, in welchem sich die Datei application.d befindet und gib folgenden Befehl ein.

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

Eine ausführbare Datei mit dem Namen application wurde erstellt. Erstelle zusätzlich 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ühre diesen Befehl aus um deine Applikation und den neuen Ordner in eine Zip Datei zu packen:

wsl zip -r app.zip ./application ./.ebextensions/*

Auf AWS 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="~>2.1.2"
	versions "embedded_httpd"
+/

import arsd.cgi;

mixin CustomCgiMainImpl!(Cgi, handle, defaultMaxContentLength) customCgiMainImpl_;

void main() 
{
	customCgiMainImpl_.cgiMainImpl(["--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 Beanstalk Anwendung muss die Applikation wieder unter Linux kompiliert werden und in eine Zip Datei gepackt werden.