如何从AWS Lambda Serverless执行.jar文件?

时间:2018-03-23 07:49:06

标签: amazon-web-services jar aws-lambda serverless

我尝试使用以下代码。

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文件吗? 请帮帮我。

3 个答案:

答案 0 :(得分:1)

AWS Lambda允许您在创建该lambda函数时选择runtime,或者稍后您可以再次更改它。 enter image description here

因此,当您使用NodeJs运行时运行Lambda函数时,容器将无法使用Java运行时。

对于AWS Lambda,您在一个容器中只能有一种runtime

因此,创建一个单独的Lambda,其中包含您要运行的Jar文件,其中Java为runtime,然后您可以从当前NodeJS lambda函数触发该lambda函数那是你最终想要的。

以下是如何使用NodeJS

调用另一个Lambda函数的示例
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/yumdahttps://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 .
  1. 将javaLayer.zip上载到AWS Lambda作为层
  2. 在您的函数中添加图层
  3. 在您的函数中,java将位于/ opt / lib / jvm / {YOUR_SPECIFIC_JAVA_VERSION} / jre / bin / java

答案 2 :(得分:0)

除了其他答案:自 2020 年 12 月起,Lambda 支持容器映像:https://aws.amazon.com/blogs/aws/new-for-aws-lambda-container-image-support/

例如:我使用 AWS 的 Python 开源基础映像创建了一个容器映像,并添加了一行来安装 java。我的 Python 代码所做的一件事是使用 sys 调用执行一个 .jar 文件。