我尝试使用以下代码。
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})
}
)
在这里,我将jar文件放在根文件夹和src文件夹中。 但它给出了我的以下错误。我已经使用代码添加了.jar文件。但是我遇到了以下错误。
"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"
}
那么如何,我可以在AWS Lambda环境中执行此.jar文件吗? 请帮帮我。
答案 0 :(得分:1)
AWS Lambda允许您在创建该lambda函数时选择runtime
,或者稍后您可以再次更改它。
因此,当您使用NodeJs
运行时运行Lambda函数时,容器将无法使用Java
运行时。
对于AWS Lambda,您在一个容器中只能有一种runtime
。
因此,创建一个单独的Lambda,其中包含您要运行的Jar
文件,其中Java为runtime
,然后您可以从当前NodeJS
lambda函数触发该lambda函数那是你最终想要的。
以下是如何使用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)
}
});
您可以参考official documentation了解更多详情。
答案 1 :(得分:1)
借助Lambda图层,您现在可以引入多个运行时。
https://github.com/lambci/yumda和https://github.com/mthenw/awesome-layers都有很多预构建的软件包,可用于创建图层,因此环境中还有第二个运行时可用。
例如,我目前正在开发一个项目,该项目在从lambci / yumbda构建的自定义层之上使用Ruby 2.5运行时来提供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 .
答案 2 :(得分:0)
除了其他答案:自 2020 年 12 月起,Lambda 支持容器映像:https://aws.amazon.com/blogs/aws/new-for-aws-lambda-container-image-support/
例如:我使用 AWS 的 Python 开源基础映像创建了一个容器映像,并添加了一行来安装 java。我的 Python 代码所做的一件事是使用 sys 调用执行一个 .jar 文件。