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