如何在aws lambda环境中为node-oracledb包设置一层?
how to set up a layer for node-oracledb package in aws lambda environment?
我想连接到 aws lambda nodejs 运行时中 RDS 中托管的 oracle 数据库。经过研究,我发现我需要下载 node-oracledb 包并为节点模块和二进制 lib 文件创建一个层。所以我创建了如下所示的文件夹结构和 zip 文件夹并上传到 aws 层和附加层到 lambda,但是我得到 "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
lambda 错误:
"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.log('ERROR', JSON.stringify(error));
}
}
还有另一个库“oracledb_for_lambda”从 lambda
连接 oracle DB
npm i oracledb-for-lambda
现在,在项目文件夹中,创建一个名为“nodejs”的文件夹,您需要移动“node_modules”文件夹到这个“nodejs”文件夹中。然后,将“lib”文件夹复制到“/node_modules/oracledb-for-lambda”,然后粘贴到主项目目录外。
最后,您将得到如下图所示的文件夹结构。
就是这样,压缩文件夹中的文件并将 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;
}
我想连接到 aws lambda nodejs 运行时中 RDS 中托管的 oracle 数据库。经过研究,我发现我需要下载 node-oracledb 包并为节点模块和二进制 lib 文件创建一个层。所以我创建了如下所示的文件夹结构和 zip 文件夹并上传到 aws 层和附加层到 lambda,但是我得到 "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
lambda 错误:
"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.log('ERROR', JSON.stringify(error));
}
}
还有另一个库“oracledb_for_lambda”从 lambda
连接 oracle DBnpm i oracledb-for-lambda
现在,在项目文件夹中,创建一个名为“nodejs”的文件夹,您需要移动“node_modules”文件夹到这个“nodejs”文件夹中。然后,将“lib”文件夹复制到“/node_modules/oracledb-for-lambda”,然后粘贴到主项目目录外。
最后,您将得到如下图所示的文件夹结构。
就是这样,压缩文件夹中的文件并将 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;
}