Skip to content

Commit

Permalink
Create Devops Projects
Browse files Browse the repository at this point in the history
  • Loading branch information
ssinuco committed Aug 6, 2024
1 parent b5879a8 commit ef70d28
Show file tree
Hide file tree
Showing 4 changed files with 785 additions and 0 deletions.
204 changes: 204 additions & 0 deletions projects/05-container-service-deployment/README.MD
Original file line number Diff line number Diff line change
@@ -0,0 +1,204 @@
# API Deployment on Container Service

## Índice

- [1. Consideraciones generales](#1-consideraciones-generales)
- [2. Preámbulo](#2-preámbulo)
- [3. Resumen del proyecto](#3-resumen-del-proyecto)
- [4. Paso a paso general para el despliegue en Amazon ECS o Azure Container Apps](#4-Paso-a-paso-general-para-el-despliegue-en-Amazon-ECS-o-Azure-Container-Apps)
- [5. Paso a paso detallado para el despliegue en Amazon ECS](#5-Paso-a-paso-detallado-para-el-despliegue-en-Amazon-ECS)
- [6. Paso a paso detallado para el despliegue en Azure Container Apps](#6-Paso-a-paso-detallado-para-el-despliegue-en-Azure-Container-Apps)
- [7. Consideraciones para pedir tu Project Feedback](#7-Consideraciones-para-pedir-tu-Project-Feedback)
- [8. Objetivos de aprendizaje](#8-Objetivos-de-aprendizaje)

---

## 1. Consideraciones generales

- Para poder implementar este proyecto debes implementar primer
el [API Deployment on Docker File](../05-dockerfile-deployment/README.MD).
- Este proyecto lo resolvemos de manera --individual--.
- El rango de tiempo estimado para completar el proyecto es de 1 a 2 Sprints.

## 2. Preámbulo

<img
src="https://github.com/user-attachments/assets/9a2940f5-9b88-4062-8a59-8d73cb0ed605"
alt="Contenedores"
aria-describedby="containers" />

<p id="containers">
Contenedores
</p>

_Photo by_
[Frank Mckenna](https://unsplash.com/@frankiefoto?utm_content=creditCopyText&utm_medium=referral&utm_source=unsplash)

AWS ECS (Elastic Container Service) y Azure Container Apps son servicios
diseñados para simplificar el despliegue y la gestión de aplicaciones basadas
en contenedores, permitiendo a las desarrolladoras centrarse en el código en
lugar de la infraestructura. Ambos proporcionan escalabilidad automática,
gestionando la capacidad de los recursos según la demanda de la aplicación.
Además, tanto ECS como Azure Container Apps se integran de manera eficiente
con otros servicios en sus respectivos ecosistemas de nube, facilitando
una experiencia cohesiva y flexible para construir y desplegar aplicaciones
en la nube. Sin embargo, mientras que ECS se basa en la infraestructura de
clústeres, Azure Container Apps ofrece una experiencia sin servidor,
simplificando aún más la gestión.

La currícula de Laboratoria incluye 4 proyectos enfocados en
desplegar la [Fleet Management API](../05-fleet-management-api/README.md)
que desarrollaste en la nube. Cada proyecto se distingue por utilizar
diferentes métodos de despliegue, lo que te permitirá aprender y aplicar
diversas estrategias para desplegar tu aplicación en producción en un entorno real.

## 3. Resumen del proyecto

En este proyecto desplegarás la aplicación usando
**Amazon Elastic Container Service (ECS)** o
**Azure Container Apps**.

Para este proyecto necesitarás la imagen Docker que construiste
en el proyecto [API Deployment on Docker File](../05-dockerfile-deployment/README.MD).
Si aún no la tienes, por favor implementa primero este proyecto.

## 4. Paso a paso general para el despliegue en Amazon ECS o Azure Container Apps

Amazon ECS y Azure Container Apps son servicios muy similares. En ambos
podemos seguir el siguiente paso a paso general para
desplegar la Fleet Management API independientemente del lenguaje de
programación en que esta implementada

- Paso 1: Subir la imagen docker a un Registro de Contenedores
(Azure Container Registry o Amazon ECR)
- Paso 2: Desplegar la aplicación en el caso de Azure creando una Container App y en el caso
de Amazon ECS creando un cluster EC2, definiendo una tarea ECS y un servicio ECS.
- Paso 3: Configurar el acceso externo para acceder a tu API utilizando la URL pública proporcionada por Azure o AWS.
- Paso 4: Monitorizar y gestionar la aplicación

## 5. Paso a paso detallado para el despliegue en Amazon ECS

### 1. Sube la imagen Docker a Amazon ECR (Elastic Container Registry)

Amazon ECR es un servicio en la nube que te permite almacenar tus imágenes
Docker de forma segura y eficiente. Amazon ECR actúa como un
"repositorio" para imágenes Docker, similar a cómo GitHub actúa como un
repositorio para código fuente. ECR se integra fácilmente con otros servicios de
AWS, como Amazon ECS (Elastic Container Service). Esto simplifica el despliegue de
tus aplicaciones en contenedores dentro del entorno de AWS.

En este proyecto almacenaremos en Amazon ECR la imagen docker que hemos
definido para empaquetar nuesta aplicación. Tómate un tiempo
para familiarizarte con ECR. Puedes seguir el
[tutorial oficial de ECR](https://docs.aws.amazon.com/AmazonECR/latest/userguide/getting-started-cli.html)
o cualquier otro disponible en internet. Asegúrate que al final tengas respuestas
claras para las siguientes preguntas:

- [ ] ¿Cómo creas un repositorio en Amazon ECR?
- [ ] ¿Cómo te autenticas en Amazon ECR desde tu máquina local?
- [ ] ¿Cómo subes una imagen Docker a Amazon ECR?
- [ ] ¿Cómo gestionas las imágenes en Amazon ECR?
- [ ] ¿Cómo haces `pull` a tu computadora de una imágen subida a Amazon ECR?

Finalmente, sube la imagen Docker que constuiste para empaquetar tu
aplicación en un repositorio de Amazon ECR.

### 2. Crear un clúster tipo EC2, una tarea y servicio en ECS

El siguiente paso es entonces desplegar la imagen docker
en cluster de instancias EC2 usando Amazon ECS (Elastic Container Service).

Tómate un tiempo para familiarizarte con ECS. Puedes seguir el
[workshop oficial de ECS](https://ecsworkshop.com/introduction/)
o cualquier otro disponible en internet. Asegúrate que al final tengas respuestas
claras para las siguientes preguntas:

- [ ] ¿Cómo se crea un clúster en Amazon ECS?
- [ ] ¿Qué es una tarea en ECS y cómo se configura?
- [ ] ¿Qué es un servicio en ECS y cómo garantiza que las tareas se mantengan en funcionamiento?
- [ ] ¿Cómo se despliega un servicio en ECS?
- [ ] ¿Qué es el autoescalado en ECS y cómo se configura?
- [ ] ¿Cómo se integra ECS con otros servicios de AWS como ECR?
- [ ] ¿Cómo se realiza un despliegue de una nueva versión de una aplicación utilizando ECS?
- [ ] ¿Cómo solucionas problemas si tu aplicación en Amazon ECS no se está ejecutando correctamente?

Finalmente, usa ECS para desplegar la imagen docker de tu aplicacion
creando un clúster, una tarea y un servicio.

### 3. Monitorizar y gestionar la aplicación

Usa la la IP pública de tu clúster EC2 para probar tu API con una
coleccion de Postman. Puedes utilizar esta
[colección de ejemplo](https://github.com/Laboratoria/curriculum/tree/main/projects/05-fleet-management-api#7-testing).

## 6. Paso a paso detallado para el despliegue en Azure Container Apps

### 1. Sube la imagen Docker a Azure Container Registry

Azure Container Registry (ACR) es un servicio en la nube que
te permite almacenar tus imágenes Docker de forma segura y
eficiente. ACR actúa como un "repositorio" para imágenes Docker,
similar a cómo GitHub actúa como un repositorio para código fuente.
ECR se integra fácilmente con otros servicios de Azure, como Azure Container Apps.
Esto simplifica el despliegue de tus aplicaciones en contenedores dentro
del entorno de Azure.

En este proyecto almacenaremos en ACR la imagen docker que hemos
definido para empaquetar nuesta aplicación. Tómate un tiempo
para familiarizarte con ACR. Puedes seguir el
[tutorial oficial de ACR](https://learn.microsoft.com/en-us/azure/container-registry/container-registry-get-started-docker-cli)
o cualquier otro disponible en internet. Asegúrate que al final tengas respuestas
claras para las siguientes preguntas:

- [ ] ¿Cómo creas un nuevo registro en Azure Container Registry?
- [ ] ¿Cómo te autenticas en Azure Container Registry desde tu máquina local?
- [ ] ¿Cómo subes una imagen Docker a Azure Container Registry?
- [ ] ¿Cómo gestionas las imágenes en Azure Container Registry?
- [ ] ¿Cómo haces `pull` a tu computadora de una imágen subida a Azure Container Registry?

Finalmente, sube la imagen Docker que constuiste para empaquetar tu
aplicación en un registro de Azure Container Registry.

### 2. Crear una container App en Azure Container Registry

El siguiente paso es entonces desplegar la imagen docker
en una Container App usando Azure Container Apps.

Tómate un tiempo para familiarizarte con Azure Container Apps. Puedes seguir el
[workshop oficial de Azure Container Apps](https://learn.microsoft.com/en-us/training/modules/deploy-manage-container-app-using-azure-container-apps/)
o cualquier otro disponible en internet. Asegúrate que al final tengas respuestas
claras para las siguientes preguntas:

Para confirmar que una desarrolladora domina **Azure Container Apps**, puedes hacer las siguientes preguntas:

- [ ] ¿Cómo se crea una nueva aplicación en Azure Container Apps desde el portal de Azure?
- [ ] ¿Qué requisitos previos debes cumplir antes de desplegar una aplicación en Azure Container Apps?
- [ ] ¿Cómo configuras el contenedor en una aplicación de Azure Container Apps?
- [ ] ¿Cómo actualizas una aplicación desplegada en Azure Container Apps con una nueva versión de la imagen del contenedor?
- [ ] ¿Cómo configuras el acceso y la seguridad para tu aplicación en Azure Container Apps?**
- [ ] ¿Cómo solucionas problemas si tu aplicación en Azure Container Apps no se está ejecutando correctamente?

Finalmente, usa ECS para desplegar la imagen docker de tu aplicacion
creando un clúster, una tarea y un servicio.

### 3. Monitorizar y gestionar la aplicación

Usa la la IP pública de tu Azure Container App para probar tu API con una
coleccion de Postman. Puedes utilizar esta
[colección de ejemplo](https://github.com/Laboratoria/curriculum/tree/main/projects/05-fleet-management-api#7-testing).

## 7. Consideraciones para pedir tu Project Feedback

Antes de agendar tu Project Feedback con tu coach, asegúrate de
tener una coleccion de Postman para probar la API que
desplegaste en Amazon ECS o Azure Container Apps.

## 8. Objetivos de aprendizaje

> ℹ️ Esta sección será automáticamente generada en el idioma pertinente, a partir
> de los objetivos de aprendizaje declarados en [`project.yml`](./project.yml),
> al crear el repo del proyecto para un cohort en particular usando
> [`./scripts/create-cohort-project.js`](../../scripts#create-cohort-project-coaches).
>
> Acá puedes ver una [lista de todos los objetivos de aprendizaje](../../learning-objectives/data.yml)
> que contempla nuestra currícula.
159 changes: 159 additions & 0 deletions projects/05-dockerfile-deployment/README.MD
Original file line number Diff line number Diff line change
@@ -0,0 +1,159 @@
# API Deployment on Docker File

## Índice

- [1. Consideraciones generales](#1-consideraciones-generales)
- [2. Preámbulo](#2-preámbulo)
- [3. Resumen del proyecto](#3-resumen-del-proyecto)
- [4. Implementaciones de ejemplo](#4-Implementaciones-de-ejemplo)
- [5. Paso a paso para empaquetar tu aplicación en un contenedor de Docker](#5-Paso-a-paso-para-empaquetar-tu-aplicación-en-un-contenedor-de-Docker)
- [6. Consideraciones para pedir tu Project Feedback](#6-Consideraciones-para-pedir-tu-Project-Feedback)
- [7. Objetivos de aprendizaje](#7-Objetivos-de-aprendizaje)

---

## 1. Consideraciones generales

- Este proyecto lo resolvemos de manera --individual--.
- El rango de tiempo estimado para completar el proyecto es de 1 a 2 Sprints.

## 2. Preámbulo

<img
src="https://github.com/user-attachments/assets/cc4938e0-3c1b-4f4f-9c5c-4a1b181681fa"
alt="Logo de Docker"
aria-describedby="docker-logo" />

<p id="docker-logo">
Logo de Docker
</p>

Docker permite empaquetar una aplicación junto con todas sus dependencias
(como bibliotecas, configuraciones y archivos necesarios) en una unidad
estándar conocida como contenedor. Esto asegura que la aplicación funcione
de manera consistente sin importar dónde se ejecute, ya sea en una máquina local,
en la nube o en un servidor de producción. A diferencia de las máquinas virtuales,
los contenedores no necesitan un sistema operativo completo, sino que comparten
el núcleo del sistema operativo del host, lo que los hace más eficientes en términos
de recursos y más rápidos de iniciar.

La currícula de Laboratoria incluye 4 proyectos enfocados en
desplegar la [Fleet Management API](../05-fleet-management-api/README.md)
que desarrollaste en la nube. Cada proyecto se distingue por utilizar
diferentes métodos de despliegue, lo que te permitirá aprender y aplicar
diversas estrategias para desplegar tu aplicación en producción en un entorno real.

## 3. Resumen del proyecto

En este proyecto empaquetarás la [Fleet Management API](../05-fleet-management-api/README.md)
en un **contenedor de Docker** a través de un Dockerfile.

## 4. Implementaciones de ejemplo

En caso que no hayas implementado aún la
[Fleet Management API](../05-fleet-management-api/README.md)
puedes usar las siguientes implementaciones mínimas para
completar este proyecto. Elige la implementación en el
lenguaje de programación que más te interese:

- [Implementación en NodeJS](https://github.com/Laboratoria/minimum-impl-fleet-management-api-nodejs)
- [Implementación en Python](https://github.com/Laboratoria/minimum-impl-fleet-management-api-python)
- [Implementación en Java](https://github.com/Laboratoria/minimum-impl-fleet-management-api-java)

## 5. Paso a paso para empaquetar tu aplicación en un contenedor de Docker

### 1. Familiarizate con Docker

Docker es una herramienta que se usa para crear, desplegar y ejecutar
aplicaciones en contenedores. Por lo tanto es importante
que aprendas a administrar contendedores. Tómate un tiempo
para familiarizarte con Docker. Puedes seguir el
[tutorial oficial de Docker](https://www.docker.com/101-tutorial/) o cualquier
otro disponible en internet. Asegúrate que al final tengas respuestas
claras para las siguientes preguntas:

- [ ] ¿Qué es un contenedor?
- [ ] ¿Qué es una Docker Image?
- [ ] ¿Qué es un Image Registry?
- [ ] ¿Cómo ejecutar un contenedor?
- [ ] ¿Cómo detener un contenedor?
- [ ] ¿Cómo publicar un puerto de un contenedor?
- [ ] ¿Cómo ejecutar un comando dentro de un contenedor?
- [ ] ¿Qué es un Dockerfile?
- [ ] En un Dockerfile, ¿para qué sirve el comando FROM?
- [ ] En un Dockerfile, ¿para qué sirve el comando EXPOSE?
- [ ] En un Dockerfile, ¿para qué sirve el comando USE?
- [ ] En un Dockerfile, ¿para qué sirve el comando RUN?
- [ ] En un Dockerfile, ¿para qué sirve el comando WORKDIR?
- [ ] En un Dockerfile, ¿para qué sirve el comando COPY?
- [ ] En un Dockerfile, ¿para qué sirven los comandos CMD y ENTRYPOINT?
- [ ] En un Dockerfile, ¿para qué sirve el comando ENV?
- [ ] ¿Cómo compartir imágenes en Docker Github?

### 2. Construye una imagen Docker con Dockerfile

Una vez estes familiarizada con Docker, el siguiente paso es escribir
un Dockerfile para construir una imagen que empaquete tu API. Puedes seguir este
[tutorial](https://medium.com/@anshita.bhasin/a-step-by-step-guide-to-create-dockerfile-9e3744d38d11)
o cualquier otro disponible en internet.

Para escribir un `Dockerfile` adecuado que empaquete una aplicación,
es importante responder a varias preguntas clave sobre tu aplicación y su entorno.
Aquí tienes una lista de preguntas a considerar:

1. ¿Cuál es el lenguaje de programación y entorno de ejecución de tu aplicación?
2. ¿Cuál es el sistema operativo preferido o requerido?
3. ¿En qué directorio está ubicado el código fuente de tu aplicación? ¿Necesitas
copiar todo el directorio o solo ciertos archivos?
4. ¿Qué herramientas o paquetes necesitas instalar para que tu aplicación funcione?
¿Usas un archivo como `package.json` (Node.js), `requirements.txt` (Python),
`pom.xml` (Maven, Java) o `build.gradle` (Gradle, Java)?
5. ¿Cuál es el punto de entrada de tu aplicación? ¿Qué comando necesitas ejecutar
para iniciar tu aplicación?
6. ¿En qué puerto(s) escucha tu aplicación para recibir conexiones? Esto es necesario
para la instrucción `EXPOSE`.
7. ¿Existen variables de entorno que deban configurarse para que tu aplicación
funcione correctamente?
8. ¿Hay datos que deben mantenerse persistentes entre reinicios de contenedores?
Si es así, puedes necesitar configurar volúmenes.
9. ¿Existen permisos o configuraciones del sistema que deban aplicarse para que tu
aplicación se ejecute correctamente?
10. ¿Necesitas realizar alguna configuración específica o ejecución de scripts antes
de que tu aplicación esté lista?

Con ayuda de las respuestas a estas preguntas escribe un Dockerfile que empaquete
tu aplicación con todas sus dependencias, configure el entorno de trabajo y
exponga el puerto necesario, asegurando que la aplicación esté lista para
ejecutarse en un contenedor Docker.

Luego construye la imagen Docker desde el Dockerfile (`docker build`) y ejecuta
un contenedor basado en la imagen construida (`docker run`).

Prueba que la API funcione correctamente desde una colección de Postman.
Puedes utilizar esta
[colección de ejemplo](https://github.com/Laboratoria/curriculum/tree/main/projects/05-fleet-management-api#7-testing).

### 3. Publica tu Imagen en Docker Hub

Crea una cuenta en Docker Hub e inicia sesión desde tu terminal (`docker login`).
Etiqueta tu imagen Docker (`docker tag`) y publícala en Docker Hub (`docker push`)
para su distribución y uso.

## 6. Consideraciones para pedir tu Project Feedback

Antes de agendar tu Project Feedback con tu coach, asegúrate de:

- [ ] Hacer push del Dockerfile al repositorio de proyecto Fleet Management API
- [ ] Construir una colección de Postman para probar la API.
Puedes utilizar esta
[colección de ejemplo](https://github.com/Laboratoria/curriculum/tree/main/projects/05-fleet-management-api#7-testing).

## 7. Objetivos de aprendizaje

> ℹ️ Esta sección será automáticamente generada en el idioma pertinente, a partir
> de los objetivos de aprendizaje declarados en [`project.yml`](./project.yml),
> al crear el repo del proyecto para un cohort en particular usando
> [`./scripts/create-cohort-project.js`](../../scripts#create-cohort-project-coaches).
>
> Acá puedes ver una [lista de todos los objetivos de aprendizaje](../../learning-objectives/data.yml)
> que contempla nuestra currícula.
Loading

0 comments on commit ef70d28

Please sign in to comment.