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