в дополнение к @lonkly solution
метод:
/**
* 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());
}
}
Это работает для меня (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.
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);
});
}