Lambdas Seguras y Ligeras con Serverless

Javier Batres
4 min readApr 4, 2023

En este artículo, exploraremos cómo crear un proyecto en Typescript con Serverless utilizando AWS Lambda con layers y un authorizer custom. A diferencia del proyecto con NX, este proyecto no utilizará NX, sino que estará configurado manualmente.

Introducción

El uso de Serverless en aplicaciones modernas se ha vuelto cada vez más popular en los últimos años. AWS Lambda es uno de los servicios de computación sin servidor más populares que se utilizan para ejecutar código sin necesidad de administrar servidores.

En este tutorial, aprenderemos cómo crear un proyecto en Typescript con Serverless utilizando AWS Lambda. También veremos cómo utilizar layers y un authorizer custom en nuestro proyecto.

Requisitos previos

  • Conocimiento básico de AWS Lambda y Serverless Framework
  • Node.js instalado
  • Cuenta de AWS con credenciales de IAM

Paso 1: Configuración del proyecto

En primer lugar, debemos configurar nuestro proyecto. Para hacerlo, crearemos un nuevo directorio y ejecutaremos el siguiente comando para crear un archivo package.json en nuestro directorio.

npm init -y

Luego, necesitamos instalar el framework Serverless. Podemos hacerlo mediante el siguiente comando:

npm install -b serverless

Paso 2: Crear un proyecto de serverless

En segundo lugar, crearemos una función Lambda en nuestro proyecto. Para hacerlo, ejecutaremos el siguiente comando en nuestro directorio raíz.

serverless create --template aws-nodejs --path my-service

Este comando creará una nueva carpeta llamada my-service, que contendrá el código inicial de una función Lambda en Node.js.

Paso 3: Configuración del authorizer custom

Ahora, vamos a configurar un authorizer custom para nuestra función Lambda. El authorizer custom es una función que se ejecuta antes de que se ejecute la función Lambda para autenticar al usuario. Para hacerlo, creamos un nuevo archivo llamado auth.ts en la carpeta my-service.

import { APIGatewayTokenAuthorizerHandler } from 'aws-lambda';

export const handler: APIGatewayTokenAuthorizerHandler = async (event) => {
const token = event.authorizationToken;
if (token !== 'mysecrettoken') {
throw new Error('Unauthorized');
}
const principalId = 'user';
const policy = {
principalId,
policyDocument: {
Version: '2012-10-17',
Statement: [
{
Action: 'execute-api:Invoke',
Effect: 'Allow',
Resource: event.methodArn,
},
],
},
};
return policy;
};

En este ejemplo, nuestro authorizer custom simplemente válida el token de autorización y devuelve un policy de AWS que permite la ejecución de la función Lambda.

Paso 4: Configuración de layers

En cuarto lugar, vamos a configurar una capa (layer) para nuestra función Lambda. Las capas son archivos o bibliotecas comunes que se pueden compartir entre varias funciones Lambda.

Lo primero que debemos hacer es crear una estructura de carpetas para nuestro proyecto. Dentro de la carpeta raíz, crearemos una carpeta layers y dentro de ella una carpeta con el nombre de la capa que queramos crear, por ejemplo my-layer.

Una vez creada la estructura de carpetas, debemos agregar un archivo package.json dentro de la carpeta my-layer, con la siguiente información:

{
"name": "my-layer",
"version": "1.0.0",
"dependencies": {
"lodash": "^4.17.21"
}
}

En este ejemplo, estamos agregando la dependencia de la librería lodash en la versión 4.17.21.

Después de esto, crearemos un archivo serverless.yml en la raíz de nuestro proyecto con la siguiente configuración:

service: my-service
provider:
name: aws
runtime: nodejs14.x
layers:
my-layer:
path: layers/my-layer

En este archivo de configuración, estamos definiendo el nombre de nuestro servicio como my-service, el proveedor que utilizaremos será aws, el runtime que utilizaremos es nodejs14.x y estamos especificando la ruta de nuestra capa (path: layers/my-layer).

Para desplegar nuestra capa, debemos ejecutar el siguiente comando:

serverless deploy

Con esto, Serverless Framework creará nuestra capa y la subirá a AWS Lambda. Podemos utilizar nuestra capa en cualquier función Lambda que tengamos en nuestro proyecto, simplemente agregando la siguiente configuración en el archivo serverless.yml de la función:

functions:
hello:
handler: handler.hello
layers:
- arn:aws:lambda:us-east-1:123456789012:layer:my-layer:1

En este ejemplo, estamos agregando nuestra capa (my-layer) a la función hello utilizando el ARN de la capa (arn:aws:lambda:us-east-1:123456789012:layer:my-layer:1).

Paso 5: Asignar el authorizer a las funciones

Para agregar un authorizer custom, primero debemos crear nuestra función de authorizer en Lambda. Podemos hacer esto en nuestro archivo serverless.yml de la siguiente manera:

functions:
customAuthorizer:
handler: handler.customAuthorizer
layers:
- arn:aws:lambda:us-east-1:123456789012:layer:my-layer:1
events:
- http:
path: authorizer
method: get
environment:
AUTHORIZER_SECRET: ${ssm:/auth/secret}

Donde handler.customAuthorizer es el nombre de nuestro archivo de código que contiene la lógica para el authorizer. En este ejemplo, estamos configurando nuestro authorizer para que se active en la ruta /authorizer utilizando el método GET. Además, estamos utilizando una variable de entorno llamada AUTHORIZER_SECRET para almacenar una clave secreta que será utilizada por nuestro authorizer.

Una vez que hemos creado nuestra función de authorizer, podemos agregarla a nuestras otras funciones de Lambda para que se active antes de que se ejecute la función principal. Podemos hacer esto en nuestro archivo serverless.yml de la siguiente manera:

functions:
hello:
handler: handler.hello
layers:
- arn:aws:lambda:us-east-1:123456789012:layer:my-layer:1
events:
- http:
path: hello
method: get
authorizer:
name: customAuthorizer
arn: arn:aws:lambda:<region>:<account-id>:function:<function-name>

Donde <region>, <account-id> y <function-name> son los valores correspondientes para nuestra función de authorizer.

Con estas configuraciones, hemos logrado agregar layers y un authorizer custom a nuestro proyecto de Serverless utilizando AWS Lambda en Typescript.

Espero que esta guía haya sido útil para aquellos que buscan crear proyectos de Serverless en Typescript utilizando AWS Lambda. Siéntase libre de experimentar con diferentes configuraciones y servicios para lograr el proyecto que necesite.

--

--

Javier Batres

I have 27 years and almost 9developing software professionally. Specialized on web and mobile. Google Developer, Tech Speaker and Writer.