2016-05-17 17 views
9

Próbuję uruchomić git w AWS lambda, aby dokonać kasy z repozytorium.Uruchamianie 'git' w AWS lambda

To jest moja konfiguracja:

  • Używam nodejs 4,3
  • Nie używam nodegit bo chcę użyć „--depth = 1” parametr, który nie jest obsługiwany przez nodegit.
  • Skopiowałem plik wykonywalny git i ssh z właściwego AWS AMI i umieściłem go w folderze "bin" w przesyłanym pliku zip.
  • dodałem je do PATH z tym:

->

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

Zmienne wejściowe są ustawione tak:

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

Teraz mogę to zrobić (dla zwięzłości, ja zmieszany kod pseudokodu):

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"); 

Uruchamianie tego na moim komputerze lokalnym przy użyciu lambda-local wszystko działa poprawnie! Ale kiedy go przetestować w lambda, otrzymuję:

warning: templates not found /usr/share/git-core/templates 
PRIV_END: seteuid: Operation not permitted\r 
fatal: Could not read from remote repository. 
  • „ostrzeżenie” to oczywiście, bo nie instalować git, ale po prostu skopiowane binarny. Czy to jest powód, dla którego to nie powinno działać?
  • Dlaczego git potrzebuje "setuid"? Czytałem to w niektórych powłokach, które są wyłączone ze względów bezpieczeństwa. Więc ma sens, że nie działa w lambda. Czy można w jakiś sposób poinstruować, aby "nie potrzebowało" tego polecenia?

Odpowiedz

12

Tak, to zdecydowanie możliwe - możesz to zrobić, tworząc własny pakiet tar git i unarring na wykonanie Lambda.

To jest dokładnie to, co robię w LambCI.

Musisz upewnić się, że następujące zmienne env są ustawione w odpowiednich miejscach:

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

Mam zamiar stworzyć repo do lepszego dokumentu (i zbierać receptury) niektóre ze sposobów możesz osiągnąć niestandardowe wykonanie oprogramowania na AWS Lambda, ale na razie jest tylko issue open for it.

+0

Więc co zrobiłeś w LambCI, który obejrzał wywołanie seteuid()? Nie widzę jeszcze nic poza kwestią otwartą? –

+1

Używając git-2.4.3.tar z LambCI z ssh, pojawia się komunikat o błędzie 'ssh: error podczas ładowania bibliotek współdzielonych: libfipscheck.so.1: nie można otworzyć pliku obiektu współdzielonego: Brak takiego pliku lub katalogu'. Wierzę, że musisz również ustawić 'LD_LIBRARY_PATH =/tmp/myDir/usr/lib64'. –

0

Problem polega na tym, że nie można skopiować tylko pliku binarnego git. Potrzebujesz przenośnej wersji git i nawet z tym będziesz miał zły czas, ponieważ nie możesz zagwarantować, że funkcja lambda będzie działała zgodnie z binarną.

Cofając się, po prostu odejdę od tego podejścia całkowicie. Sklonowałbym i zbudował pakiet, który po prostu pobrałbym w taki sam sposób, jak pobieranieDeploymentKeyFromS3Sync.

+1

System operacyjny gwarantuje, że jest Amazon Linux. –

+0

gdzie w dokumentacji widzisz, że system operacyjny jest gwarantowany jako Amazon Linux? To jest teraz Amazon Linux, z łatkami, które są stosowane, ale to nie jest gwarancja, że ​​zawsze będzie to ten sam os i budowanie czegoś, co sprawia, że ​​to założenie wydaje mi się proszeniem o kłopoty. – Mircea

+2

Jest dokładnie w dokumentacji: http: //docs.aws.amazon.com/lambda/latest/dg/current-supported-versions.html A ponadto: https://aws.amazon.com/blogs/compute/running-executables-inaws- lambda/Który stwierdza: "Jeśli skompilujesz własne pliki binarne, upewnij się, że są one statycznie połączone lub zbudowane dla pasującej wersji Amazon Linux. Aktualna wersja Amazon Linux używana w AWS Lambda zawsze znajduje się na stronie Obsługiwane wersje dokumentów Lambda. " –

-2

Możesz uważać, że to nie jest odpowiedź, ale znalazłem najprostszy sposób na uruchamianie dowolnych plików binarnych z Lambda ... nie. Jeśli nie mogę wykonać pracy z poziomu niezależnego od platformy, nie binarnego podejścia, integruję Docker z przepływem pracy, zarządzając kontenerami Docker z funkcji Lambda.

Na AWS jednym ze sposobów jest skorzystanie z Elastic Container Service (ECS) w celu odrodzenia zadania uruchamiającego git.

Jeśli wstać instancji Docker Swarm lub zintegrować inny Docker-API kompatybilnego usługi takie jak Rackspace Carina lub Joyent Tryton, następnie można użyć projekt osobiście umieścić razem specjalnie dla integracji AWS Lambda z Döcker: "Dockaless".

Powodzenia!