首页 > 解决方案 > 将 Lambda 函数更新到新的运行时。为什么 cURL 不再在 AWS Lambda 上的节点 10 中工作?

问题描述

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

任何帮助表示赞赏。

标签: node.jsamazon-web-servicescurlaws-lambdaamazon-linux-2

解决方案


以上节点 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)
}


推荐阅读