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

Creating a lambda function in AWS from zip file

我正在尝试创建一个简单的 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)"
  ]
}

有没有人有什么想法?

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

确保您的 index.js 位于 zip 文件的根目录中,而不是子目录中。

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

使用访达

不要右键单击并压缩目录,而是 select 单个文件 index.js, package.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%)

自动化 - 使用 Grunt

完成AWS Lambda Seed project is available on 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

让你的 logic/code 变成 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 project is available on Git.

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

这是 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"

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

Example for list-roles

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

我们完成了!

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

问。你必须做什么?
答案 - 以下是步骤:

  1. 进入文件夹 'sample'。
  2. select 所有必需的文件或子文件夹。
  3. 右键单击任何一个并select发送至。
  4. 您会看到 Archive.zip,只需将它保存在您的笔记本电脑中的任何地方 想要。
  5. 将此 zip 上传为亚马逊 lambda 函数。

Q.What不做?
Ans - 不要压缩 'sample' 文件夹。不行。