2

这是我的 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

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

任何帮助表示赞赏。

4

2 回答 2

3

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

在此处输入图像描述

AWS Lambda 上的 cURL 给出命令未找到错误

你有两个选择

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

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

简短的介绍

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

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

lambda 运行时

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

您可以尝试出于测试目的,例如

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

于 2019-12-03T22:02:24.623 回答
1

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

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

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

于 2019-12-06T14:55:41.437 回答