1

我的目标

我正在尝试使用AWS 的 JDBC 驱动程序来允许运行 Node 6.10 的 Lambda 函数连接到 AWS Athena 并创建数据库。(我还希望能够创建和查询该数据库内的表)。

我试过的

我从一个类似问题的答案中尝试了以下代码:

var JDBC = require('jdbc');
var jinst = require('jdbc/lib/jinst');

if (!jinst.isJvmCreated()) {
  jinst.addOption("-Xrs");
  jinst.setupClasspath(['./AthenaJDBC41-*.jar']);
}

var config = {
  // Required 
  url: 'jdbc:awsathena://athena.us-east-1.amazonaws.com:443',
   // Optional 
  drivername: 'com.amazonaws.athena.jdbc.AthenaDriver',
  minpoolsize: 10,
  maxpoolsize: 100,
  properties: {
                s3_staging_dir: 's3://aws-athena-query-results-*/',
                log_path: '/logs/athenajdbc.log',
                user: 'access_key',
                password: 'secret_key'
   }
};


var hsqldb = new JDBC(config);

hsqldb.initialize(function(err) {
  if (err) {
    console.log(err);
  }
});

我看到的错误

当我在我自己的机器(Mac OSX El Capitan 10.11.6)上运行它时,我看到了下图所示的弹出窗口,消息No Java runtime present, requesting install.打印到我的控制台。

流行音乐

当我将代码部署到 Lambda 并在那里运行时,它会失败并显示以下消息:

Error: /var/task/node_modules/java/build/Release/nodejavabridge_bindings.node: invalid ELF header

在本地运行时,我可以看到事情在该var hsqldb = new JDBC(config);行失败,但是在 Lambda 上运行时,在需要 JDBC 时立即发生错误(上面代码的第一行)。

更新

这个invalid ELF header问题似乎表明该node_modules/java/build/Release/nodejavabridge_bindings.node文件是为与运行 AWS Lambda 的架构(Linux x64)不兼容的架构编译的。

这解释了在本地运行与在 Lambda 上运行时的行为差异。

我尝试使用node-gyp专门为 x64 架构编译资源,发现问题发生了变化,但没有解决。

我成功运行的 node-gyp 命令是node-gyp configure --arch=x64(在node_modules/java/目录内运行)

invalid ELF header在 Lambda 上运行时,我们现在看到的不是错误,而是一个module initialization error(请参阅下面的日志)

module initialization error: Error
at Module.load (module.js:487:32)
at tryModuleLoad (module.js:446:12)
at Function.Module._load (module.js:438:3)
at Module.require (module.js:497:17)
at require (internal/module.js:20:19)
at Object.<anonymous> (/var/task/node_modules/java/lib/nodeJavaBridge.js:21:16)
at Module._compile (module.js:570:32)
at Object.Module._extensions..js (module.js:579:10)
4

1 回答 1

2

您在这里描述了几个问题。

首先是 MacOS 中缺少的 JVM。这是 node-java 中记录的错误。此链接描述了该问题的解决方法。

https://github.com/joeferner/node-java/issues/90#issuecomment-45613235

在应用它并更改“setupClasspath”-statment 之后,您的示例应该可以在本地运行。

jinst.setupClasspath(['./AthenaJDBC41-1.0.1.jar']);

至于 ELF 问题,您无法在 MacOS 中为节点构建 Linux 本机模块。而且由于 npm 不分发预构建版本,因此您只能在目标等效机器上构建可部署的版本。

这意味着您需要在 Linux AMI(最好是 Lambda AMI)上安装/打包您的模块。

这里有一篇关于如何做到这一点的 AWS 博客文章:

https://aws.amazon.com/blogs/compute/nodejs-packages-in-lambda/

使用的 AMI 版本:

http://docs.aws.amazon.com/lambda/latest/dg/current-supported-versions.html

于 2017-04-25T12:37:37.827 回答