【问题标题】:Updating Lambda function to new runtime. Why is cURL no longer working in Node 10 on AWS Lambda?将 Lambda 函数更新到新的运行时。为什么 cURL 不再在 AWS Lambda 上的节点 10 中工作?
【发布时间】:2020-03-28 14:08:15
【问题描述】:

这是我的 Lambda 函数中引发错误的行:

// running in Node 8
const { execSync } = require('child_process');
execSync('curl https://github.com');

我正在尝试将我的 Lambda 函数从节点 8 升级到节点 10 或节点 12,因为 Lambda 上的节点 8 将在 2019 年 12 月结束时被弃用(因此我将无法更新它)。但是,当我深入研究 CloudWatch 日志时,我看到了以下错误:

bin/sh: curl: command not found

当我将 Lambda 函数更新为仅运行 which curl 时,我收到了类似的错误: bin/sh: which: command not found

根据文档here,我知道 Node 8+、Python 3.8+ 和 Java 11+ 正在使用新的 AWS Lambda Runtime、Amazon Linux 2。

感谢任何帮助。

【问题讨论】:

  • 你为什么要通过子进程进行卷曲,而不是从 axios 或请求中调用 GET?甚至使用原生的 http/https npm 模块?
  • 我们有不同的开发环境,它们依赖于 Node 中使用的底层应用程序,使用 curl 我们可以在大多数系统上独立于 Node.js 开发该应用程序。此外,我们正在通过应用程序的其余部分在命令行级别做很多工作。
  • 当然...但是使用 Node 仍然应该遵循良好的包依赖管理。你的 CI/CD 管道应该处理一致性。无论如何,这与您最初的问题有所不同……对此我没有很好的回应。我想如果你使用 Linux 特定工具(即 curl 或 ssh),你总是会遇到基本 Linux 映像的问题,因为它们试图尽可能精简和平均。

标签: node.js amazon-web-services curl aws-lambda amazon-linux-2


【解决方案1】:

以上节点 V10 和 V12 基于 Amazon Linux 2,无法运行 curl。

cURL on AWS Lambda gives command not found error

你有两个选择

  • 在 AWS Lambda 中使用本机二进制包
  • 使用nodejsrequest或http内置模块

如何在 AWS Lambda 部署包中使用 Amazon Linux AMI 原生二进制包?

简短说明

Lambda 部署包是一个 .zip 文件,其中包含您的代码和 任何依赖项。 Lambda 执行环境基于 特定的 Amazon Linux AMI 和内核版本。任何本机二进制文件 在 Lambda 部署包中使用必须在此编译 环境,并且仅支持 64 位二进制文​​件。

要使用 Amazon Linux AMI 原生二进制包,您可以提取 64 位库,然后将它们包含在您的 Lambda 部署中 包裹。 (本文未涉及的另一个选项是 下载源代码到共享库,然后重新编译 包。)

lambda-runtimes

所以正如评论中建议的那样,另一种方法是使用节点包。

您可以尝试类似的测试目的

exports.handler = async (event) => {
  const https = require('https');                
  var response=https.get('https://api.github.com');
  return JSON.stringify(response.output)
}

【讨论】:

  • 感谢您的回答。简短描述的来源是什么?可以加个链接吗?
  • 我们还从命令行提取 TAR 文件。我能够成功地将 curl 替换为 javascript 的请求库,添加了许多代码行,但还没有为 TAR 找到一个很好的 js 解决方案。我最终可能会尝试手动导入这些库并返回命令行。
【解决方案2】:

我建议不要使用 lambda 函数压缩本机二进制包,而是查看 AWS Lambda 层 (https://docs.aws.amazon.com/lambda/latest/dg/configuration-layers.html)

这样,如果您有多个 lambda 函数,它们可以共享这些二进制包。您将需要上传 nodejs 文件夹中的内容并将其压缩。在您的代码中,您可以访问它/opt/nodejs/ path

顺便说一句,我更喜欢使用 nodejs 来进行 http 调用,而不是使用 nodejs 中的 curl。

【讨论】:

  • 谢谢,Ashnish。我将研究图层。这对我们来说不仅仅是 cURL,这恰好是我在问题中选择的库。我能够成功地将 curl 替换为 JS 请求库(不幸的是,1 行代码变为 20 行),但现在我们需要提取一个 gzip'd TAR。还没有找到与命令行中的工具相媲美的工具。
猜你喜欢
  • 2022-09-29
  • 1970-01-01
  • 2021-04-07
  • 2019-11-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多