2016-05-17 14 views
9

我正在嘗試在AWS lambda中運行git來完成存儲庫的簽出。在AWS中運行'git'lambda

這是我的設置:

  • 我使用4.3的NodeJS
  • 我不使用nodegit因爲我想用「--depth = 1」參數,這是不被支持nodegit。
  • 我已經從正確的AWS AMI複製了git和ssh可執行文件,然後將其放在我上載的zip文件夾中的「bin」文件夾中。
  • 我將他們添加到PATH這個:

- >

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

輸入變量的設置是這樣的:

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

現在我做到這一點(爲簡便起見,我混合一些僞代碼):

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

使用lambda-local在我的本地計算機上運行此應用程序一切正常!但是,當我在lambda測試它,我得到:

warning: templates not found /usr/share/git-core/templates 
PRIV_END: seteuid: Operation not permitted\r 
fatal: Could not read from remote repository. 
  • 「警告」是當然的,因爲我沒有安裝git的,但剛纔複製的二進制文件。這是不應該起作用的原因嗎?
  • 爲什麼git需要「setuid」?我在某些shell中讀到,出於安全考慮而被禁用。所以它在lambda中不起作用是有道理的。 git能不知何故被指示不需要「需要」這個命令?

回答

12

是的,這是絕對有可能的 - 你可以通過創建你自己的git tar包和解壓Lambda執行來實現。

這正是我在LambCI所做的。

你需要確保下列ENV變量被設置到適當的位置:

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

我要創建一個回購協議,以更好的文檔(和收集食譜)的一些方法您可以在AWS Lambda上實現自定義軟件的執行,但目前只有issue open for it

+0

那麼你在LambCI中做了些什麼,以避免seteuid()調用?除了公開問題,我還沒有看到任何其他內容? –

+1

當使用ssh從LambCI中使用git-2.4.3.tar時,加載共享庫時出現錯誤消息:ssh:error:libfipscheck.so.1:無法打開共享目標文件:沒有這樣的文件或目錄。我相信你也必須設置'LD_LIBRARY_PATH =/tmp/myDir/usr/lib64'。 –

0

問題是你不能複製git二進制文件。你需要一個可移植版本的git,即使這樣你也會遇到不好的時間,因爲你不能保證lambda函數運行的os將與二進制兼容。

退後一步,我會完全離開這個方法。我會克隆和構建一個包,我只需要下載幾乎相同的方式下載DeployKeyFromS3Sync。

+1

操作系統保證是亞馬遜Linux。 –

+0

在文檔中,您是否看到OS保證是Amazon Linux?現在是亞馬遜Linux,有補丁程序的應用,但這不是一個保證它總是會是相同的操作系統,並建立一些東西,使得這種假設似乎對我有所幫助 – Mircea

+2

它正好在文檔中:http: //docs.aws.amazon.com/lambda/latest/dg/current-supported-versions.html然後是這樣的:https://aws.amazon.com/blogs/compute/running-executables-in-aws- lambda /其中指出:「如果您編譯自己的二進制文件,請確保它們是靜態鏈接的或爲匹配的Amazon Linux版本構建。AWS Lambda內使用的當前版本的Amazon Linux始終可以在支持的版本頁面上找到的Lambda文檔。「 –

-2

你可能認爲這是一個無法回答的問題,但我發現從Lambda運行任意二進制文件最簡單的方法是......不是。如果我無法在獨立於平臺的非二進制方法中完成工作,那麼我會將Docker集成到工作流中,從Lambda函數管理Docker容器。

在AWS上,執行此操作的一種方法是使用Elastic Container Service(ECS)生成運行git的任務。

如果您站起來一個Docker Swarm實例或者集成另一個Docker-API兼容服務,例如Rackspace Carina或Joyent的Triton,那麼您可以使用我個人將AWS Lambda與Docker集成在一起的項目:"Dockaless"

祝你好運!