簡體   English   中英

在 AWS lambda 中運行“git”

[英]Running 'git' in AWS lambda

我正在嘗試在 AWS lambda 中運行 git 以檢查存儲庫。

這是我的設置:

  • 我正在使用 nodejs 4.3
  • 我沒有使用nodegit,因為我想使用 nodegit 不支持的“--depth=1”參數。
  • 我已經從正確的 AWS AMI 復制了 git 和 ssh 可執行文件,然后將其放置在我上傳的 zip 中的“bin”文件夾中。
  • 我將它們添加到 PATH 中:

->

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

輸入變量設置如下:

"checkout_url": "git@...",
"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 不需要“需要”這個命令嗎?

是的,這絕對是可能的,我已經創建了一個Lambda 層來實現這一點。 不需要弄亂任何環境變量,應該開箱即用:

https://github.com/lambci/git-lambda-layer

如自述文件中所述,您需要做的就是添加一個具有以下 ARN 的層:

arn:aws:lambda:<region>:553035198032:layer:git:<version>

(替換<region><version> ,查看最新版本的自述文件)

問題是你不能只復制 git 二進制文件。 你需要一個可移植的 git 版本,即使這樣你也會過得很糟糕,因為你不能保證運行 lambda 函數的操作系統與二進制文件兼容。

退后一步,我會完全放棄這種方法。 我會克隆並構建一個包,我會以與您下載部署密鑰從 S3Sync 的方式幾乎相同的方式下載該包。

您可能認為這是一個非答案,但我發現從 Lambda 運行任意二進制文件的最簡單方法是......不要。 如果我無法從獨立於平台的非二進制方法中完成工作,我會將 Docker 集成到工作流中,通過 Lambda 函數管理 Docker 容器。

在 AWS 上,一種方法是使用彈性容器服務 (ECS) 來生成運行 git 的任務。

如果您建立一個 Docker Swarm 實例或集成另一個與 Docker-API 兼容的服務,例如 Rackspace Carina 或 Joyent 的 Triton,那么您可以使用我個人專門用於將 AWS Lambda 與 Docker 集成的項目: “Dockaless”

祝你好運!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM