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

umuewwlo  于 2023-02-18  发布在  Node.js
关注(0)|答案(7)|浏览(159)

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

有人有什么想法吗?

lqfhib0f

lqfhib0f1#

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

jv4diomz

jv4diomz2#

确保index.js位于zip文件的根目录中,而不是子目录中。
在我的例子中,模块的名称与文件和导出的处理程序的名称相匹配,真实的的问题是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%)
wqlqzqxt

wqlqzqxt3#

这里是一个先进的方法与AWS的CLI。它将保存您的时间在长期使用。
首先,您应该安装和配置AWS CLI:
http://docs.aws.amazon.com/cli/latest/userguide/installing.html

1)创建存档

$ zip -r字符串 *
它将为我们创建lambda.zip文件,其中包含当前位置中的所有文件夹和文件。

2)获取角色ARN

$ aws iam列表角色|grep“您的角色”
它将返回给我们ARN,我们将在lambda中使用它。您应该手动创建它
Example for list-roles

3)创建我们的lambda

$ aws lambda创建函数**--函数名称**“您的lambda名称”--压缩文件文件b:lambda.zip**--处理程序索引处理程序--运行时节点js6.10--超时15--角色**COPY_HERE_YOUR_ARN_FROM_THE_STEP_2
我们完了!

pes8fvy9

pes8fvy94#

自动化-使用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.上获得

au9on6nz

au9on6nz5#

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

问:你要做什么?

答:具体步骤如下:
1.进入文件夹“sample”。
1.选择所有需要的文件或子文件夹。
1.右键单击任意一个并选择发送到。
1.您将看到Archive.zip,只需将其保存在您的笔记本电脑中的任何地方。
1.将此zip作为Amazon lambda函数上传。

问:什么不该做?

答:不要压缩“示例”文件夹。它不会工作。

mwg9r5ms

mwg9r5ms6#

当您使用错误的运行库语言时,也会发生同样的错误

uqjltbpv

uqjltbpv7#

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

相关问题