He intentado con el siguiente código.
var exec = require('child_process').execFile; var runCmd = 'java -jar ' + process.env.LAMBDA_TASK_ROOT + '/src/' + 'myjar.jar' exec(runCmd, function (err, resp) { if (err) { cb(null, { err: err}) } else { cb(null, { resp: resp}) } )
Aquí, he puesto mi archivo jar en la carpeta raíz y también en la carpeta src. pero me está dando el siguiente error. Ya agregué el archivo .jar con el código, pero recibí el siguiente error.
"err": { "code": "ENOENT", "errno": "ENOENT", "syscall": "spawn java -jar /var/task/src/myjar.jar", "path": "java -jar /var/task/src/myjar.jar", "spawnargs": [], "cmd": "java -jar /var/task/src/myjar.jar" }
Entonces, ¿cómo puedo ejecutar este archivo .jar en el entorno de AWS Lambda? Por favor, ayúdame.
Con Lambda Layers, ahora puede incorporar múltiples tiempos de ejecución.
https://github.com/lambci/yumda y https://github.com/mthenw/awesome-layers tienen muchos paquetes preconstruidos que puede usar para crear una capa para tener un segundo tiempo de ejecución disponible en su entorno .
Por ejemplo, actualmente estoy trabajando en un proyecto que utiliza el tiempo de ejecución de Ruby 2.5 sobre una capa personalizada creada a partir de lambci/yumbda para proporcionar Java.
mkdir dependencies docker run --rm -v "$PWD"/dependencies:/lambda/opt lambci/yumda:1 yum install -y java-1.8.0-openjdk-devel.x86_64 cd dependencies zip -yr ../javaLayer .
AWS Lambda le permite seleccionar un tiempo de runtime
en el momento de la creación de esa función lambda, o luego puede cambiarlo nuevamente.
Por lo tanto, mientras ejecuta la función Lambda con el tiempo de ejecución de NodeJs
, el contenedor no tendrá disponible el tiempo de ejecución de Java
.
Solo puede tener un tipo de tiempo de runtime
en un contenedor en el caso de AWS Lambda.
Entonces, cree un Lambda separado con el archivo Jar
que desea ejecutar con Java como tiempo de runtime
y luego puede activar esa función lambda desde su función lambda actual de NodeJS
si eso es lo que finalmente desea.
El siguiente es un ejemplo de cómo puede llamar a otra función Lambda usando NodeJS
var aws = require('aws-sdk'); var lambda = new aws.Lambda({ region: 'put_your_region_here' }); lambda.invoke({ FunctionName: 'lambda_function_name', Payload: JSON.stringify(event, null, 2) }, function(error, data) { if (error) { context.done('error', error); } if(data.Payload){ context.succeed(data.Payload) } });
Puede consultar la documentación oficial para obtener más detalles.
Además de las otras respuestas: desde diciembre de 2020, Lambda admite imágenes de contenedores: https://aws.amazon.com/blogs/aws/new-for-aws-lambda-container-image-support/
Ej.: Creé una imagen de contenedor usando la imagen base de código abierto de AWS para python, agregando una línea para instalar java. Una cosa que hizo mi código python fue ejecutar un archivo .jar usando una llamada al sistema.