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?
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.
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.
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.
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%)
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 .
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%)
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
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!
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.