AWS Lambda函数子目录中的处理程序未运行

时间:2017-03-30 17:16:31

标签: node.js amazon-web-services aws-lambda

我在Lambda上遇到了一个非常不幸的错误:

Unable to import module 'lib/index': Error
at require (internal/module.js:20:19)

这很奇怪,因为肯定有一个名为handler的函数从lib/index导出...不确定整个子目录是否对其他人来说是个问题所以我想问一下。

SAM-template.yaml

AWSTemplateFormatVersion: '2010-09-09'
Transform: AWS::Serverless-2016-10-31
Description: Does something crazy
Resources:
  SomeFunction:
    Type: AWS::Serverless::Function
    Properties:
      Handler: lib/index.handler
      Role: arn:aws:iam::...:role/lambda-role
      Runtime: nodejs6.10
      Timeout: 10
      Events:
        Timer:
          Type: Schedule
          Properties:
            Schedule: rate(1 minute)

模块结构

|-- lib
|     `-- index.js
`-- src
      `-- index.js

我已经在这里嵌套了,因为我在构建过程中使用以下内容来编译ES6,摘自package.json"build": "babel src -d lib"

buildspec.yaml

version: 0.1
phases:
    install:
        commands:
            - npm install
            - aws cloudformation package --template-file sam-template.yaml --s3-bucket some-bucket --output-template-file compiled-sam-template.yaml
    build:
        commands:
            - npm run build
    post_build:
        commands:
            - npm prune --production
artifacts:
    files:
        - 'node_modules/**/*'
        - 'lib/**/*'
        - 'compiled-template.yaml'

3 个答案:

答案 0 :(得分:2)

您正在尝试导入lib/index,它会尝试查找名为lib的包,就像您npm install --save lib一样,但您最有可能尝试导入相对于您自己项目的文件并且你没有在导入中给它一个相对路径。

'lib/index'更改为'./lib/index' - 或'../lib/index'等 - 取决于具体位置,看看是否有帮助。

顺便说一句,如果您尝试导入文件lib/index.js而不是目录lib/import/,那么您可以使用较短的./lib路径,如:

const lib = require('./lib');

当然,你甚至没有显示一行代码,所以我只能猜出你在做什么。

答案 1 :(得分:2)

aws cloudformation package命令正在运送构建的资产,该资产在显示的代码的install阶段运行。将其移至post_build将确保其捕获所需的所有内容,包括相关的lib/index

post_build:
  commands:
    - npm prune --production
    - aws cloudformation package ...

答案 2 :(得分:0)

对处理程序的引用必须与要执行的 lambda 相关;

例如: 如果文件 lambda 放在路径中:

x-lambda/yyy/lambda.py

处理程序必须是:

..yyy/lambda.lambda_handler

假设在 lambda.py 中存在函数: lambda_handler()