52

我正在尝试创建一个简单的 lambda 函数,但遇到了错误。

我的代码基本上是

console.log('Loading function');

exports.handler = function(event, context) {
    console.log('value1 =', event.key1);
    console.log('value2 =', event.key2);
    console.log('value3 =', event.key3);
    context.succeed(event.key1);  // Echo back the first key value
    // context.fail('Something went wrong');
}

在 helloworld.js 文件中。我将其压缩并将其作为 zip 文件上传到创建 lambda 函数部分,但我不断收到此错误:

{
  "errorMessage": "Cannot find module 'index'",
  "errorType": "Error",
  "stackTrace": [
    "Function.Module._resolveFilename (module.js:338:15)",
    "Function.Module._load (module.js:280:25)",
    "Module.require (module.js:364:17)",
    "require (module.js:380:17)"
  ]
}

有没有人有任何想法?

4

6 回答 6

68

您的文件名称需要与Handler配置中的模块名称匹配。在这种情况下,您的 Handler 应设置为helloworld.handler,其中helloworld将是 require()'d 的文件并且handler是导出的函数。然后它应该使用相同的 zip 文件。

AWS Lambda 配置截图

于 2015-06-05T17:02:56.323 回答
60

确保您的 index.js 在 zipfile 的根目录中,而不是在子目录中。

在我的情况下,我的模块名称与文件名称和导出的处理程序匹配,真正的问题是 macOS 和 zip 程序,它基本上在 zip 文件中创建一个文件夹,因此在 AWS Lambda 引擎中解压缩时 index.js以子目录结尾。

使用查找器

不要右键压缩目录,而是选择index.jspackage.jsonnode_modules目录等文件单独文件并右键单击压缩,您最终可能会在同一目录中得到一个文件 Archive.zip 。zip 文件的名称不会花哨,但至少在您将其提交到 AWS Lambda 时它会起作用。

使用命令行

您可能会使用命令行犯同样的错误,该命令行zip -r function.zip function基本上会创建一个 zip 文件,其中包含一个名为的目录function,而是执行以下操作:

$ zip function.zip index.js package.json node_modules

adding: index.js (deflated 47%)
adding: package.json (deflated 36%)
adding: node_modules/ (stored 0%)

如何知道验证您的 zip 文件

使用finder,如果您双击 zip 文件并将其解压缩到子目录中,则 Lambda 将无法看到该文件,因为 index.js 位于该子目录中。

使用命令行zipinfo

$ zipinfo function.zip | grep index.js | more
-rw-r--rw-  2.1 unx     1428 bX defN 27-Jul-16 12:21 function/index.js

注意 index.js 是如何在子目录中结束的function你搞砸了

$ zipinfo function.zip | grep index.js | more
-rw-r--rw-  3.0 unx     1428 tx defN 27-Jul-16 12:21 index.js

请注意, index.js 不在子文件夹中,此 zip 文件将在 AWS Lambda中运行。

利用 npm 命令压缩函数

所以我在我的包中添加了一个脚本,只需运行即可为我压缩项目文件npm run zip

{
  "name": "function",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "scripts": {
    "zip": "zip function.zip package.json *.js node_modules"
  },
  "dependencies": {
    "aws-sdk": "^2.4.10"
  }
}

$ npm run zip

> function@1.0.0 zip 
> zip function.zip package.json *.js node_modules

  adding: package.json (deflated 41%)
  adding: index.js (deflated 47%)
  adding: local.js (deflated 42%)
  adding: node_modules/ (stored 0%)
于 2016-07-27T21:27:21.837 回答
8

这是使用 AWS CLI 的一种高级方法。它将在长期使用中节省您的时间。

首先,您应该安装和配置 AWS CLI:

http://docs.aws.amazon.com/cli/latest/userguide/installing.html

1) 创建档案

$ zip -r 拉姆达 *

它将为我们创建 lambda.zip 文件,其中包含我们当前位置的所有文件夹和文件。

2) 获取角色 ARN

