首页 > 解决方案 > 无法在 AWS Lambda 层上上传 npm 依赖项

问题描述

我有一个 .zip 文件,其中包含 node_modules 和一个 utils 文件夹,
我将 .zip 上传到 AWS Lambda 层,但我无法获取 AWS Lambda 函数的所有依赖项,

我相信问题可能与 package.json 有关,但
我尝试删除 node_modules、package-lock.json 并使用npm install命令重新安装依赖项。
依赖项似乎是在本地下载的,但是当我将它们上传到图层时,它们就消失了。

根文件夹 - 在此处输入图像描述

图层文件夹下的子目录 - 在此处输入图像描述

节点模块 - 在此处输入图像描述

包.json-

{
  "name": "serverless-currency",
  "version": "1.0.0",
  "description": "Lambda APIs for G2G Currency Module",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1",
    "debug": "SLS_DEBUG=* sls offline start"
  },
  "author": "Aniruddha Raje",
  "license": "ISC",
  "dependencies": {
    "async": "^2.6.2",
    "aws-sdk": "^2.447.0",
    "axios": "^0.18.0",
    "cryptr": "^4.0.2",
    "jsonwebtoken": "^8.5.1",
    "moment": "^2.24.0",
    "serverless-offline": "^4.9.4",
    "util": "^0.12.0"
  }
}

AWS Lambda 代码 -

var fs = require('fs');
var async = require('async');

exports.handler = async (event) => {

    const testFolder = '/opt/layer/node_modules';

    fs.readdirSync(testFolder).forEach(file => {
  console.log(file);
});
};

Lambda 错误 -

{
  "errorMessage": "Cannot find module 'async'",
  "errorType": "Error",
  "stackTrace": [
    "Function.Module._load (module.js:474:25)",
    "Module.require (module.js:596:17)",
    "require (internal/module.js:11:18)",
    "Object.<anonymous> (/var/task/index.js:2:13)",
    "Module._compile (module.js:652:30)",
    "Object.Module._extensions..js (module.js:663:10)",
    "Module.load (module.js:565:32)",
    "tryModuleLoad (module.js:505:12)",
    "Function.Module._load (module.js:497:3)"
  ]
}

参考 -
https://medium.com/@anjanava.biswas/nodejs-runtime-environment-with-aws-lambda-layers-f3914613e20e

是否必须命名根文件夹,以便可以使用导入nodejs直接访问 node_module 库, 以便代码不需要指定 /opt/node_modules/async 路径? 指定绝对路径时,代码运行没有错误。let async = require('async')

标签: node.jsamazon-web-servicesaws-lambda

解决方案


你的目录结构错了。在官方文档(这里)中,你需要一个结构类似layer/nodejs/node_modules的目录,nodejs目录名称不是随机的,必须是nodejs

layer
|
|__nodejs
     |
     |__node_modules
            |
            |__node_module1
            |
            |__async

现在你需要将nodejs目录压缩到nodejs.zip(或任何你想要的)并使用这个文件来创建你的层。


推荐阅读