2016-05-17 6 views
9

Ich versuche, Git in AWS Lambda ausführen, um ein Auschecken eines Repository zu machen.Ausführen von 'Git' in AWS Lambda

Dies ist mein Setup:

  • ich verwende NodeJS 4.3
  • Ich verwende nicht nodegit, weil ich die "--depth = 1" Parameter verwenden möchten, die nicht von nodegit unterstützt wird.
  • Ich habe die git und ssh ausführbare Datei von der korrekten AWS AMI kopiert und dann in einen "bin" Ordner in der Zip hochgeladen.
  • Ich habe sie mit diesem zu PFAD:

->

process.env['PATH'] = process.env['LAMBDA_TASK_ROOT'] + "/bin:" + process.env['PATH']; 

Die Eingangsgrößen wie folgt festgelegt sind:

"checkout_url": "[email protected]", 
"branch":"master 

Jetzt mache ich dies (der Kürze halber, ich gemischt Pseudo-Code in):

downloadDeploymentKeyFromS3Sync('/tmp/ssh_key'); 
fs.chmodSync("/tmp/ssh_key",0600); 
process.env['GIT_SSH_COMMAND'] = 'ssh -o StrictHostKeyChecking=no -i /tmp/ssh_key'; 
execSync("git clone --depth=1 " + checkout_url + " --branch " + branch + " /tmp/checkout"); 

Das läuft in meinem lokalen Computer mit lambda-local alles funktioniert gut! Aber wenn ich es in Lambda testen, die ich erhalten:

warning: templates not found /usr/share/git-core/templates 
PRIV_END: seteuid: Operation not permitted\r 
fatal: Could not read from remote repository. 
  • Die „Warnung“ ist natürlich, weil ich nicht git nicht installiert hat, sondern nur die binäre kopiert. Ist das ein Grund, warum das nicht funktionieren sollte?
  • Warum braucht Git "setuid"? Ich habe gelesen, dass das in einigen Shells aus Sicherheitsgründen deaktiviert ist. Es macht also Sinn, dass es in Lambda nicht funktioniert. Kann git irgendwie angewiesen werden, diesen Befehl nicht "zu brauchen"?

Antwort

12

Ja, das ist definitiv möglich - Sie können es tun, indem Sie Ihr eigenes git tar bundle erstellen und die Lambda-Ausführung entpacken.

Genau das mache ich in LambCI.

Sie werden die folgenden env Variablen sicher sind auf den entsprechenden Stellen machen müssen:

GIT_TEMPLATE_DIR: '/tmp/myDir/usr/share/git-core/templates' 
    GIT_EXEC_PATH: '/tmp/myDir/usr/libexec/git-core' 

Ich werde ein Repo besser zu dokumentieren (und sammeln Rezepte für) einige der Möglichkeiten schaffen Sie können benutzerdefinierte Software-Ausführung auf AWS Lambda erreichen, aber für jetzt gibt es nur eine .

+0

Was haben Sie in LambCI getan, die den Aufruf von seteuid() umgangen haben? Ich sehe noch nichts anderes als die offene Frage? –

+1

Wenn ich git-2.4.3.tar von LambCI mit ssh benutze, bekomme ich die Fehlermeldung 'ssh: error beim Laden von shared libraries: libfipscheck.so.1: kann die geteilte Objektdatei nicht öffnen: Keine solche Datei oder dieses Verzeichnis '. Ich glaube, Sie müssen auch LD_LIBRARY_PATH =/tmp/myDir/usr/lib64 setzen. –

0

Das Problem ist, dass Sie nicht nur die Git-Binärdatei kopieren können. Sie benötigen eine portable Version von git und selbst damit haben Sie eine schlimme Zeit, da Sie nicht garantieren können, dass die OS, auf der die Lambda-Funktion läuft, mit der Binärdatei kompatibel ist.

Zurücktreten, würde ich nur von diesem Ansatz vollständig gehen. Ich würde klonen und ein Paket erstellen, das ich genauso herunterladen würde, wie Sie DownloadDeploymentKeyFromS3Sync tun.

+1

Das Betriebssystem ist garantiert Amazon Linux. –

+0

Wo sehen Sie in der Dokumentation, dass das Betriebssystem garantiert Amazon Linux ist? Es ist jetzt Amazon Linux, mit den angewendeten Patches, aber das ist keine Garantie, dass es immer dasselbe sein wird und etwas zu bauen, das diese Annahme zu machen scheint, als ob man mich um Ärger bittet – Mircea

+2

Es ist genau dort in der Dokumentation: http: //docs.aws.amazon.com/lambda/latest/dg/current-supported-versions.html Und dann gibt es das: https://aws.amazon.com/blogs/compute/running-executables-in-aws-- lambda/Which states "Wenn Sie Ihre eigenen Binärdateien kompilieren, stellen Sie sicher, dass sie entweder statisch verknüpft oder für die passende Version von Amazon Linux erstellt wurden. Die aktuelle Version von Amazon Linux, die in AWS Lambda verwendet wird, finden Sie immer auf der Seite Unterstützte Versionen der Lambda-Dokumente. " –

-2

Sie könnten dies als eine Nicht-Antwort betrachten, aber ich habe den einfachsten Weg gefunden, beliebige Binärdateien von Lambda auszuführen ist ... nicht zu. Wenn ich die Arbeit nicht innerhalb eines plattformunabhängigen, nicht-binären Ansatzes erledigen kann, integriere ich Docker in den Workflow und verwalte Docker-Container von der Lambda-Funktion.

In AWS ist eine Möglichkeit, den Elastic Container Service (ECS) zu verwenden, um eine Aufgabe zu erstellen, die Git ausführt.

Wenn Sie eine Docker Swarm-Instanz aufstellen oder einen anderen Docker-API-kompatiblen Dienst wie Rackspace Carina oder Joyent Triton integrieren, können Sie ein speziell für die Integration von AWS Lambda mit Docker zusammengestelltes Projekt verwenden: "Dockaless".

Viel Glück!