web-dev-qa-db-fra.com

Création d'une fonction lambda dans AWS à partir d'un fichier Zip

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? 

43
jstnchng

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.

AWS Lambda configuration screenshot

66
James

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.

Utiliser le Finder

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.

Utiliser la ligne de commande

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%)

Comment savoir vérifier votre fichier Zip

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.

Exploitation des commandes npm pour compresser la fonction

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

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

Exemple pour list-roles

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! 

4
Jingo Bingo

Automatisation - en utilisant 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.

0
jaym