wake-up-neo.com

Erstellen einer Lambda-Funktion in AWS aus einer ZIP-Datei

Ich versuche, eine einfache Lambda-Funktion zu erstellen, und ich habe einen Fehler. 

Mein Code ist im Wesentlichen

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

in einer helloworld.js-Datei. Ich packe es hoch und lade es als Zip-Datei im Abschnitt zum Erstellen einer Lambda-Funktion hoch. Ich erhalte die folgende Fehlermeldung:

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

Hat jemand Ideen? 

43
jstnchng

Der Name Ihrer Datei muss mit dem Modulnamen in der Handler -Konfiguration übereinstimmen. In diesem Fall sollte Ihr Handler auf helloworld.handler gesetzt sein, wobei helloworld die Datei ist, die die Anforderung () 'd und handler die exportierte Funktion wäre. Dann sollte es mit der gleichen Zip-Datei funktionieren.

AWS Lambda configuration screenshot

66
James

Stellen Sie sicher, dass sich Ihre index.js im Stammverzeichnis der zip-Datei und nicht in einem Unterverzeichnis befindet.

In meinem Fall hatte ich den Namen des Moduls, der mit dem Namen der Datei und dem exportierten Handler übereinstimmte. Das eigentliche Problem war macOS und das Zip-Programm, das im Wesentlichen einen Ordner in der Zip-Datei erstellt endet in einem Unterverzeichnis.

Finder verwenden

Klicken Sie nicht mit der rechten Maustaste und komprimieren Sie das Verzeichnis , wählen Sie stattdessen die einzelnen Dateien der Dateien aus, wie index.js, package.json und das Verzeichnis node_modules, und klicken Sie zum Komprimieren mit der rechten Maustaste können Sie mit der Datei Archive.Zip im selben Verzeichnis enden. Der Name der Zip-Datei ist nicht besonders ausgefallen, aber zumindest funktioniert sie, wenn Sie sie an AWS Lambda übermitteln.

Verwenden der Befehlszeile

Sie könnten den gleichen Fehler machen, wenn Sie die Befehlszeile mit Zip -r function.Zip function verwenden, die im Grunde eine Zip-Datei mit einem Verzeichnis namens function darin erstellt.

$ Zip function.Zip index.js package.json node_modules

adding: index.js (deflated 47%)
adding: package.json (deflated 36%)
adding: node_modules/ (stored 0%)

Wie Sie Ihre ZIP-Datei überprüfen können

Wenn Sie Finder verwenden, doppelklicken Sie auf die ZIP-Datei, um sie in einem Unterverzeichnis zu dekomprimieren, kann Lambda die Datei nicht sehen, da sich index.js in diesem Unterverzeichnis befindet.

Verwenden der Befehlszeile und 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

Beachten Sie, wie index.js im Unterverzeichnis function gelandet ist. Sie haben es vermasselt .

$ zipinfo function.Zip | grep index.js | more
-rw-r--rw-  3.0 unx     1428 tx defN 27-Jul-16 12:21 index.js

Beachten Sie, dass sich index.js nicht in einem Unterordner befindet. Diese ZIP-Datei funktioniert in AWS Lambda .

Npm-Befehle zum Zip der Funktion nutzen

Also fügte ich meinem Paket ein Skript hinzu, um die Projektdateien für mich zu komprimieren, indem Sie einfach npm run Zip ausführen.

{
  "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%)
52
bithavoc

Hier ist ein Fortschritt mit AWS CLI. Es wird Ihre Zeit bei langfristiger Nutzung sparen.

Zunächst sollten Sie AWS CLI installieren und konfigurieren: 

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

1) Archiv erstellen 

$ Zip -r Lambda *

Es wird für uns eine Lambda.Zip-Datei mit allen Ordnern und Dateien an unserem aktuellen Speicherort erstellt.

2) Erhalte die Rolle ARN 

$ aws iam list-rolls | grep "deine_rolle"

Es wird uns ARN zurückgeben, das wir mit unserem Lambda verwenden werden. Sie sollten es mit Ihren Händen schaffen

Beispiel für Listenrollen

3) Erstelle unser Lambda

$ aws lambda create-function --Funktionsname "Ihr_Lambda-Name" --Zip-Datei DateiB: //lambda.Zip --handler index.handler --runtime nodejs6.10 --timeout 15 --role COPY_HERE_YOUR_ARN_FROM_THE_STEP_2

Wir sind fertig! 

4
Jingo Bingo

Automatisierung - Verwendung von Grunt

Komplettes AWS Lambda Seed Projekt ist auf Git verfügbar.

Schritt 1: Init npm-Modul

npm init

Schritt 2: Grunt installieren

npm install --save-dev grunt grunt-cli

Schritt 3:grunt-aws-lambda installieren

npm install --save-dev grunt-aws-lambda

Schritt 4: Ordner für Lambda-Dienst erstellen

# Create directory
mkdir lambdaTest

# Jump into folder
cd lambdaTest

# Create service file
touch lambdaTest.js

# Initialize npm
npm init

Behalten Sie Ihre Logik/Code in lambdaTest.js

'use strict'

exports.handler = (event, context, callback) => {
    console.log("Hello it's looks like working");
};

Schritt 5:Gruntfile.js erstellen

Navigieren Sie zurück zum Hauptordner 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']);
};

Schritt 6:awsCredentials.js erstellen

Erstellen Sie einen AWS IAM-Benutzer mit benutzerdefinierten Richtlinien. Benutzerdefinierte Richtlinien sollten Zugriff auf lambda:GetFunction, lambda:UploadFunction, lambda:UpdateFunctionCode, lambda:UpdateFunctionConfiguration und iam:PassRole haben.

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

Schritt 7: Erstellen Sie eine Zip und stellen Sie sie für AWS Lambda bereit.

ls-deploy ist eine benutzerdefinierte Aufgabe, die von oben in Gruntfile erstellt wurde. Dabei wird eine ZIP-Datei mit Quellcode erstellt und für Lambda bereitgestellt.

grunt ls-deploy

Komplettes AWS Lambda Seed Projekt ist auf Git verfügbar.

0
jaym