【问题标题】:code build to create lambda layer - cannot find module构建 lambda 层的代码 - 找不到模块
【发布时间】:2019-11-25 00:26:28
【问题描述】:

我想使用 codebuild 打包一个 lambda 层。

我的codebuild buildspec如下:

version: 0.2

phases:
  install:
    runtime-versions:
      nodejs: 10  
    commands:
      - npm init -y
      - npm install --save middy
artifacts:
  files:
    - 'node_modules/**/*'
    - 'package-lock.json'
    - 'package.json'

这会将 nodejs.zip 文件夹保存到我的 s3 存储桶中

生成的 zip 文件如下所示:

package.json 如下:

{
  "name": "src",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "keywords": [],
  "author": "",
  "license": "ISC",
  "dependencies": {
    "middy": "^0.30.4"
  }
}

但是当我将此层添加到我的 lambda (node10.x) 时

并导入我的模组:

'use strict';
var AWS = require('aws-sdk');
const middy = require('middy')
const { cors } = require('middy/middlewares')

返回以下错误:

{
  "errorType": "Runtime.ImportModuleError",
  "errorMessage": "Error: Cannot find module 'middy'\nRequire stack:\n- /var/task/function_code/verify_zipcode.js\n- /var/runtime/UserFunction.js\n- /var/runtime/index.js",
  "trace": [
    "Runtime.ImportModuleError: Error: Cannot find module 'middy'",
    "Require stack:",
    "- /var/task/function_code/verify_zipcode.js",
    "- /var/runtime/UserFunction.js",
    "- /var/runtime/index.js",
    "    at _loadUserApp (/var/runtime/UserFunction.js:100:13)",
    "    at Object.module.exports.load (/var/runtime/UserFunction.js:140:17)",
    "    at Object.<anonymous> (/var/runtime/index.js:43:30)",
    "    at Module._compile (internal/modules/cjs/loader.js:956:30)",
    "    at Object.Module._extensions..js (internal/modules/cjs/loader.js:973:10)",
    "    at Module.load (internal/modules/cjs/loader.js:812:32)",
    "    at Function.Module._load (internal/modules/cjs/loader.js:724:14)",
    "    at Function.Module.runMain (internal/modules/cjs/loader.js:1025:10)",
    "    at internal/main/run_main_module.js:17:11"
  ]
}

添加环境变量: NODE_PATH : ./:/opt/node_modules 让我的 lambda 访问我的层,但丢失了 aws-sdk 的上下文

添加环境变量后,我收到以下错误:

{
  "errorType": "Runtime.ImportModuleError",
  "errorMessage": "Error: Cannot find module 'aws-sdk'\nRequire stack:\n- /var/task/function_code/verify_zipcode.js\n- /var/runtime/UserFunction.js\n- /var/runtime/index.js",
  "trace": [
    "Runtime.ImportModuleError: Error: Cannot find module 'aws-sdk'",
    "Require stack:",
    "- /var/task/function_code/verify_zipcode.js",
    "- /var/runtime/UserFunction.js",
    "- /var/runtime/index.js",
    "    at _loadUserApp (/var/runtime/UserFunction.js:100:13)",
    "    at Object.module.exports.load (/var/runtime/UserFunction.js:140:17)",
    "    at Object.<anonymous> (/var/runtime/index.js:43:30)",
    "    at Module._compile (internal/modules/cjs/loader.js:956:30)",
    "    at Object.Module._extensions..js (internal/modules/cjs/loader.js:973:10)",
    "    at Module.load (internal/modules/cjs/loader.js:812:32)",
    "    at Function.Module._load (internal/modules/cjs/loader.js:724:14)",
    "    at Function.Module.runMain (internal/modules/cjs/loader.js:1025:10)",
    "    at internal/main/run_main_module.js:17:11"
  ]
}

有没有办法同时使用原生的aws-sdk 和我的图层?或者我是否需要在任何时候使用其他自定义图层时都使用aws-sdk 图层?

【问题讨论】:

    标签: aws-lambda aws-lambda-layers


    【解决方案1】:

    node.js 层的目录结构(在您的示例中为 nodejs.zip)应该是:

    ├── nodejs
      └── package.json
      └── node_modules
              └── middy(version z.z.z)
    

    更新您的 buildspec 文件以添加父 nodejs 文件夹:

    version: 0.2
    
    phases:
      install:
        runtime-versions:
          nodejs: 10  
        commands:
          - mkdir nodejs           # NEW LINE
          - cd nodejs              # NEW LINE
          - npm init -y
          - npm install bcrypt
    
    artifacts:
      files:
        - 'nodejs/**/*'            # CHANGE LINE
        - 'package.json'
    

    并删除环境变量: NODE_PATH

    【讨论】:

    • 当 nodejs.zip 解压缩时它位于 nodejs 文件夹中 - 它是否需要是 nodejs/nodejs/...
    • 你写这篇文章时我没有看到任何 nodejs 文件夹生成的 zip 文件如下所示:
    • 那是因为我在 windows 10 中浏览 zip 文件,我没有解压缩它。当您解压缩文件夹时,它会自动将内容放入与 zip 文件夹同名的文件夹中
    • 让我们调用你的 zip nodejs_test,当你解压它时你应该看到 nodejs->node_modules,当你在 windows 10 中浏览 zip 文件时,第一个目录应该是 nodejs
    • 如果我调用的是 nodejs_test.zip,当我解压缩它时,我会看到 nodejs_test/node_modules
    猜你喜欢
    • 2019-08-27
    • 1970-01-01
    • 2015-08-21
    • 2017-09-17
    • 1970-01-01
    • 2020-08-03
    • 2020-11-24
    • 2021-08-09
    相关资源
    最近更新 更多