如何在 Lambda 中使用本地 Nodejs 模块?

问题描述 投票:0回答:1

我有一个运行良好的 Lambda nodejs 20.x 函数,现在我想从我编写并放入本地目录的名为 local_util 的模块中导入和使用一个对象。但是,Lambda 的 CloudWatch 日志现在显示:

Cannot find module '/var/local_util/index.js' imported from /var/task/index.js

如何让 Lambda 找到我的模块?我以前从未尝试过导入自己的nodejs模块。

我在 lambda 代码目录的上一级创建了一个名为“local_util”的目录,将我的新模块的 index.js 放在那里。

// local_util/index.js

const lock = {
  get: async function (thing) {
     // reinvent AWS distributed lock management because it's so fun...
  },

  release: async function(thing, id) {
    // more fun...
  }
};

export { lock };

然后我运行“npm init”并将此行添加到新的 package.json 中:

"type": "module",

现在我有了这棵树:

lambda/
|__my_lambda_func/
   |__index.js
   |__package.json
   |__package-lock.json
   |__node_modules/
|__local_util/
   |__index.js
   |__package.json

在 my_lambda_func/index.js 中我添加了这一行:

import { lock } from '../local_util/index.js';

最后,我在 my_lambda_func/ 目录中执行了

npm install --install-links ../local_util
,然后是
zip -qr function.zip .
。当我部署新的 function.zip 并调用其函数时,我在 CloudWatch 中收到
Cannot find module '/var/local_util/index.js' imported from /var/task/index.js
错误。

这是完整的错误:

{
    "errorType": "Error",
    "errorMessage": "Cannot find module '/var/local_util/index.js' imported from /var/task/index.js",
    "code": "ERR_MODULE_NOT_FOUND",
    "url": "file:///var/local_util/index.js",
    "stack": [
        "Error [ERR_MODULE_NOT_FOUND]: Cannot find module '/var/local_util/index.js' imported from /var/task/index.js",
        "    at new NodeError (node:internal/errors:406:5)",
        "    at finalizeResolution (node:internal/modules/esm/resolve:238:11)",
        "    at moduleResolve (node:internal/modules/esm/resolve:850:10)",
        "    at moduleResolveWithNodePath (node:internal/modules/esm/resolve:972:12)",
        "    at defaultResolve (node:internal/modules/esm/resolve:1091:79)",
        "    at ModuleLoader.defaultResolve (node:internal/modules/esm/loader:383:12)",
        "    at ModuleLoader.resolve (node:internal/modules/esm/loader:352:25)",
        "    at ModuleLoader.getModuleJob (node:internal/modules/esm/loader:228:38)",
        "    at ModuleWrap.<anonymous> (node:internal/modules/esm/module_job:85:39)",
        "    at link (node:internal/modules/esm/module_job:84:36)"
    ]
}
node.js aws-lambda es6-modules
1个回答
0
投票

我的解决方案是更改我的导入语句

import { lock } from '../local_util/index.js';

import { lock } from './node_modules/local_util/index.js';

这解决了这个问题,因为相对于我上传的 .zip 文件的根目录,

./node_modules/local_util/index.js
实际上是模块文件所在的位置。

© www.soinside.com 2019 - 2024. All rights reserved.