2016-05-17 16 views
9

Sto cercando di eseguire git in AWDA lambda per effettuare un checkout di un repository.Esecuzione di "git" in AWS lambda

Questa è la mia messa a punto:

  • Sto usando nodejs 4.3
  • non sto usando nodegit perché voglio usare il "--depth = 1" parametro, che non è supportato da nodegit.
  • Ho copiato l'eseguibile git e ssh dall'AMI AWS corretto e collocato in una cartella "bin" nello zip da caricare.
  • li ho aggiunti PATH con questo:

->

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

Le variabili di ingresso sono impostati in questo modo:

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

Ora faccio questo (per brevità, mi mescolato qualche pseudo-codice 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"); 

In esecuzione nel mio computer locale utilizzando lambda-local tutto funziona bene! Ma quando provo in lambda, ottengo:

warning: templates not found /usr/share/git-core/templates 
PRIV_END: seteuid: Operation not permitted\r 
fatal: Could not read from remote repository. 
  • Il "warning" è, naturalmente, perché non ho installato git, ma solo copiato il file binario. È una ragione per cui questo non dovrebbe funzionare?
  • Perché git ha bisogno di "setuid"? Ho letto che in alcune shell, questo è disabilitato per motivi di sicurezza. Quindi ha senso che non funzioni in lambda. Può in qualche modo essere istruito a non "aver bisogno" di questo comando?

risposta

12

Sì, questo è sicuramente possibile - è possibile farlo creando il proprio pacchetto git tar e decomprimendo l'esecuzione Lambda.

Questo è esattamente ciò che faccio in LambCI.

Avrai bisogno di assicurarsi che le seguenti variabili env sono impostate nelle posizioni appropriate:

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

ho intenzione di creare un repo di documentare meglio (e raccogliere le ricette per) alcuni dei modi puoi eseguire l'esecuzione del software personalizzato su AWS Lambda, ma per ora c'è solo un issue open for it.

+0

Quindi cosa hai fatto in LambCI che ha aggirato la chiamata seteuid()? Non vedo ancora nulla di diverso dal problema aperto? –

+1

Quando si utilizza git-2.4.3.tar da LambCI con ssh, viene visualizzato il messaggio di errore 'ssh: errore durante il caricamento delle librerie condivise: libfipscheck.so.1: impossibile aprire il file oggetto condiviso: Nessun file o directory simile. Credo che tu debba anche impostare 'LD_LIBRARY_PATH =/tmp/myDir/usr/lib64'. –

0

Il problema è che non è possibile copiare solo il binario git. Avete bisogno di una versione portatile di git e anche con quella avrete un brutto momento perché non potete garantire che l'os su cui gira la funzione lambda sarà compatibile con il binario.

Tornando indietro, vorrei semplicemente allontanarmi completamente da questo approccio. Vorrei clonare e creare un pacchetto che scaricherei più o meno nello stesso modo in cui esegui downloadDeploymentKeyFromS3Sync.

+1

Il sistema operativo è garantito per essere Amazon Linux. –

+0

dove nella documentazione vedi che il SO è garantito come Amazon Linux? È Amazon Linux in questo momento, con le patch applicate, ma non è una garanzia che sarà sempre lo stesso OS e la costruzione di qualcosa che fa sembrare che questa ipotesi mi stia chiedendo guai – Mircea

+2

È proprio lì nella documentazione: http: //docs.aws.amazon.com/lambda/latest/dg/current-supported-versions.html E poi c'è questo: https://aws.amazon.com/blogs/compute/running-executables-in-aws- lambda/Which states "Se compili i tuoi binari, assicurati che siano collegati o creati staticamente per la versione corrispondente di Amazon Linux.La versione corrente di Amazon Linux in uso all'interno di AWS Lambda può sempre essere trovata nella pagina Versioni supportate dei documenti Lambda. " –

-2

Si potrebbe considerare questa una non risposta, ma ho trovato il modo più semplice per eseguire binari arbitrari da Lambda è ... non farlo. Se non riesco a eseguire il lavoro da un approccio indipendente dalla piattaforma e non binario, integro Docker nel flusso di lavoro, gestendo i contenitori Docker dalla funzione Lambda.

Su AWS un modo per fare ciò è utilizzare l'Elastic Container Service (ECS) per generare un'attività che esegue git.

Se si alza un'istanza di Docker Swarm o si integra un altro servizio compatibile Docker-API come Rackspace Carina o Joyent's Triton, è possibile utilizzare un progetto creato personalmente per l'integrazione di AWS Lambda con Docker: "Dockaless".

Buona fortuna!