2017-04-22 126 views
1

我的目標

我試圖用AWS's JDBC Driver允許lambda函數運行節點6.10連接到AWS雅典娜和創建數據庫。 (我也希望能夠創建和查詢該數據庫中的表)。麻煩通過JDBC連接到AWS雅典娜使用節點LAMBDA

我已經試過

我曾嘗試下面的代碼從一個答案,一個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.已打印到我的控制檯。

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體系結構編譯資源,並且看到問題更改爲但未解決。

我跑的節點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) 

回答

1

您在這裏描述了幾個問題。

首先在MacOS中缺少JVM。這是node-java中記錄的錯誤。此鏈接描述了該問題的解決方法。

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

應用該和改變 「setupClasspath」 -statment後,您的樣品應該是在本地運行的。

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

對於ELF-問題,你不能建立Linux的在MacOS上節點的本機模塊。並且由於npm不分發預構建版本,因此只能構建可在目標等效機器上部署的內容。

這意味着您需要在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