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

时间:2019-11-20 14:40:56

标签: curl aws-lambda

今天开始几个小时,在Lambda上执行简单的curl命令失败。
Lambda环境是NodeJs 10.x(也已在12.x中尝试过)。

const { execSync } = require('child_process');

exports.handler = async (event) => {
   execSync('curl http://commondatastorage.googleapis.com/gtv-videos-bucket/sample/images/BigBuckBunny.jpg -o /tmp/BigBuckBunny.jpg');
    const response = {
        statusCode: 200,
        body: JSON.stringify('Hello from Lambda!'),
    };
    return response;
};

我得到了/ bin / sh curl:找不到命令错误 知道是什么问题吗?

Response:
{
  "errorType": "Error",
  "errorMessage": "Command failed: curl http://commondatastorage.googleapis.com/gtv-videos-bucket/sample/images/BigBuckBunny.jpg -o /tmBigBuckBunny.jpg\n/bin/sh: curl: command not found\n",
  "trace": [
    "Error: Command failed: curl http://commondatastorage.googleapis.com/gtv-videos-bucket/sample/images/BigBuckBunny.jpg -o /tmBigBuckBunny.jpg",
    "/bin/sh: curl: command not found",
    "",
    "    at checkExecSyncError (child_process.js:621:11)",
    "    at execSync (child_process.js:657:15)",
    "    at Runtime.exports.handler (/var/task/index.js:11:4)",
    "    at Runtime.handleOnce (/var/runtime/Runtime.js:66:25)"
  ]
}

2 个答案:

答案 0 :(得分:1)

我尝试使用spawnSync而不是execSync,并且可以正常工作。

const {spawnSync} = require('child_process');

spawnSync使用进程环境来运行命令,而execSync使用shell环境。显然,在shell环境中未配置curl路径。

答案 1 :(得分:1)

最后,我得到了亚马逊支持人员(及其内部技术团队)的确认,即CURL二进制文件不再包含在基于Amazon Linux 2的AWS Lambda环境中。这就是为什么我无法使用其中一个执行curl节点10和节点12中的execSync或spawnSync。

按照它们的替代方法是使用“请求”库https://github.com/request/request/blob/master/README.md#streaming