运行 'git' 在 AWS lambda 中
Running 'git' in AWS lambda
我正在尝试 运行 git 在 AWS lambda 中检查存储库。
这是我的设置:
- 我正在使用 nodejs 4.3
- 我没有使用 nodegit 因为我想使用节点不支持的“--depth=1”参数git。
- 我已经从正确的 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.
- 的"warning"当然是,因为我没有安装git只是复制了二进制文件。这就是为什么这不起作用的原因吗?
- 为什么 git 需要 "setuid"?我在某些 shell 中读到,出于安全原因,它被禁用了。所以它在 lambda 中不起作用是有道理的。 git 能否以某种方式指示不要 "need" 此命令?
问题是您不能只复制 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 以获得最新版本)
我正在尝试 运行 git 在 AWS lambda 中检查存储库。
这是我的设置:
- 我正在使用 nodejs 4.3
- 我没有使用 nodegit 因为我想使用节点不支持的“--depth=1”参数git。
- 我已经从正确的 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.
- 的"warning"当然是,因为我没有安装git只是复制了二进制文件。这就是为什么这不起作用的原因吗?
- 为什么 git 需要 "setuid"?我在某些 shell 中读到,出于安全原因,它被禁用了。所以它在 lambda 中不起作用是有道理的。 git 能否以某种方式指示不要 "need" 此命令?
问题是您不能只复制 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 以获得最新版本)