从zip文件在AWS中创建lambda函数

时间:2015-06-05 16:02:24

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

我正在尝试创建一个简单的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文件中。我将其压缩并在创建lambda函数部分时将其作为zip文件上传,我不断收到此错误:

{
  "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)"
  ]
}

有人有什么想法吗?

6 个答案:

答案 0 :(得分:66)

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

AWS Lambda configuration screenshot

答案 1 :(得分:54)

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

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

使用Finder

不要右键单击并压缩目录,而是选择单个文件,例如 index.js package.json node_modules 目录并右键单击以进行压缩,最终可能会在同一目录中找到Archive.zip文件。 zip文件的名称不会很花哨但至少在将它提交给AWS Lambda时会起作用。

使用命令行

使用zip -r function.zip function命令行可能会犯同样的错误,该命令行基本上会创建一个名为function的目录的zip文件,而不是:

$ 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%)

答案 2 :(得分:6)

这是AWS CLI的一种先进方法。它可以节省您长期使用的时间。

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

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

1)创建档案

  

$ zip -r lambda *

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

2)获取角色ARN

  

$ aws iam list-roles | grep“your_role”

它将返回给我们ARN,我们将使用我们的lambda。你应该用手创造

Example for list-roles

3)创建我们的lambda

  

$ aws lambda create-function - function-name “your_lambda_name” - zip-file fileb://lambda.zip - handler < / strong> index.handler - 运行时 nodejs6.10 - 超时 15 - 角色 COPY_HERE_YOUR_ARN_FROM_THE_STEP_2

我们完成了!

答案 3 :(得分:0)

自动化 - 使用Grunt

AWS Lambda Seed

上提供了完整的Git.项目

第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创建的自定义任务,它创建一个源代码压缩并部署到Lambda。

grunt ls-deploy

AWS Lambda Seed

上提供了完整的Git.项目

答案 4 :(得分:0)

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

问。你该怎么办?
Ans-以下是步骤:

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

问:该怎么办?
回答-不要压缩“样本”文件夹。这行不通。

答案 5 :(得分:-2)

因为在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');
    }