从AWS Lambda执行Shell命令

时间:2020-10-28 06:39:46

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

我正在尝试执行shell命令以从AWS lambda迁移。这个想法是,每当需要运行迁移时,我们都会通过AWS CLI调用lambda。我无法使其运行。运行迁移的命令永远不会执行,并且总是带有null的响应。任何帮助将不胜感激。

这是我的代码:

const exec = require("child_process").exec;
const { okResponse, errorResponse } = require('./response');

exports.handler = async (event) => {
    exec("node ./node_modules/db-migrate/bin/db-migrate up --config=./database.json", (error, stdout, stderr) => {
        if (error) {
            console.error(`error: ${error.message}`);
            return errorResponse(500, 'Error running migration.');
        }
        if (stderr) {
            console.log(`stderr: ${stderr}`);
            return errorResponse(500, 'Error running migration.');
        }
        console.log(`stdout: ${stdout}`);
        return okResponse(200, 'Migration successfully.');
    });
}

1 个答案:

答案 0 :(得分:2)

我的猜测是,因为您正在使用async lambda handler,所以函数在exec甚至没有运行之前就已完成。因此,您可以使用promise(如链接文档中所示)来解决此问题。

一个例子是:

const exec = require("child_process").exec;
const { okResponse, errorResponse } = require('./response');

exports.handler = async (event) => {


    const promise = new Promise(function(resolve, reject) {
   
        exec("node ./node_modules/db-migrate/bin/db-migrate up --config=./database.json", (error, stdout, stderr) => {
            if (error) {
                console.error(`error: ${error.message}`);
                return errorResponse(500, 'Error running migration.');
            }
            if (stderr) {
                console.log(`stderr: ${stderr}`);
                return errorResponse(500, 'Error running migration.');
            }
            console.log(`stdout: ${stdout}`);
            return okResponse(200, 'Migration successfully.');
          })
    })

   return promise
}

请注意,我尚未运行代码,可能需要进行进一步更改才能使其正常工作。