运行 'git' 在 AWS lambda 中

Running 'git' in AWS lambda

我正在尝试 运行 git 在 AWS lambda 中检查存储库。

这是我的设置:

->

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 的可移植版本,即使有了它,您也会度过一段糟糕的时光,因为您无法保证运行 lambda 函数的 os 将与二进制文件兼容。

退一步说,我会完全放弃这种方法。我将克隆并构建一个包,我将以几乎与下载 DeploymentKeyFromS3Sync 相同的方式下载该包。

您可能认为这不是答案,但我发现从 Lambda 运行 任意二进制文件的最简单方法是...不是。如果我无法在独立于平台的非二进制方法中完成工作,我会将 Docker 集成到工作流中,从 Lambda 函数管理 Docker 个容器。

在 AWS 上,一种方法是使用弹性容器服务 (ECS) 生成 运行s git.

的任务

如果你建立一个 Docker Swarm 实例或集成另一个 Docker-API 兼容服务,例如 Rackspace Carina 或 Joyent 的 Triton,那么你可以使用我个人提出的项目专门用于将 AWS Lambda 与 Docker 集成:"Dockaless".

祝你好运!

是的,这绝对是可能的,我已经创建了一个 Lambda Layer 来实现这一点。不需要弄乱任何环境变量,应该开箱即用:

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

如 README 中所述,您需要做的就是添加一个具有以下 ARN 的层:

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

(替换 <region><version>,查看 README 以获得最新版本)