这是我的Lambda函数中引发错误的行:
// running in Node 8
const { execSync } = require('child_process');
execSync('curl https://github.com');
我正在尝试将Lambda函数从Node 8升级到Node 10或Node 12,因为Lambda上的Node 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 Linux2。
感谢您的帮助。
答案 0 :(得分:3)
上述节点V10和V12基于Amazon Linux 2,您无法运行curl。
cURL on AWS Lambda gives command not found error
您有两个选择
如何在AWS Lambda部署程序包中使用Amazon Linux AMI本机二进制程序包?
简短说明
Lambda部署软件包是一个.zip文件,其中包含您的代码和 任何依赖关系。 Lambda执行环境基于 特定的Amazon Linux AMI和内核版本。任何本机二进制文件 Lambda部署程序包中使用的命令必须在此编译 环境,并且仅支持64位二进制文件。
要使用Amazon Linux AMI本机二进制软件包,您可以提取 64位库,然后将它们包括在Lambda部署中 包。 (本文未介绍的另一种选择是 将源代码下载到共享库,然后重新编译 包。)
因此,如注释中所建议,另一种方法是使用节点包。
您可以尝试进行测试,例如
exports.handler = async (event) => {
const https = require('https');
var response=https.get('https://api.github.com');
return JSON.stringify(response.output)
}
答案 1 :(得分:1)
我建议不要看一下AWS Lambda Layers(https://docs.aws.amazon.com/lambda/latest/dg/configuration-layers.html)
,而不是使用lambda函数压缩本机二进制软件包。这样,如果您有多个lambda函数,则它们可以共享这些二进制包。您将有一个将内容上载到nodejs文件夹中并进行压缩的方法。在您的代码中,您可以访问它的/opt/nodejs/
路径
通过这种方式,我宁愿使用nodejs进行http调用,而不是使用nodejs的curl。