J'essaie de créer une fonction lambda simple et je rencontre une erreur.
Mon code est fondamentalement
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');
}
dans un fichier helloworld.js. Je compresse le fichier et le télécharge en tant que fichier Zip dans la section de création d’une fonction lambda, et l’erreur persiste:
{
"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)"
]
}
Quelqu'un a des idées?
Le nom de votre fichier doit correspondre au nom du module dans la configuration Handler. Dans ce cas, votre gestionnaire doit être défini sur helloworld.handler
, où helloworld
est le fichier qui serait require () 'd et handler
est la fonction exportée. Ensuite, cela devrait fonctionner avec le même fichier Zip.
Assurez-vous que votre index.js se trouve à la racine du fichier zip et non dans un sous-répertoire.
Dans mon cas, le nom du module correspond au nom du fichier et du gestionnaire exporté. Le véritable problème était macOS et le programme Zip, qui crée un dossier dans le fichier Zip. Ainsi, lorsqu'il est décompressé dans le moteur AWS Lambda, index.js se termine dans un sous-répertoire.
Ne pas cliquer avec le bouton droit de la souris et ne pas compresser le répertoire, sélectionnez plutôt les fichiers tels que index.js, package.json et le répertoire node_modules, puis cliquez avec le bouton droit de la souris. Pour compresser, vous pouvez vous retrouver avec un fichier Archive.Zip dans le même répertoire. Le nom du fichier Zip ne va pas être compliqué, mais au moins cela fonctionnera lorsque vous le soumettez à AWS Lambda.
Vous pouvez commettre la même erreur en utilisant la ligne de commande avec Zip -r function.Zip function
qui crée en gros un fichier Zip contenant un répertoire appelé function
; faites plutôt:
$ Zip function.Zip index.js package.json node_modules
adding: index.js (deflated 47%)
adding: package.json (deflated 36%)
adding: node_modules/ (stored 0%)
Si vous utilisez Finder, si vous double-cliquez sur le fichier Zip et le décompressez dans un sous-répertoire, Lambda ne pourra pas voir le fichier sous la forme index.js réside dans ce sous-répertoire.
Utilisation de ligne de commande _ et 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
Remarquez comment index.js a fini dans le sous-répertoire function
, vous avez foiré.
$ zipinfo function.Zip | grep index.js | more
-rw-r--rw- 3.0 unx 1428 tx defN 27-Jul-16 12:21 index.js
Notez que index.js ne se trouve pas dans un sous-dossier, ce fichier Zip fonctionnera dans AWS Lambda.
J'ai donc ajouté un script à mon paquet pour compresser les fichiers de projet simplement en exécutant 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
> [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%)
Voici un moyen avancé avec AWS CLI. Cela vous fera gagner du temps en utilisation à long terme.
Tout d'abord, vous devez installer et configurer AWS CLI:
http://docs.aws.Amazon.com/cli/latest/userguide/installing.html
1) Créer une archive
$ Zip -r lambda *
Il créera pour nous le fichier lambda.Zip avec tous les dossiers et fichiers de notre emplacement actuel.
2) Obtenir le rôle ARN
$ aws iam list-roles | grep "votre_role"
Il nous reviendra ARN que nous utiliserons avec notre lambda. Vous devriez le créer par vos mains
3) Créer notre lambda
$ aws lambda create-function --function-name "your_lambda_name" --Zip-fichier fichierb: //lambda.Zip --handler index.handler --runtime nodejs6.10 --timeout 15 --role COPY_HERE_YOUR_ARN_FROM_THE_STEP_2
Nous avons fini!
Grunt
Complet AWS Lambda Seed le projet est disponible sur Git.
Étape 1: Init npm module
npm init
Étape 2: Installez Grunt
npm install --save-dev grunt grunt-cli
Étape 3: Installez grunt-aws-lambda
npm install --save-dev grunt-aws-lambda
Étape 4: Créer un dossier pour le service Lambda
# Create directory
mkdir lambdaTest
# Jump into folder
cd lambdaTest
# Create service file
touch lambdaTest.js
# Initialize npm
npm init
Gardez votre logique/code dans lambdaTest.js
'use strict'
exports.handler = (event, context, callback) => {
console.log("Hello it's looks like working");
};
Étape 5: Créer Gruntfile.js
Revenez au dossier racine 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']);
};
Étape 6: Créer awsCredentials.js
Créer un utilisateur AWS IAM avec une stratégie personnalisée, la stratégie personnalisée doit avoir accès à lambda:GetFunction
, lambda:UploadFunction
, lambda:UpdateFunctionCode
, lambda:UpdateFunctionConfiguration
et iam:PassRole
{
"accessKeyId": "XXXXXXXXXXXXXXXXXXXX",
"secretAccessKey": "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"
}
Étape 7: Créez un zip et déployez-le sur AWS Lambda.
ls-deploy
est une tâche personnalisée créée par dans Gruntfile ci-dessus, qui crée un zip du code source et se déploie sur Lambda.
grunt ls-deploy
Complet AWS Lambda Seed le projet est disponible sur Git.