Sistema de respaldo para registros de plantas mineras implementado con SQS, SNS, Typescript, S3, DynamoDB, Api Gateway, Cloudwatch, Systems Manager Parameter Store, Serverless-Framework, Lambda, entre otros.
Ver
- 1.0) Descripción del Proyecto.
- 1.1) Ejecución del Proyecto.
- 1.2) Configuración del proyecto desde cero
- 1.3) Tecnologías.
1.0) Descripción 🔝
Ver
Importante
: Hay alertas de seguridad de dependabot que apuntan contra el plugin "serverless-dynamodb-local". No aplicar parches de seguridad a dicho plugin, ya que la versión ^1.0.2
tiene problemas al momento de la creación de tablas y ejecución del servicio de dynamo. Se recomienda mantener la última versión estable ^0.2.40
con las alertas de seguridad generadas.
1.1) Ejecución del Proyecto 🔝
Ver
- Creamos un entorno de trabajo a través de algún ide, podemos o no crear una carpeta raíz para el proyecto, nos posicionamos sobre la misma
cd 'projectRootName'
- Una vez creado un entorno de trabajo a través de algún ide, clonamos el proyecto
git clone https://github.com/andresWeitzel/BackupSystem_SQS_SNS_S3_DynamoDB_AWS
- Instalamos la última versión LTS de Nodejs(v18)
- Instalamos Serverless Framework de forma global si es que aún no lo hemos realizado
npm install -g serverless
- Verificamos la versión de Serverless instalada
sls -v
- Instalamos todos los paquetes necesarios
npm i
Importante
: Hay alertas de seguridad de dependabot que apuntan contra el plugin "serverless-dynamodb-local". No aplicar parches de seguridad a dicho plugin, ya que la versión ^1.0.2
tiene problemas al momento de la creación de tablas y ejecución del servicio de dynamo. Se recomienda mantener la última versión estable ^0.2.40
con las alertas de seguridad generadas.
- El siguiente script configurado en el package.json del proyecto es el encargado de
- Levantar serverless-offline (serverless-offline)
"scripts": {
"serverless-offline": "sls offline start",
"start": "npm run serverless-offline"
},
- Ejecutamos la app desde terminal.
npm start
1.2) Configuración del proyecto desde cero 🔝
Ver
- Creamos un entorno de trabajo a través de algún ide, luego de crear una carpeta nos posicionamos sobre la misma
cd 'projectName'
- Instalamos la última versión LTS de Nodejs(v18)
- Instalamos Serverless Framework de forma global si es que aún no lo tenemos instalado.
npm install -g serverless
- Verificamos la versión de Serverless instalada
sls -v
- Inicializamos un template ts de serverles
serverless create --template aws-nodejs-typescript
- Comprobamos la versión de typescript
tsc -v
- Instalamos los paquetes necesarios
npm i
- Por defecto tendremos un serverless.ts, según el gusto y configuración se puede trabajar con el mismo, para este caso, se modifica a serverless.yml y se pasa la plantilla base.
- Modificaremos la plantilla inicial. Cambiamos
serverless.ts
porserverless.yml
para las configs estandarizadas. - Reemplazamos la plantila serverless.ts inicial por la siguiente como modelo (cambiar nombre, etc) según la creada...
service: nombre
frameworkVersion: '3'
provider:
name: aws
runtime: nodejs12.x
stage: dev
region : us-west-1
memorySize: 512
timeout : 10
plugins:
functions:
functions:
hello:
handler: src/functions/hello/handler.ts
events:
- http:
path: /test
method: POST
private: true
custom:
serverless-offline:
httpPort: 4000
lambdaPort: 4002
serverless-offline-ssm:
stages:
- dev
dynamodb:
stages:
- dev
- Instalamos serverless offline
npm i serverless-offline --save-dev
- Agregamos el plugin dentro del serverless.yml
plugins:
- serverless-offlline
- Instalamos serverless ssm
npm i serverless-offline-ssm --save-dev
- Agregamos el plugin dentro del serverless.yml
plugins:
- serverless-offlline-ssm
- Instalamos S3 local
npm install serverless-s3-local --save-dev
- Agregamos el plugin dentro del serverless.yml
plugins:
- serverless-s3-local
- Instalamos el Cliente s3
npm install @aws-sdk/client-s3
- Instalamos esbuild para el compilado entre js y ts
npm i serverless-esbuild
- Instalamos el plugin para el uso de dynamodb en local (No el servicio de dynamoDB, este viene configurado en los archivos dentro de .dynamodb).
Importante
: Hay alertas de seguridad de dependabot que apuntan contra el plugin "serverless-dynamodb-local". No aplicar parches de seguridad a dicho plugin, ya que la versión^1.0.2
tiene problemas al momento de la creación de tablas y ejecución del servicio de dynamo. Se recomienda mantener la última versión estable^0.2.40
con las alertas de seguridad generadas.
npm install serverless-dynamodb-local --save-dev
- Agregamos el plugin dentro del serverless.yml
plugins:
- serverless-dynamodb-local
- Instalamos el sdk client de dynamodb para las operaciones de db necesarias
npm install @aws-sdk/client-dynamodb
- Instalamos el sdk lib de dynamodb para las operaciones de db necesarias
npm i @aws-sdk/lib-dynamodb
- Debemos descargar el .jar junto con su config para ejecutar el servicio de dynamodb. Descargar aquí
- Una vez descargado el .jar en formato .tar descomprimimos y copiamos todo su contenido dentro de la carpeta
.dynamodb
(La creamos a la misma altura que el directorio src, caso de no tenerla). - Usaremos git como control de versiones. Nos posicionamos en la app e inicializamos git
git init
- Creamos el repositorio en github (sin readme) y agregamos la url del repositorio creado (ej: la siguiente)
git remote add origin https://github.com/andresWeitzel/BackupSystem_SQS_SNS_S3_DynamoDB_AWS
- Traemos los cambios del remoto, agregamos los nuevos cambios en local, commitiamos y los subimos al repo.
git pull origin master
git add *
git commit -m "Add app config"
git push origin master
- El siguiente script configurado en el package.json del proyecto es el encargado de Levantar serverless-offline (serverless-offline)
"scripts": {
"serverless-offline": "sls offline start",
"start": "npm run serverless-offline"
},
- Ejecutamos la app desde terminal.
npm start
- Deberíamos esperar un output por consola con los siguiente servicios levantados cuando se ejecuta el comando anterior
> [email protected] start
> npm run serverless-offline
> [email protected] serverless-offline
> sls offline start
serverless-offline-ssm checking serverless version 3.31.0.
Dynamodb Local Started, Visit: http://localhost:8000/shell
DynamoDB - created table payments-table
etc.....
- Ya tenemos una app funcional con una estructura inicial definida por Serverless-Framework. La aplicación queda deployada en http://localhost:4002 y podemos testear el endpoint declarado en el serverless desde postman
Aclaración
: El resto de las modificaciones aplicadas sobre la plantilla inicial no se describen por temas de simplificación de doc. Para más info consultar el tutorial de Serverless-framework para el uso de servicios, plugins, etc.
1.3) Tecnologías 🔝
Ver
Tecnologías | Versión | Finalidad |
---|---|---|
SDK | 4.3.2 | Inyección Automática de Módulos para Lambdas |
Serverless Framework Core v3 | 3.23.0 | Core Servicios AWS |
Systems Manager Parameter Store (SSM) | 3.0 | Manejo de Variables de Entorno |
Amazon Api Gateway | 2.0 | Gestor, Autenticación, Control y Procesamiento de la Api |
Amazon S3 | 3.0 | Contenedor de Objetos |
NodeJS | 14.18.1 | Librería JS |
VSC | 1.72.2 | IDE |
Postman | 10.11 | Cliente Http |
CMD | 10 | Símbolo del Sistema para linea de comandos |
Git | 2.29.1 | Control de Versiones |
Plugin | Descripción |
---|---|
Serverless Plugin | Librerías para la Definición Modular |
serverless-offline | Este complemento sin servidor emula AWS λ y API Gateway en entorno local |
serverless-offline-ssm | busca variables de entorno que cumplen los parámetros de SSM en el momento de la compilación y las sustituye desde un archivo |
serverless-s3-local | complemento sin servidor para ejecutar clones de S3 en local |
Extensión |
---|
Prettier - Code formatter |
YAML - Autoformatter .yml (alt+shift+f) |
TypeScript constructor generator - automatic constructor generator |
2.0) Endpoints y recursos 🔝
Ver
Variable | Initial value | Current value |
---|---|---|
base_url | http://localhost:4000 | http://localhost:4000 |
x-api-key | f98d8cd98h73s204e3456998ecl9427j | f98d8cd98h73s204e3456998ecl9427j |
bearer_token | Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c | Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c |