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.
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)