捕获从 NodeJS Lambda 生成的进程的输出

wis*_*ame 1 spawn amazon-web-services node.js aws-lambda

我正在尝试捕获从用 NodeJS 编写的 AWS Lambda 启动的外部程序的输出。下面的完整示例代码。任何测试事件都可以,因为它并没有真正使用。

exports.handler = async (event) => {
    console.log ("Entering lambda" + JSON.stringify(event))

    var spawn = require('child_process').spawnSync;

    child_process = spawn ('aws', [' --version'], {
        stdio: 'inherit',
        stderr: 'inherit',
        shell: true
    })

    console.log ("done");
    const response = {
        statusCode: 200,
        body: JSON.stringify('done'),
    };
    return response;
};
Run Code Online (Sandbox Code Playgroud)

当我运行它时,我得到以下输出(为了简洁起见,我删除了测试事件详细信息,因为它无关紧要)。

我没有看到aws --version我预期的命令的结果(我使用它来测试 AWS CLI 的正确调用,但任何 Linux 命令都可以)。代码确实是同步执行的,因为如果我用 替换调用child_process = spawn ('sleep', ['1'], {,lambda 的执行时间会增长到 1117.85 毫秒,所以会发生一秒钟的睡眠。但是执行日志中没有捕获任何内容。

START RequestId: 0c1287e2-d2ee-4436-a577-bc8ec3608120 Version: $LATEST
2019-01-16T19:12:45.130Z    0c1287e2-d2ee-4436-a577-bc8ec3608120    Entering lambda {...}
2019-01-16T19:12:45.143Z    0c1287e2-d2ee-4436-a577-bc8ec3608120    done
END RequestId: 0c1287e2-d2ee-4436-a577-bc8ec3608120
REPORT RequestId: 0c1287e2-d2ee-4436-a577-bc8ec3608120  Duration: 13.29 ms  Billed Duration: 100 ms     Memory Size: 128 MB Max Memory Used: 20 MB  
Run Code Online (Sandbox Code Playgroud)

难道我做错了什么?或者有没有其他方法可以捕获用 NodeJS 编写的 Lambda 的输出(状态代码、stdio、stderr)?

Mil*_*mak 7

这对我有用(node.js 8.10 运行时)


exports.handler = async (event) => {
    const spawnSync = require('child_process').spawnSync;
    const process = spawnSync('echo', ['hello', 'world'], {
        stdio: 'pipe',
        stderr: 'pipe'
    });
    console.log(process.status);
    console.log(process.stdout.toString());
};
Run Code Online (Sandbox Code Playgroud)

尝试使用 运行时aws,它会引发ENOENT错误。换句话说,该命令不可用。正如@jarmod 在问题评论中提到的,我也相信awscliLambda 容器中不可用。

可用的是 SDK,因此您require('aws-sdk');无需将其绑定到您的 Lambda 部署包。