Git Product home page Git Product logo

todo-list-aws's Introduction

todo-list-aws by vmganela

Este proyecto contiene un ejemplo de solución SAM + Jenkins. Contiene una aplicación API RESTful de libreta de tareas pendientes (ToDo) y los pipelines que permiten definir el CI/CD para productivizarla.

Estructura

A continuación se describe la estructura del proyecto:

  • pipelines - pipelines de Jenkins que permiten construir el CI/CD
  • src - en este directorio se almacena el código fuente de las funciones lambda con las que se va a trabajar
  • test - Tests unitarios y de integración.
  • samconfig.toml - Configuración de los stacks de Staging y Producción
  • template.yaml - Template que define los recursos AWS de la aplicación
  • localEnvironment.json - Permite el despliegue en local de la aplicación sobreescribiendo el endpoint de dynamodb para que apunte contra el docker de dynamo

Despliegue manual de la aplicación SAM en AWS

Para utilizar SAM CLI se necesitan las siguientes herramientas:

Para construir la aplicación se deberá ejecutar el siguiente comando:

sam build

Desplegar la aplicación por primera vez:

Sin utilizar la configuración del archivo samconfig.toml. Se generará un archivo de configuración reemplazando al actual si ya existe. Ejecutar el siguiente comando:

sam deploy --guided

El despliegue de la aplicación empaqueta, publicará en un bucket s3 el artefacto y desplegará la aplicación en AWS. Solicitará la siguiente información

  • Stack Name: El nombre del stack que desplegará en CloudFormation. Debe ser único
  • AWS Region: La región en la que se desea publicar la Aplicación.
  • Confirm changes before deploy: Si se indica "yes" se solicitará confirmación antes del despliegue si se encuentran cambios
  • Allow SAM CLI IAM role creation: Permite la creación de roles IAM
  • Save arguments to samconfig.toml: Si se selecciona "yes" las respuestas se almacenarán en el fichero de configuración samconfig.toml, de esta forma el el futuro se podrá ejecutar con sam deploy y se leerá la configuración del fichero.

En el output del despliegue se devolverá el API Gateway Endpoint URL

Desplegar la aplicación con la configuración de samconfig.toml:

Revisar el fichero samconfig.toml

vim samconfig.toml

Buscar en la configuración los buckets donde se van a almacenar los artefactos y modificar el fichero para que apunte al bucket del alumno, para ello hay que modificar las XXXXXX por otro nombre identificativo. Previamente se deberá crear los buckets a través de la consola de AWS!!!

s3_bucket = "aws-sam-cli-managed-staging-samclisourcebucket-XXXXXX" #Incluir bucket propio. Previamente se deberá crear los buckets a través de la consola de AWS!!!
s3_bucket = "aws-sam-cli-managed-production-samclisourcebucket-XXXXXX" #Incluir bucket propio. Previamente se deberá crear los buckets a través de la consola de AWS!!!

Ejecutar el siguiente comando para el entorno de default. Nota: usar este para pruebas manuales y dejar el resto para los despliegues con Jenkins.

sam deploy template.yaml --config-env default

Ejecutar el siguiente comando para el entorno de staging

sam deploy template.yaml --config-env staging

Ejecutar el siguiente comando para el entorno de producción

sam deploy template.yaml --config-env prod

Despliegue manual de la aplicación SAM en local

A continuación se describen los comandos/acciones a realizar para poder probar la aplicación en local:

## Crear red de docker
docker network create sam

## Levantar el contenedor de dynamodb en la red de sam con el nombre de dynamodb
docker run -p 8000:8000 --network sam --name dynamodb -d amazon/dynamodb-local

## Crear la tabla en local, para poder trabajar localmemte
aws dynamodb create-table --table-name local-TodosDynamoDbTable --attribute-definitions AttributeName=id,AttributeType=S --key-schema AttributeName=id,KeyType=HASH --provisioned-throughput ReadCapacityUnits=1,WriteCapacityUnits=1 --endpoint-url http://localhost:8000

## Empaquetar sam
sam build # también se puede usar sam build --use-container si se dan problemas con las librerías de python

## Levantar la api en local, en el puerto 8080, dentro de la red de docker sam
sam local start-api --port 8081 --env-vars localEnvironment.json --docker-network sam

Consultar logs de las funciones lambda

Se pueden consultar en CloudWath o ejecutando un comando similar al siguiente:

sam logs -n GetTodoFunction --stack-name todo-list-aws-staging

Tests

Se encuentran en la carpeta test que tiene la siguiente estructura:

- test
|--- integration (tests de integración)
|       -- todoApiTest.py
|--- unit (tests unitarios)
|       -- TestToDo.py

Para ejecutar los tests de integración es necesario ejecutar los siguientes comandos:

python -m pip install pytest
python -m pip install requests
pytest -s test/integration/todoApiTest.py

Para ejecutar los tests unitarios es necesario ejecutar los siguientes comandos:

python3.7 -m venv pyenvunittests
source pyenvunittests/bin/activate
python3.7 -m pip install --upgrade pip
python3.7 -m pip install boto3
python3.7 -m pip install moto
python3.7 -m pip install mock==4.0.2
python3.7 -m pip install coverage==4.5.4
export PYTHONPATH="${PYTHONPATH}:<directorio de la aplicación>"
export DYNAMODB_TABLE=todoUnitTestsTable
python test/unit/TestToDo.py

Otra alternativa es ejecutar los test desde la raíz del proyecto invocando a los scripts alojados dentro de la carpeta pipelines:

# Ejecución Pruebas

## Configuración del entorno virtual
pipelines/PIPELINE-FULL-STAGING/setup.sh

## Pruebas unitarias
pipelines/PIPELINE-FULL-STAGING/unit_test.sh

## pruebas estáticas (seguridad, calidad, complejidad )
pipelines/PIPELINE-FULL-STAGING/static_test.sh

# Pruebas de integración
pipelines/common-steps/integration.sh

Pipelines

Para la implementación del CI/CD de la aplicación se utilizan los siguientes Pipelines:

  • PIPELINE-FULL-STAGING: (PIPELINE-FULL-STAGING/Jenkinsfile) Este pipeline es el encargado de configurar el entorno de staging y ejecutar las pruebas
  • PIPELINE-FULL-PRODUCTION: (PIPELINE-FULL-PRODUCTION/Jenkinsfile) Este pipeline es el encargado de configurar el entorno de production y ejecutar las pruebas
  • PIPELINE-FULL-CD: este pipeline es el encargado de enganchar los pipelines de staging y production, con el objetivo de completar un ciclo de despliegue continuo desde un commit al repositorio de manera automática.

Limpieza

Para borrar la apliación y eliminar los stacks creados ejecutar los siguientes comandos:

aws cloudformation delete-stack --stack-name todo-list-aws-staging
aws cloudformation delete-stack --stack-name todo-list-aws-production

todo-list-aws's People

Contributors

rgaleanog avatar sergiomate avatar vmganela avatar

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.