1

Mein Ziel

Ich versuche AWS's JDBC Driver zu verwenden, eine Lambda-Funktion läuft Knoten 6.10, damit AWS Athena verbinden und eine Datenbank erstellen. (Ich möchte auch in der Lage sein, Tabellen innerhalb dieser Datenbank zu erstellen und abzufragen).Trouble AWS Athena Verbindung über JDBC Knoten Lambda mit

was ich versucht habe

ich den folgenden Code aus einer Antwort auf eine similar question versucht:

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); 
    } 
}); 

die Fehler Ich sehe

Als ich das laufen auf meinem eigenen Maschine (Mac OSX El Capitan 10.11.6), sehe ich das Popup-Bild unten mit der Nachricht No Java runtime present, requesting install. auf meiner Konsole gedruckt.

Popop

Wenn ich meinen Code Lambda einsetzen und dort ausführen, schlägt es mit der folgenden Meldung:

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

Wenn lokal ausgeführt, kann ich sehen, dass die Dinge in den var hsqldb = new JDBC(config); scheitern Zeile, aber wenn auf Lambda ausgeführt wird, tritt der Fehler sofort auf, wenn JDBC erforderlich ist (die erste Zeile des obigen Codes).

aktualisiert

Das invalid ELF header Problem scheint die Idee zu zeigen, dass die node_modules/java/build/Release/nodejavabridge_bindings.node-Datei für eine Architektur für unvereinbar mit dem man kompiliert wurde, auf dem AWS Lambda läuft (Linux x64).

Dies erklärt den Unterschied im Verhalten beim lokalen Ausführen vs beim Ausführen auf Lambda.

Ich habe versucht mit node-gyp, um die Ressource speziell für die x64-Architektur zu kompilieren, und sah das Problem Änderung aber nicht auflösen.

Der Knoten-gyp Befehl Ich war node-gyp configure --arch=x64 (laufen innerhalb des node_modules/java/ Verzeichnis) erfolgreich lief

Statt eines invalid ELF header Fehler, wenn auf Lambda läuft, sehen wir jetzt ein module initialization error (siehe Protokolle unten)

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) 

Antwort

1

Sie beschreiben hier ein paar Probleme.

Zuerst die fehlende JVM in MacOS. Dies ist ein dokumentierter Fehler in Node-Java. Dieser Link beschreibt eine Problemumgehung für dieses Problem.

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

Danach wurde und die "setupClasspath" -statment Anwendung, sollten Sie Ihre Probe lokal runnable sein.

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

Wie für die ELF-Problem, können Sie nicht Linux native Module für den Knoten in MacOS bauen.Und da npm Prebuild-Versionen nicht verteilt, können Sie sie nur auf einem entsprechenden Zielcomputer bereitstellen.

Das bedeutet, dass Sie Ihre Module auf einem Linux AMI (vorzugsweise dem Lambda AMI) installieren/packen müssen.

Hier eine AWS Blog-Post auf, wie dies zu tun:

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

AMI-Versionen verwendet:

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

Verwandte Themen