【问题标题】:Running 'git' in AWS lambda在 AWS lambda 中运行“git”
【发布时间】:2016-05-17 15:22:08
【问题描述】:

我正在尝试在 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 不“需要”这个命令吗?

【问题讨论】:

    标签: amazon-web-services aws-lambda


    【解决方案1】:

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

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

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

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

    (替换 &lt;region&gt;&lt;version&gt;,查看 README 以获得最新版本)

    【讨论】:

    • 那么你在 LambCI 中做了什么来绕过 seteuid() 调用?除了未解决的问题,我还没有看到任何其他内容?
    • 当使用来自 LambCI 的 git-2.4.3.tar 和 ssh 时,我收到错误消息 ssh: error while loading shared libraries: libfipscheck.so.1: cannot open shared object file: No such file or directory。我相信你也必须设置LD_LIBRARY_PATH=/tmp/myDir/usr/lib64
    • 我正在尝试将 aws bin 二进制文件添加到您的层,所以我解压缩 layer.zip 文件夹并将 aws 添加到 bin 文件夹中,然后压缩所有文件,但上传后我是获取 git 命令未找到错误
    【解决方案2】:

    问题是您不能只复制 git 二进制文件。你需要一个可移植版本的 git,即使这样你也会遇到麻烦,因为你不能保证运行 lambda 函数的操作系统会与二进制文件兼容。

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

    【讨论】:

    • 操作系统保证为 Amazon Linux。
    • 您在文档中的哪个位置看到操作系统保证为 Amazon Linux?现在是 Amazon Linux,带有正在应用的补丁,但这并不能保证它总是相同的操作系统,并且构建一些使这种假设的东西对我来说似乎是自找麻烦
    • 它就在文档中:docs.aws.amazon.com/lambda/latest/dg/… 然后是这样的:aws.amazon.com/blogs/compute/running-executables-in-aws-lambda 其中指出“如果您编译自己的二进制文件,请确保它们是静态链接或为匹配版本构建的的 Amazon Linux。AWS Lambda 中使用的当前版本的 Amazon Linux 始终可以在 Lambda 文档的 Supported Versions 页面上找到。"
    • 这与说操作系统不会改变(主要改变或微小改变)不同。所以操作系统不能保证是什么东西。这样做是为了解锁一些用例,但它对我来说仍然很老套,我不会按照这些思路构建一些东西。
    • 同意米尔恰。当然不值得-1。均衡了。
    【解决方案3】:

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

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

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

    祝你好运!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-06-24
      • 2021-12-17
      • 1970-01-01
      • 1970-01-01
      • 2019-07-13
      • 2021-02-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多