Ausführen einer Git-Binärdatei in AWS Lambda
In manchen Szenarien kann es einfacher sein, eine Binärdatei in einer Lambda-Funktion zu verwenden. In diesem Blogbeitrag zeige ich Ihnen, wie Sie eine Git-Binärdatei in einem AWS Lambda ausführen können.
Für diesen Blogbeitrag werde ich das AWS Serverless Application Model(AWS SAM) verwenden. AWS SAM macht es einfach, Lambda-Funktionen zu erstellen, zu verpacken und bereitzustellen. Die verwendete Vorlage finden Sie auf .aws-sam/build/<ResourceName>. Dieser Ordner wird komprimiert und in Amazon S3 hochgeladen, wenn Sie die Vorlage verpacken und bereitstellen.
Sie können die Funktion auch auf Ihrem eigenen Computer aufrufen. Das erleichtert die Entwicklung und Fehlerbehebung. Um die Funktion aufzurufen, müssen wir sie zunächst erstellen. Danach müssen Sie sie aufrufen. Ich habe ein Makefile erstellt. Weitere Informationen dazu finden Sie in einem meiner früheren Blogs.
make invoke
Sie werden sehen, dass Sie den folgenden Fehler sehen werden:
{
"errorMessage": "[Errno 2] No such file or directory: 'git'",
"errorType": "FileNotFoundError"
}
Und das macht doch Sinn, oder? Wir haben den Git-Client nicht installiert. Sie können ihn nicht über die Datei requirements.txt installieren. Das liegt daran, dass er nicht im PyPi-Paketmanager enthalten ist.
Installieren Sie den Git-Client
Wenn Sie sich das Makefile ansehen, können Sie sehen, dass es das tut:
- Erstellen Sie einen Docker-Container.
- Installieren Sie git auf dem Container.
- Verschieben Sie alle Abhängigkeiten in die Struktur
/var/task. - Zipen Sie den Inhalt des Ordners
/var/task.
- Entpacken Sie die Zip-Datei aus dem Container.
- Entpacken Sie den Inhalt in den Ordner
git_client. sam buildkopiert den Inhalt nach.aws-sam/build/GitClient.sam buildinstalliert die Abhängigkeiten aus derrequirements.txt.sam invokeverwendet den Inhalt von.aws-sam/build/GitClient, um die Funktion aufzurufen.
Die Git-Binärdatei befindet sich in /var/task/bin. Denn wenn wir den Git-Befehl aufrufen, geben wir auch /var/task/bin als PATH an. Dadurch können wir /var/task/lib. Da wir LD_LIBRARY_PATH auf /var/task/lib gesetzt haben, können die Bibliotheken gefunden werden.
Ich habe eine Dockerdatei erstellt, die public.ecr.aws/lambda/python:3.8 als Basis verwendet. Dies ist die gleiche Laufzeit der Lambda-Funktion. Ich bereite 2 Ordner /var/task/bin und /var/task/lib vor. Dann installiere ich die Pakete git und zip innerhalb des Docker-Kontexts.
Dann kopiere ich die ausführbaren Dateien /usr/bin/git und /usr/libexec/git-core/git-remote-http in den Ordner /var/task/bin.
Wenn Sie versuchen, die Lambda-Funktion zu erstellen und auszuführen, schlägt sie wegen einer fehlenden Bibliothek fehl.
{
"errorMessage": "git: error while loading shared libraries: libpcre2-8.so.0: cannot open shared object file: No such file or directory",
"errorType": "Exception"
}
Mit dem Befehl ldd können Sie alle gemeinsam genutzten Bibliotheken finden. Wir werden dies nutzen, um die benötigten Bibliotheken zu identifizieren und sie in den Ordner /var/task/lib/ zu kopieren.
Sobald Sie alle Abhängigkeiten eingerichtet haben. Sie können die git --version abrufen, die innerhalb der Lambda-Funktion ausgeführt wird.
Git Version: git Version 2.32.0
Wenn Sie dies mit den Paketen awscli und git-remote-codecommit kombinieren. Sie können ein CodeCommit-Repository klonen, Ihre Aktionen durchführen und es erneut committen.
Fazit
Es ist möglich, Binärdateien in AWS Lambda einzubetten und sie zu verwenden. Es mag Sie einige Mühe kosten. Aber es eröffnet Ihnen neue Möglichkeiten, die Sie vorher vielleicht nicht in Betracht gezogen haben.
In meinem nächsten Blog werden Sie lesen, wie Sie damit zwei CodeCommit-Repositories synchronisieren können.
Foto von Emile Perron auf Unsplash
Verfasst von

Joris Conijn
Joris is the AWS Practise CTO of the Xebia Cloud service line and has been working with the AWS cloud since 2009 and focussing on building event-driven architectures. While working with the cloud from (almost) the start, he has seen most of the services being launched. Joris strongly believes in automation and infrastructure as code and is open to learning new things and experimenting with them because that is the way to learn and grow.
Unsere Ideen
Weitere Blogs
Contact




