Das Python-Skript in Listing 5 fungiert als Wrapper um das Binary »montage«, dem im Verzeichnis »lib« eine Reihe von Shared Libraries beiliegt, damit das dynamisch gelinkte Binary im Container läuft. Die Umgebungsvariable »LD_LIBRARY_PATH« setzt den Suchpfad für Shared Libs auf dieses nicht standardisierte Verzeichnis, damit das Binary diese zur Laufzeit auch findet.
Listing 5
montage.py
1 #!/usr/bin/python 2 import sys 3 import os 4 import subprocess 5 6 os.environ["LD_LIBRARY_PATH"] = "lib" 7 8 print subprocess.check_output( 9 [ "bin/montage" ] + sys.argv[1:])
Abbildung 4 zeigt die mit Listing 6 gesammelten Shared Libs. Offensichtlich zieht das mit Open-CV gelinkte AI-Programm zur Bewegungsanalyse einen Rattenschwanz an Bibliotheken mit sich. Hinter einem Video steckt eben geballte Kompressionstechnik, die es zu dekodieren gilt, will man an die rohen Frame-Daten heran.
Listing 6
ldd-ls.py
01 #!/usr/bin/python
02 import subprocess;
03 import sys;
04
05 if len(sys.argv) != 2:
06 print("usage: {} file".format(sys.argv[0]))
07 sys.exit(1)
08
09 file = sys.argv[1]
10
11 output = subprocess.check_output(['ldd',file])
12 for line in output.split("\n"):
13 words = line.split()
14 if len(words) > 3:
15 print words[2]
Sicher abgelegt
Ist der Kontaktabzug »montage.jpg« erstellt, kopiert der Code ab Zeile 28 in Listing 2 die Datei aus dem temporären Verzeichnis in einen vorher angelegten S3-Bucket auf Amazons Cloud-Storage-System. Das Python-Modul »boto3« steht auf Lambda-Servern standardmäßig zur Verfügung und bietet allerlei Tools zur Kommunikation mit verwandten Service-Angeboten.
Die Methode »put_object()« in Zeile 32 legt die von der virtuellen Festplatte gelesene Ausgabedatei als Objekt vom Typ »image/jpeg« im Cloudspeicher ab. Von dort liefert sie der in der vorigen Ausgabe besprochene S3-Webserver an den interessierten User aus, dem der API-Aufruf nach Abschluss die zugehörige URL gesteckt hat. Damit dieser sie findet, stellt Zeile 36 eine Json-Antwort zusammen, die dem Webclient die zur Montage-Datei gehörige S3-URL mitteilt. In Zeile 41 bleibt nur noch, das temporär angelegte Verzeichnis zu löschen.
Damit das Lambda-Skript Schreibrechte an dem als »snapshot.linux-magazin.de« konfigurierten S3-Bucket erhält, muss der User Letzterem entsprechende Rechte verleihen. Abbildung 5 zeigt, dass der S3-Bucket jedem ausgewiesenen AWS-User Zugriff gewährt. Auf der anderen Seite müssen vom Lambda-Server im S3-Bucket erzeugte Dateien auch weltweit für interessierte User lesbar sein. Dies erfolgt über eine so genannte Bucket-Policy, deren Inhalt Listing 7 zeigt. Jede dort neu eingelegte Datei ist demnach für alle lesbar, also kann der am S3-Bucket hängende Webserver sie auch an anfragende Webclients ausliefern.
Listing 7
bucket-policy.json
01 {
02 "Version": "2012-10-17",
03 "Statement": [
04 {
05 "Sid": "",
06 "Effect": "Allow",
07 "Principal": "*",
08 "Action": "s3:GetObject",
09 "Resource": "arn:aws:s3:::snapshot.linux-magazin.de/*"
10 }
11 ]
12 }
Tor zur Welt
Amazon hilft beim Testen von Lambda-Funktionen, der Entwickler kann hochgeladene Skripte entweder durch das Kommandozeilen-Utilty »aws« oder auch den Test-Button der Konsole im Browser ausführen. Aber schließlich sollen User die Funktion aus dem Internet ausführen können, und dazu bietet sich Amazons API-Gateway an. Dieser ebenfalls auf der Konsole anklickbare Service legt einen Cloud-Webserver mit einem REST-API an, dessen Methoden (wie im gezeigten Beispiel »/vimo«) es neben anderen Optionen auf User-definierte Lambda-Funktionen umleitet.
Die Verbindung zwischen Webserver und Applikation auf dem Lambda-Service erledigt AWS hinter den Kulissen, wenn der User für die Option »Integration Type« beim Anlegen der REST-Methode (zum Beispiel »GET« oder »POST«) die Option »Lambda Function« angibt und weiter unten die Region des Datencenters und den Namen der Lambda-Funktion (etwa »vimo«) nennt (Abbildung 6).
In unserem Fall soll der Pfad »/vimo« die »POST«-Methode verwenden und im Body des Request einen Json-Blob mit benamten Parametern (etwa »movie_url«) führen. Setzt der Webclient wie in Abbildung 1 sichtbar den Header »Content-Type« auf »application/json«, dann fängt bereits das API-Gateway den Json-Blob ab und analysiert ihn.






