Захват результатов от процесса, порожденного от NodeJS Lambda

в дополнение к @lonkly solution

  1. см. отражения и доступность поля
  2. ненужные переменные

метод:

/**
 * lookup a resource id by field name in static R.class 
 * 
 * @author - ceph3us
 * @param variableName - name of drawable, e.g R.drawable.<b>image</b>
 * @param с            - class of resource, e.g R.drawable.class or R.raw.class
 * @return integer id of resource
 */
public static int getResId(String variableName, Class<?> с)
                     throws android.content.res.Resources.NotFoundException {
    try {
        // lookup field in class 
        java.lang.reflect.Field field = с.getField(variableName);
        // always set access when using reflections  
        // preventing IllegalAccessException   
        field.setAccessible(true);
        // we can use here also Field.get() and do a cast 
        // receiver reference is null as it's static field 
        return field.getInt(null);
    } catch (Exception e) {
        // rethrow as not found ex
        throw new Resources.NotFoundException(e.getMessage());
    }
}
1
задан wishihadabettername 16 January 2019 в 20:46
поделиться

2 ответа

Это работает для меня (node.js 8.10 runtime)


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());
};

При попытке запустить с aws выдает ошибку ENOENT. Другими словами, команда недоступна. Как упоминалось в комментариях к вопросу @jarmod, я также считаю, что awscli недоступно в контейнере Lambda.

Доступен SDK, так что вы можете require('aws-sdk'); не связывать его с вашим пакетом развертывания Lambda.

0
ответ дан Milan Cermak 16 January 2019 в 20:46
поделиться

aws-cli является пакетом python и не устанавливается в среде Lambda.
Чтобы проверить мое утверждение, вы можете набрать команды оболочки здесь http://www.lambdashell.com/ и проверить, что установлено по умолчанию в вашей среде выполнения, или проверить официальную документацию .

Ваш код выше не возвращает никакого вывода, потому что попытка выполнить aws возвращает ENOENT, то есть файл недоступен.

Если вы хотите запустить aws внутри своей лямбда-функции, вы можете выполнить следующие инструкции: Вызвать aws-cli из AWS Lambda

Однако я бы спросил , почему [ 1115] ты хочешь сделать это? AWS-SDK включен в локальную среду выполнения , и вы можете вызывать любой API-интерфейс AWS непосредственно из своего кода без необходимости порождать процесс и работать с stdin / stdout. Я настоятельно рекомендую не создавать aws cli из вашего кода, а вместо этого использовать SDK.

Но, если вы хотите запустить процесс из Lambda и захватить stdout и stderr, вот как я это делаю.

'use strict';

const childProcess = require('child_process');

/*
 * Handle the chile process and returns a Promise
 * that resoved when process finishes executing
 * 
 * The Promise resolves an  exit_code
 */ 
function handleProcess(process) {


    return new Promise((resolve, reject) => {
        process.stdout.on('data', (data) => {
            console.log(`stdout: ${data}`);
            console.log('stdout');
        });

        process.stderr.on('data', (data) => {
            console.log(`stderr: ${data}`);
        });

        process.on('close', (code) => {
            console.log(`child process exited with code ${code}`);
            if (code === 0) {
                resolve(code);
            } else {
                reject(code);
            }
        });
    });
}



exports.handler = (event, context, callback) => {

    // console.log(JSON.stringify(process.env, null, 2));
    // console.log(JSON.stringify(event, null, 2));

    return handleProcess(childProcess.spawn('ls', ['--version']))

        .then((exit_code) => {

            console.log(`exit_code = ${exit_code}`)
            let response = {
                statusCode: (0 == exit_code) ? 200 : 500,
                body: exit_code
            };                
            callback(null, response);

        })

        .catch((error) => {
            console.error(error);
            let response = {
                statusCode: 500,
                body: error
            };
            callback(null, response);
        });

}
0
ответ дан Sébastien Stormacq 16 January 2019 в 20:46
поделиться
Другие вопросы по тегам:

Похожие вопросы: