tutorial trigger que funcion example crear aws javascript node.js amazon-web-services aws-lambda

javascript - trigger - Crear una función lambda en AWS desde un archivo zip



que es lambda aws (5)

Automatización: usando Grunt

El proyecto completo AWS Lambda Seed está disponible en Git.

Paso 1: módulo Init npm

npm init

Paso 2: instala Grunt

npm install --save-dev grunt grunt-cli

Paso 3: instala grunt-aws-lambda

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

Paso 4: Crear carpeta para el servicio Lambda

# Create directory mkdir lambdaTest # Jump into folder cd lambdaTest # Create service file touch lambdaTest.js # Initialize npm npm init

Mantenga su lógica / código en lambdaTest.js

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

Paso 5: Gruntfile.js

Navega de regreso a la carpeta raíz 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'']); };

Paso 6: awsCredentials.js

Crear usuario AWS IAM con política personalizada, la política personalizada debe tener acceso a lambda:GetFunction , lambda:UploadFunction , lambda:UpdateFunctionCode , lambda:UpdateFunctionConfiguration y iam:PassRole

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

Paso 7: cree un zip e impleméntelo en AWS Lambda.

ls-deploy es una tarea personalizada creada por Gruntfile arriba, que crea un código postal de origen y se implementa en Lambda.

grunt ls-deploy

El proyecto completo AWS Lambda Seed está disponible en Git.

Intento crear una función lambda simple, y me encuentro con un error.

Mi código es básicamente

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

en un archivo helloworld.js Lo compruebo y lo cargo como un archivo zip en la creación de una sección de función lambda, y sigo recibiendo este error:

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

¿Alguien tiene alguna idea?


Aquí hay una forma avanzada con AWS CLI. Le ahorrará tiempo en el uso a largo plazo.

En primer lugar, debe instalar y configurar AWS CLI:

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

1) Crea un archivo

$ zip -r lambda *

Creará para nosotros el archivo lambda.zip con todas las carpetas y archivos en nuestra ubicación actual.

2) Obtener el rol de ARN

$ aws iam list-roles | grep "your_role"

Nos devolverá ARN que usaremos con nuestra lambda. Debes crearlo con tus manos

Ejemplo para roles de lista

3) Crea nuestra lambda

$ aws lambda create-function --function-name "your_lambda_name" --zip-file fileb: //lambda.zip --handler index.handler --runtime nodejs6.10 --timeout 15 --role COPY_HERE_YOUR_ARN_FROM_THE_STEP_2

¡Hemos terminado!


Asegúrese de que su index.js esté en la raíz del archivo zip y no en un subdirectorio.

En mi caso, tenía el nombre del módulo que coincidía con el nombre del archivo y el manejador exportado, el verdadero problema era macOS y el programa zip que básicamente creaba una carpeta dentro del archivo comprimido, por lo que cuando descomprimimos en el motor AWS Lambda index.js termina en un subdirectorio

Usando Finder

No haga clic con el botón derecho y comprima el directorio ; en su lugar, seleccione los archivos individuales como index.js , package.json y node_modules y haga clic con el botón derecho para comprimir, puede terminar con un archivo Archive.zip en el mismo directorio. El nombre del archivo zip no va a ser elegante, pero al menos funcionará cuando lo envíe a AWS Lambda.

Usando la línea de comando

Usted podría cometer el mismo error al usar la línea de comando con la zip -r function.zip function que básicamente crea un archivo zip con un directorio llamado function en su lugar lo hace:

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

Cómo saber verificar tu archivo zip

Con el buscador , si hace doble clic en el archivo zip y descomprime en un subdirectorio, entonces Lambda no podrá ver el archivo como index.js vive en ese subdirectorio.

Usando la línea de comando y 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

Observe cómo index.js terminó dentro de la function del subdirectorio, lo arruinó .

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

Tenga en cuenta que index.js no está dentro de una subcarpeta, este archivo comprimido funcionará en AWS Lambda .

Aprovechar los comandos npm para comprimir la función

Así que agregué un script a mi paquete para comprimir los archivos del proyecto por mí simplemente ejecutando 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%)


El nombre de su archivo debe coincidir con el nombre del módulo en la configuración del controlador . En este caso, su controlador debe configurarse en helloworld.handler , donde helloworld es el archivo que sería require () ''d y handler es la función exportada. Entonces debería funcionar con el mismo archivo zip.


Es porque en exports.handler, no hace referencia a la función de índice. Esto se puede resolver de una manera más simple

Prueba esto,

console.log(''Loading function''); exports.handler = function index (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''); }