从AWS lambda执行shell命令

Iam*_*ale 2 amazon-web-services node.js 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.');
    });
}
Run Code Online (Sandbox Code Playgroud)

Mar*_*cin 6

我的猜测是,因为您使用的是异步 lambda 处理程序,所以您的函数在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
}
Run Code Online (Sandbox Code Playgroud)

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