使用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.
打印到我的控制台。
当我将代码部署到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