web-dev-qa-db-ja.com

AWSでZipファイルからラムダ関数を作成する

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

私のコードは基本的に

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

誰にもアイデアはありますか?

47
jstnchng

ファイルの名前は、Handler構成のモジュール名と一致する必要があります。この場合、ハンドラはhelloworld.handlerに設定する必要があります。helloworldはrequire() 'dされるファイルで、handlerはエクスポートされた関数です。その後、同じZipファイルで動作するはずです。

AWS Lambda configuration screenshot

66
James

Index.jsがサブディレクトリではなく、zipファイルのルートにあることを確認してください。

私の場合、ファイルの名前とエクスポートされたハンドラーに一致するモジュールの名前がありました。本当の問題はmacOSと、Zipファイル内に基本的にフォルダーを作成するZipプログラムでした。サブディレクトリで終了します。

ファインダーを使用する

ディレクトリを右クリックして圧縮しないでください、代わりに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を実行するだけでプロジェクトファイルを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

> [email protected] 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%)
54
bithavoc

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が返されます。手で作成する必要があります

list-rolesの例

3)ラムダを作成します

$ aws lambda create-function-function-name "your_lambda_name"-Zip-filefileb://lambda.Zip-handlerindex.handler-runtimenodejs6.10-timeout15-roleCOPY_HERE_YOUR_ARN_FROM_THE_STEP_2

できました!

6
Jingo Bingo

自動化-Gruntを使用

完全 AWS Lambda Seed プロジェクトは Git。 で利用可能

ステップ1:Init npm module

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:Create 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:UpdateFunctionConfigurationおよびiam:PassRoleへのアクセス権が必要です

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

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

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

grunt ls-deploy

完全 AWS Lambda Seed プロジェクトは Git。 で利用可能

0
jaym