Cómo hacer una lambda AWS con Serverless y lanzarla en local con Serverless offline

GITHUB: https://github.com/apascualco/serverless-api

Parece que me he acostumbrado a poner primero el repositorio y después la pequeña explicación sobre el proyecto, ya que muchas veces que busco algo, simplemente quiero ver código.

SERVERLESS FRAMEWORK

Hace unos días me tocó hacer una lambda para AWS, utilizando el framework de Serverless. El proyecto ya estaba empezado y mi contribución sería bastante efímera, salvo que apliqué valor al proyecto ya existente.

Me gustaría, comentar profundamente que es y como funciona Serverless, pero está fuera de la intención practica de este post, pero no os dejaré sin información al respecto, Serverless parte 1.

PACKAGE.JSON y TSCONFIG.JSON

No puedo hablar mucho de typescript ya que he empezado con este lenguaje, hace relativamente poco y su configuración y gestión de packets por ahora es un ser por descubrir.

Por un lado tenemos el package.json

{
  "name": "serverless-scheduler",
  "version": "1.0.0",
  "description": "example of serverless",
  "main": "index.js",
  "scripts": {},
  "author": "Alberto Pascual",
  "license": "ISC",
  "engines": {
    "node": "12"
  },
  "dependencies": {
    "serverless-offline": "^6.7.0",
    "serverless-plugin-typescript": "^1.1.9",
    "typescript": "^4.0.2"
  },
  "devDependencies": {
    "@types/aws-lambda": "^8.10.61",
    "aws-lambda": "^1.0.6"
  }
}

Aquí podéis ver la definición del proyecto y ls librerías tanto de desarrollo y las de “producción”.

Las dependencias de “producción” son las mínimas necesarias para lanzar la aplicación de Serverless en “modo” offline.

Por otro lado tenemos la configuración de typescript tsconfig.json

{
  "compilerOptions": {
    "target": "ES2015",
    "module": "commonjs",
    "strict": true,
    "esModuleInterop": true,
    "skipLibCheck": true,
    "forceConsistentCasingInFileNames": true ,
    "rootDir": "./",
    "typeRoots": ["node_modules/@types"],
    "moduleResolution": "node"
  },
  "include" : ["./**/*"],
  "exclude" : ["node_modules", "build", "test"]
}

Poco que decir, es bastante auto explicativa. Pero básicamente definimos el target para la compilación, tipo del modulo y que se añadirá en el proyecto una vez hagamos el build.

SERVERLESS.YML

Cómo podéis ver el framework de Serverless, se configura, mediante yaml. Personalmente, me gusta dividir las funciones lambda en ficheros ya que estas en aws suelen crecer bastante de tamaño, por definición de roles, vpc, etc…

service: serverless-aws-provider

provider:
  name: aws
  runtime: nodejs8.10

plugins:
  - serverless-plugin-typescript
  - serverless-offline

functions:
  the-handler: ${file(configuration/the-handler.yml)}
  handler: src/example/example.handler
  description: "Serverles aws example"
  events:
    - http:
        path: hello/{id}
        method: get
        cors: true
        request:
            parameters:
                paths:
                    id: true

Esta sería la configuración, para publicar un “endpoint” con Serverless, obviamente aquí estaría definida toda la configuración extra de AWS.

Pero podemos ver lo mínimo necesario para poder desplegar esta lambda. Los plugin son necesarios para usar typescript (serverless-plugin-typescript), como para el modo offline (serverless-offline).

Si tenéis una pregunta muy concreta, sobre el funcionamiento, podéis contactar conmigo, será un placer ayudaros en lo que pueda.

THE HANDLER

import {
    APIGatewayProxyEventBase,
    APIGatewayProxyResult,
    Callback,
    Context,
    Handler
} from 'aws-lambda';

export const handler: Handler = async (event : APIGatewayProxyEventBase<any>, context: Context, callback: Callback<APIGatewayProxyResult>) => {

    const parametersGet: {[name:string]:string}|null  = event.pathParameters;

    if(parametersGet) {
        const id: string = parametersGet['id'];
        console.log(id);
        let result = {
            statusCode: 200,
            body: JSON.stringify(
                { id: id }
            ),
        };
        callback(
            null,
            result
        );
    }
}

Es un handler, bastante sencillo, utilizando un ejemplo de GET, cómo podéis ver en la configuración de Serverless.

Hablaremos en otro post sobre eventos de tipo scheduler y s3 notification, pero por ahora empezaremos con una forma muy sencilla.

CÓMO PROBARLO

Es bastante sencillo, una vez se han instalado los plugins necesarios

Cómo podéis ver en la imagen un simple “npm install” y “sls offline” nos desplegaría el Serverless en local

Deja una respuesta

A %d blogueros les gusta esto: