Я хочу подключиться к базе данных оракула, размещенной в RDS, внутри среды выполнения aws lambda nodejs. после исследования я обнаружил, что мне нужно скачать пакет node-oracledb и создать слой для модуля узла и бинарных файлов lib. поэтому я создал структуру папок, как показано ниже, и заархивировал папку и загрузил ее в слой aws и прикрепил слой к лямбде, однако я получаю "errorMessage": "Cannot find module 'oracledb'
любую подсказку, почему узел AWS не может найти модуль?, спасибо
Lambda-Layer-1(version 1)
|
|__lib
| |__libaio.so.1
| |__libclntsh.so.12.1
| |__libclntschcore.so.12.1
| |__libipc1.so
| |__libmql1.so
| |__libnnz12.so
| |__libociicus.so
| |__libons.so
|
|__nodejs
|
|__node_modules
|
|__oracledb
Ошибка от лямбды:
"errorMessage": "Cannot find module 'oracledb'",
"errorType": "Error",
"stackTrace": [
"Module.require (module.js:596:17)",
"require (internal/module.js:11:18)",
"Object.<anonymous> (/var/task/src/services/oracleDb.service.js:10:18)",
"Module._compile (module.js:652:30)",
"Object.Module._extensions..js (module.js:663:10)",
"Module.load (module.js:565:32)",
AWS runtime:
Nodejs:8.10
node-oracledb:"3.1.2"
код:
const oracledb = require("oracledb");
let connection;
static async init() {
try {
if (!connection) {
const connectionAtrribute = {
connectionString: 'uat-*******',
password: '*******',
user: '*******'
};
connection = await oracledb.getConnection(connectionAtrribute);
}
}
catch (error) {
console.info('ERROR', JSON.stringify(error));
}
}
lib
каталог в каталоге вашего проекта. Добавьте libaio.so
или libaio.so.1
(загружено из репозитория Linux) в lib
каталог. Удалите файлы libcIntsh.so.x.1 и libocci.so.x.1 для версий, которые вам не нужны (и файлы .jar тоже, я думаю). С этими файлами обычный модуль oracledb
работает в лямбде. Кроме того, на всякий случай помните, что aws-sdk включен в lambda env.
Существует еще одна библиотека «oracledb_for_lambda» для подключения oracle DB из лямбды.
npm i oracledb-for-lambda
Теперь в папке проекта создайте папку с именем «узлы», и вам нужно переместить папку «node_modules» в эту папку «узлы». Затем скопируйте папку «библиотека» внутрь «/node_modules/oracledb-для-лямбда» и вставьте ее снаружи в основной каталог проекта.
Наконец, вы получите структуру папок, как на изображении ниже.
Вот и все, заархивируйте файлы внутри папки и загрузите Zip на S3.
И вы можете подключиться, используя код ниже
'use strict';
var os = require('os');
var fs = require('fs');
var oracledb = require('oracledb-for-lambda');
exports.handler = async (event, context) => {
let str_host = os.hostname() + ' localhost\n';
fs.writeFileSync(process.env.HOSTALIASES, str_host, function(err) {
if (err) throw err;
});
var connAttr = {
user: process.env.USERNAME,
password: process.env.PASSWORD,
connectString: process.env.CONNECTION_STRING
};
const promise = new Promise(function(resolve, reject) {
oracledb.getConnection(connAttr, function(err, connection) {
if (err) {
reject({
status: "ERROR"
});
}
resolve({
status: "SUCCESS"
});
});
});
return promise;
}
Обратитесь к этой ссылке. Это помогло мне решить проблему для меня. medium.com/@jimmdd/…