将Lambda函数更新为新的运行时。为什么cURL在AWS Lambda的节点10中不再起作用?

时间:2019-12-03 20:18:58

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

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

感谢您的帮助。

2 个答案:

答案 0 :(得分:3)

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

enter image description here

cURL on AWS Lambda gives command not found error

您有两个选择

  • 在AWS Lambda中使用本机二进制程序包
  • 使用nodejs request或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)
}

答案 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。