我正在尝试使用AWS's JDBC Driver来允许运行Node 6.10的Lambda函数连接到AWS Athena并创建数据库。 (我还希望能够创建和查询该数据库中的表)。
我在similar question的答案中尝试了以下代码:
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/
目录中运行)
在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)
答案 0 :(得分: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不分发prebuild版本,因此只能在目标等效计算机上构建可部署的版本。
这意味着您需要在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