在AWS lambda中运行'git'

时间:2016-05-17 15:22:08

标签: amazon-web-services aws-lambda

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

这是我的设置:

  • 我正在使用nodejs 4.3
  • 我没有使用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": "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可以指示不要“需要”这个命令吗?

3 个答案:

答案 0 :(得分:14)

是的,这绝对是可能的 - 您可以通过创建自己的git tar包并对Lambda执行进行解包来实现。

这正是我在LambCI中所做的。

您需要确保将以下env变量设置为适当的位置:

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

我将创建一个repo来更好地记录(并收集食谱)在AWS Lambda上实现自定义软件执行的一些方法,但是现在只有issue open for it

答案 1 :(得分:0)

问题是你不能只复制git二进制文件。你需要一个可移植的git版本,即使这样你也会有不好的时间,因为你无法保证运行lambda函数的os将与二进制文件兼容。

退后一步,我会完全放弃这种方法。我会克隆并构建一个我下载的软件包,就像下载DeploymentKeyFromS3Sync一样。

答案 2 :(得分:-2)

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

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

如果您站起来使用Docker Swarm实例或集成另一个兼容Docker-API的服务(如Rackspace Carina或Joyent的Triton),那么您可以使用我个人专门用于集成AWS Lambda和Docker的项目:"Dockaless"

祝你好运!