node.js - 将 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。
任何帮助表示赞赏。
解决方案
以上节点 V10 和 V12 基于 Amazon Linux 2,不能运行 curl。
你有两个选择
- 在 AWS Lambda 中使用本机二进制包
- 使用 nodejs请求或 http 内置模块
如何在 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)
}
推荐阅读
- node.js - 在 laravel api 中使用 redis 发布时未收到消息
- sql - 检查一个值是 SQL 中的第二天还是前一天
- c++ - 使用 protobuf ParseFromString 崩溃的进程
- javascript - 在数组或 json、Javascript 中转换 stdClass 对象
- r - R中的弗里德曼秩和检验:不是不可复制的完整块设计
- python - 如何使用for循环从python中的一个文件夹中读取多个图像?
- angular - Angular 从 Auth0 observable 获取名称
- c# - WPF DataTemplate 从后面的代码中触发绑定
- javascript - 点击开始按钮后显示当前时间值
- spartacus-storefront - Spartacus CCV2 header Sass占位符是如何处理的