繁体   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