使用Node Lambda通过JDBC连接到AWS Athena时出错

我的目标

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

我所试过的

我已经尝试了下面的代码从一个类似的问题的答案:

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)时,我看到下面的popup窗口显示消息No Java runtime present, requesting install. 打印到我的控制台。

POPOP

当我将代码部署到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 configure --arch=x64命令是node-gyp configure --arch=x64 (在node_modules/java/目录下运行)

在Lambda上运行时,不是invalid ELF header错误,现在我们看到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) 

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

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

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

应用完这个之后,改变“setupClasspath”-statment,你的示例应该可以在本地运行。

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

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

这意味着您需要在Linux AMI(最好是LAMDA 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

Interesting Posts