52

単純なラムダ関数を作成しようとしていますが、エラーが発生しています。

私のコードは基本的に

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 ファイルとしてアップロードすると、次のエラーが発生し続けます。

{
  "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

60

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 ファイルをダブルクリックしてサブディレクトリで解凍すると、index.js がそのサブディレクトリに存在するため、Lambda はファイルを表示できません。

コマンドラインとを使用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 に答える
0

自動化 - 使用Grunt

完全なAWS Lambda シードプロジェクトは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:GetFunctionです。lambda:UploadFunctionlambda:UpdateFunctionCodelambda:UpdateFunctionConfigurationiam:PassRole

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

ステップ 7: zip を作成し、AWS Lambda にデプロイします。

ls-deploy上記の Gruntfile で作成されたカスタム タスクで、ソース コードの zip を作成し、Lambda にデプロイします。

grunt ls-deploy

完全なAWS Lambda シードプロジェクトはGit で入手できます。

于 2016-12-10T09:01:30.383 に答える