$ aws iam 列表角色 | grep“你的角色”

它将返回给我们将与 lambda 一起使用的 ARN。你应该亲手创造它

列表角色示例

3) 创建我们的 lambda

$ aws lambda create-function --function-name "your_lambda_name" --zip-file fileb://lambda.zip --handler index.handler --runtime nodejs6.10 --timeout 15 --role COPY_HERE_YOUR_ARN_FROM_THE_STEP_2

我们完了!

于 2017-04-07T19:39:00.783 回答
0

让我们以一个名为“ sample ”的文件夹为例,我们要压缩它。让我们假设示例文件夹中有一些子文件夹或文件。

问:你必须做什么?
Ans - 以下是步骤:

  1. 进入文件夹“样本”。
  2. 选择所有需要的文件或子文件夹。
  3. 右键单击任何一个并选择发送到。
  4. 您将看到 Archive.zip,只需将其保存在您的笔记本电脑中您想要的任何位置。
  5. 将此 zip 上传为 amazon lambda 函数。

Q.什么不能做?
Ans - 不要压缩“样本”文件夹。它行不通。

于 2020-11-10T06:18:31.017 回答
0

自动化 - 使用Grunt

Git上提供了完整的AWS Lambda Seed项目。

第 1 步:初始化 npm 模块

npm init

第 2 步:安装 Grunt

npm install --save-dev grunt grunt-cli

第 3 步:安装grunt-aws-lambda

npm install --save-dev grunt-aws-lambda

第 4 步:为 Lambda 服务创建文件夹

# Create directory
mkdir lambdaTest

# Jump into folder
cd lambdaTest

# Create service file
touch lambdaTest.js

# Initialize npm
npm init

将您的逻辑/代码保存在lambdaTest.js

'use strict'

exports.handler = (event, context, callback) => {
    console.log("Hello it's looks like working");
};

第 5 步:创建Gruntfile.js

导航回根文件夹 touch Gruntfile.js

'use strict'
module.exports = function (grunt) {
    grunt.initConfig({
        lambda_invoke: {
            lambdaTest: {
                options: {
                    file_name: "lambdaTest/lambdaTest.js",
                    event: "lambdaTest/test.json",
                }
            }
        },
        lambda_package: {
            lambdaTest: {
                options: {
                    package_folder: 'lambdaTest/'
                }
            }
        },
        lambda_deploy: {
            lambdaTest: {
                arn: 'arn:aws:lambda:eu-central-1:XXXXXXXX:function:lambdaTest',
                options: {
                    credentialsJSON: 'awsCredentials.json',
                    region: "eu-central-1"
                },
            }
        },
    });

    grunt.loadNpmTasks('grunt-aws-lambda');


    grunt.registerTask('ls-deploy', ['lambda_package:lambdaTest', 'lambda_deploy:lambdaTest']);
};

第 6 步:创建awsCredentials.js

使用自定义策略创建 AWS IAM 用户,自定义策略应有权访问lambda:GetFunctionlambda:UploadFunctionlambda:UpdateFunctionCodelambda:UpdateFunctionConfigurationiam:PassRole

{
    "accessKeyId": "XXXXXXXXXXXXXXXXXXXX",
    "secretAccessKey": "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"
}

第 7 步:创建 zip 并部署到 AWS Lambda。

ls-deploy是在上面的 Gruntfile 中创建的自定义任务,它创建源代码的 zip 并部署到 Lambda。

grunt ls-deploy

Git上提供了完整的AWS Lambda Seed项目。

于 2016-12-10T09:01:30.383 回答
-3

这是因为在exports.handler 中,您没有引用索引函数。这可以用更简单的方式解决

尝试这个,

console.log('Loading function');

    exports.handler = function index (event, context) {
        console.log('value1 =', event.key1);
        console.log('value2 =', event.key2);
        console.log('value3 =', event.key3);
        context.succeed(event.key1);  // Echo back the first key value
        // context.fail('Something went wrong');
    }
于 2017-01-20T12:51:19.833 回答