Моя цель
Я пытаюсь использовать JDBC-драйвер AWS чтобы разрешить функции Lambda под управлением Node 6.10 подключаться к AWS Athena и создавать базу данных. (Я также хочу иметь возможность создавать и запрашивать таблицы внутри этой базы данных).
Что я пробовал
Я попробовал следующий код из ответа на похожий вопрос:
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/
)
Вместо ошибки 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)