├── nginx-conf.sh ├── init.sh ├── DNF_guide.md ├── MariaDB_createDB.md ├── MariaDB_installation_guide.md ├── README.md ├── Preparando_proyecto_Integrador.md ├── AWS_EC2_setup_guide.md ├── NGINX_installation_guide.md ├── HTTPS_setup_guide.md └── SpringBoot_App_installation_guide.md /nginx-conf.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | NGINX_CONF="/etc/nginx/nginx.conf" 4 | PATTERN="include /etc/nginx/conf.d/*.conf;" 5 | INSERT_LINE="include /etc/nginx/sites-enabled/*;" 6 | 7 | sudo sed -i "/^include \/etc\/nginx\/conf.d\/\*.conf;$/a $INSERT_LINE" "$NGINX_CONF" 8 | 9 | if [[ -f "/home/ec2-user/aws-nginx-config/app" ]]; then 10 | sudo cp /home/ec2-user/aws-nginx-config/app /etc/nginx/sites-available/app && 11 | sudo ln -s /etc/nginx/sites-available/app /etc/nginx/sites-enabled/ && 12 | sudo cp /home/ec2-user/aws-nginx-config/app.service /etc/systemd/system/ && 13 | sudo systemctl start nginx && 14 | sudo systemctl enable app.service && 15 | sudo systemctl enable app && 16 | sudo systemctl start app && 17 | sudo systemctl reload nginx 18 | else 19 | echo "Required file /home/ec2-user/aws-nginx-config/app does not exist." 20 | fi 21 | -------------------------------------------------------------------------------- /init.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | # Basic aws spring setup 4 | 5 | echo "Installing necessary packages..." 6 | TABS="------------------------------------" 7 | 8 | REQUIRED_PACKAGES="mariadb105-server java-17 nginx maven" 9 | ## Pckgs 10 | sudo yum update 11 | sudo yum install $REQUIRED_PACKAGES 12 | 13 | echo "Enabling mariadb server" 14 | 15 | sudo systemctl start mariadb && 16 | sudo systemctl enable mariadb 17 | 18 | echo "$TABS" 19 | echo "Enabling mysql secure installation..." 20 | echo "$TABS" 21 | echo "Change necessary information here" 22 | 23 | sudo mysql_secure_installation 24 | 25 | echo "$TABS" 26 | echo "Creating necessary directories..." 27 | 28 | sudo mkdir /etc/nginx/sites-available /etc/nginx/sites-enabled /home/ec2-user/app/ 29 | 30 | echo "$TABS" 31 | echo "You should now clone your Rest API repository and build the .jar file" 32 | echo "You can also clone it and run the jar-build.sh script" 33 | -------------------------------------------------------------------------------- /DNF_guide.md: -------------------------------------------------------------------------------- 1 | ## DNF (Dandified YUM) 2 | 3 | DNF es un sistema de gestión de paquetes utilizado principalmente en distribuciones de Linux basadas RPM (Red Hat Package Manager) como Red Hat, Fedora, CentOS y Amazon Linux 2023. DNF es una evolución de YUM (Yellowdog Updater, Modified), y se introdujo para mejorar la velocidad, el rendimiento y la usabilidad en comparación con su predecesor. 4 | 5 | Para usar el comando DNF debes tener privilegios de super usuario. El programa sudo (super user do​) es una utilidad de los sistemas operativos tipo Unix, que permite a los usuarios ejecutar programas con los privilegios de seguridad de otro usuario (como el usuario root). 6 | 7 | ### Principales comandos de DNF 8 | 9 | - **`sudo dnf update`**: Actualiza todos los paquetes instalados en el sistema a sus últimas versiones disponibles. 10 | ```bash 11 | sudo dnf update 12 | ``` 13 | 14 | - **`sudo dnf search`**: Permite buscar paquetes en los repositorios disponibles. 15 | ```bash 16 | sudo dnf search mariadb 17 | ``` 18 | 19 | - **`sudo dnf info`**: Proporciona información detallada sobre un paquete específico, incluida su versión, descripción y dependencias. 20 | ```bash 21 | sudo dnf info mariadb105-server 22 | ``` 23 | 24 | - **`sudo dnf install`**: Este comando se utiliza para instalar nuevos paquetes y todas sus dependencias no instaladas en el sistema. 25 | ```bash 26 | sudo dnf install mariadb105-server 27 | ``` 28 | 29 | - **`sudo dnf remove`**: Permite eliminar paquetes instalados en el sistema. 30 | ```bash 31 | sudo dnf remove mariadb105-server 32 | ``` 33 | 34 | - **`sudo dnf upgrade`**: Similar a dnf update, pero también maneja actualizaciones de versiones mayores de los paquetes instalados. 35 | ```bash 36 | sudo dnf upgrade mariadb105-server 37 | ``` 38 | 39 | - **`sudo dnf clean all`**: Se utiliza para limpiar el caché de paquetes descargados, lo que puede liberar espacio en disco. 40 | ```bash 41 | sudo dnf clean all 42 | ``` -------------------------------------------------------------------------------- /MariaDB_createDB.md: -------------------------------------------------------------------------------- 1 | # Creación de una Base de Datos en MariaDB. 2 | 3 | En esta guía, aprenderás cómo crear una base de datos en MariaDB instalada en una instancia EC2 con Amazon Linux. La base de datos estará diseñada para una aplicación de comercio electrónico. 4 | 5 | ## Pasos para Crear la Base de Datos. 6 | 7 | ### Paso 1: Acceda a los servicios de MariaDB. 8 | 9 | Accede a la consola de MariaDB utilizando el siguiente comando: 10 | 11 | ```bash 12 | mysql -u root -p 13 | ``` 14 | 15 | El usuario root puede ser cambiado por otro usuario configurado previamente. 16 | 17 | ### Paso 2: Crea la Base de Datos. 18 | 19 | Ejecuta el siguiente comando SQL para crear la base de datos. 20 | 21 | ```sql 22 | CREATE DATABASE ecommerce; 23 | ``` 24 | 25 | ### Paso 3: Crea Usuarios. 26 | 27 | #### a. Usuario con Todos los Privilegios. 28 | Crea un usuario con todos los privilegios en la base de datos de comercio electrónico. Reemplaza 'username' y 'password' con tu nombre de usuario y contraseña deseados: 29 | 30 | ```sql 31 | CREATE USER 'username'@'%' IDENTIFIED BY 'password'; 32 | GRANT ALL PRIVILEGES ON ecommerce.* TO 'username'@'%'; 33 | FLUSH PRIVILEGES; 34 | ``` 35 | 36 | #### b. Usuario de Solo Lectura. 37 | Crea un usuario con privilegios de solo lectura en la base de datos de comercio electrónico. Reemplaza 'readonly_username' y 'readonly_password' con tu nombre de usuario y contraseña deseados: 38 | 39 | ```sql 40 | CREATE USER 'readonly_username'@'localhost' IDENTIFIED BY 'readonly_password'; 41 | GRANT SELECT ON ecommerce.* TO 'readonly_username'@'localhost'; 42 | FLUSH PRIVILEGES; 43 | ``` 44 | 45 | ### Paso 4: Verifica la Base de Datos y los Usuarios. 46 | 47 | Puedes verificar que la base de datos y los usuarios se hayan creado correctamente listando las bases de datos y los usuarios. 48 | 49 | ```sql 50 | SHOW DATABASES; 51 | SELECT user FROM mysql.user; 52 | ``` 53 | 54 | ### 5. Verifica los Permisos del Usuario 55 | 56 | Puedes verificar los permisos de un usuario específico ejecutando la siguiente consulta SQL. 57 | 58 | ```sql 59 | SHOW GRANTS FOR 'username'@'%'; 60 | ``` 61 | 62 | ### Paso 6: Sal de MariaDB. 63 | Sal de la interfaz de línea de comandos de MariaDB. 64 | 65 | ```sql 66 | EXIT; 67 | ``` 68 | -------------------------------------------------------------------------------- /MariaDB_installation_guide.md: -------------------------------------------------------------------------------- 1 | # Instalación de MariaDB en AWS Linux 2023 2 | 3 | ## ¿Qué es MariaDB? 4 | 5 | MariaDB es un sistema de gestión de bases de datos relacional (RDBMS) de código abierto que es una bifurcación de MySQL. Ofrece características avanzadas, alto rendimiento y es compatible con la mayoría de las aplicaciones MySQL. MariaDB es utilizado por empresas de todo el mundo para gestionar sus datos de manera eficiente y segura. 6 | 7 | ## Pasos para instalar MariaDB en AWS Linux 2023 8 | 9 | ### Paso 1: Conectarse a su instancia de AWS Linux. 10 | 11 | Utilice su cliente SSH favorito para conectarse a su instancia de AWS Linux. 12 | 13 | ```bash 14 | ssh -i your_key.pem ec2-user@your_instance_public_ip 15 | ``` 16 | 17 | Es necesario que tu archivo de clave `.pem` tenga permisos de solo lectura; de lo contrario, podrías encontrarte con el error "Permissions 0644 for your_key.pem are too open". Para resolver este problema, establece permisos de solo lectura para el archivo `.pem`. 18 | 19 | ```bash 20 | chmod 400 your_key.pem 21 | ``` 22 | El comando `chmod` en sistemas operativos tipo Unix se utiliza para cambiar los permisos de un archivo o directorio. En este comando, 400 especifica que el propietario del archivo (your_key.pem) debe tener permisos de solo lectura, mientras que todos los demás usuarios no tienen ningún permiso. 23 | 24 | ### Paso 2: Actualizar el sistema. 25 | 26 | Antes de instalar cualquier paquete nuevo, es una buena práctica actualizar los paquetes existentes en el sistema. 27 | 28 | ```bash 29 | sudo dnf update 30 | ``` 31 | 32 | ### Paso 3: Instalar MariaDB Server 33 | 34 | Para instalar MariaDB Server en AWS Linux, utilice el siguiente comando: 35 | 36 | ```bash 37 | sudo dnf install mariadb105-server 38 | ``` 39 | 40 | ### Paso 4: Iniciar el servicio MariaDB 41 | 42 | Inicie el servicio de MariaDB y habilítelo para que se inicie automáticamente en el arranque del sistema. 43 | 44 | ```bash 45 | sudo systemctl start mariadb 46 | sudo systemctl enable mariadb 47 | ``` 48 | 49 | `systemctl` es una herramienta de administración de servicios en sistemas Linux. Permite interactuar con el sistema de inicio, controlar servicios (como iniciar, detener, reiniciar, habilitar o deshabilitar), ver el estado de los servicios y más 50 | 51 | ### Paso 5: Verificar el servicio MariaDB 52 | 53 | Una vez que la inicialización haya finalizado, puede verificar el estado del servicio de MariaDB. 54 | 55 | ```bash 56 | sudo systemctl status mariadb 57 | ``` 58 | 59 | ### Paso 6: Configurar MariaDB 60 | 61 | Para mejorar la seguridad de su instalación de MariaDB, ejecute el script de seguridad incluido. 62 | 63 | ```bash 64 | sudo mysql_secure_installation 65 | ``` 66 | 67 | ### Paso 7: Acceda a los servicios de MariaDB 68 | 69 | Una vez configurado, puede acceder a la consola de MariaDB utilizando el siguiente comando: 70 | 71 | ```bash 72 | mysql -u root -p 73 | ``` 74 | 75 | Se le pedirá que ingrese la contraseña que configuró anteriormente. Una vez dentro de la consola de MariaDB, puede comenzar a crear bases de datos, tablas y realizar consultas SQL. -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Bienvenido al Repositorio de AWS EC2 y Configuraciones. 2 | 3 | En este repositorio encontrarás información detallada y guías paso a paso para configurar y gestionar instancias EC2 en Amazon Web Services (AWS). Además, también encontrarás instrucciones para configurar otras herramientas y servicios relacionados, como MariaDB, Spring Boot y NGINX. 4 | 5 | ## Contenido del Repositorio. 6 | 7 | ### AWS y EC2 8 | 9 | En el archivo [AWS_EC2_setup_guide.md](AWS_EC2_setup_guide.md), encontrarás una guía que explica qué es AWS, EC2 y las ventajas de utilizar instancias de EC2. Así mismo, encontrarás instrucciones paso a paso para configurar grupos de seguridad, pares de claves y aprovisionar instancias en la consola de AWS. 10 | 11 | ### Manual DNF 12 | 13 | En el archivo [DNF_guide.md](DNF_guide.md), encontrarás una guía que explica qué es DNF y proporciona las principales instrucciones para su uso en instancias Amazon Linux. DNF es un gestor de paquetes de código abierto utilizado en algunas distribuciones de Linux, como Fedora y CentOS. 14 | 15 | ### Preparando nuestro Proyecto Integrador. 16 | 17 | En el archivo [Preparando_proyecto_Integrador.md](Preparando_proyecto_Integrador.md), encontrarás las configuraciones necesarias que debemos realizar en los archivos de nuestro Proyecto Integrador. Hasta este momento hemos trabajado de manera local creando el frontend con HTML, CSS y Bootstrap, el backend con Java y Spring boot y, nuestra base de datos con MySQL. Es momento de realizar cambios que nos permitirán trabajar a nivel producción con AWS. 18 | 19 | ### Instalación de MariaDB en una Instancia EC2 y creación de una base de datos. 20 | 21 | En el archivo [MariaDB_installation_guide.md](MariaDB_installation_guide.md), encontrarás instrucciones paso a paso para instalar y configurar MariaDB en una instancia EC2 de AWS. MariaDB es un sistema de gestión de bases de datos relacional de código abierto. En el archivo [MariaDB_createDB.md](MariaDB_createDB.md), encontrarás instrucciones para crear una base de datos y crear un usuario que tenga privilegios a esa base de datos. 22 | 23 | ### Configuración para la ejecución de una Aplicación Spring Boot en EC2. 24 | 25 | En el archivo [SpringBoot_App_installation_guide.md](SpringBoot_App_installation_guide.md), encontrarás instrucciones para configurar una aplicación Spring Boot en una instancia EC2 de AWS. Spring Boot es un framework de desarrollo de aplicaciones Java que simplifica el proceso de creación de aplicaciones basadas en Spring. 26 | 27 | ### Configuración de NGINX como Proxy Inverso. 28 | 29 | En el archivo [NGINX_installation_guide.md](NGINX_installation_guide.md), encontrarás una guía detallada para configurar NGINX como un servidor proxy inverso en una instancia EC2 de AWS. NGINX es un servidor web ligero, rápido y de alto rendimiento que se puede utilizar para enrutar el tráfico web hacia múltiples servidores backend. 30 | 31 | ### Configuración HTTPS para API en EC2 con NGINX y Let's Encrypt 32 | 33 | En el archivo [HTTPS_setup_guide.md](HTTPS_setup_guide.md), encontrarás el proceso para asegurar una API REST de Spring Boot con un certificado SSL/TLS gratuito. Se utilizará NGINX como proxy inverso, **DuckDNS** para obtener un nombre de dominio gratuito y Let's Encrypt para la generación de certificados en una instancia EC2. 34 | 35 | ## Contribución. 36 | 37 | ¡Siéntete libre de contribuir al repositorio! Si tienes alguna mejora, corrección de errores o nuevas guías que te gustaría añadir, ¡no dudes en hacerlo! Simplemente haz un fork del repositorio, realiza tus cambios y envía un pull request. 38 | 39 | Esperamos que encuentres útiles las guías y la información proporcionada en este repositorio. Si tienes alguna pregunta o necesitas ayuda adicional, no dudes en abrir un issue. 40 | 41 | ¡Gracias por tu interés y contribuciones! 42 | 43 | -------------------------------------------------------------------------------- /Preparando_proyecto_Integrador.md: -------------------------------------------------------------------------------- 1 | # Preparando nuestro Proyecto Integrador. 2 | 3 | El proyecto integrador se encuentra desarrollado de la siguiente manera: 4 | - **Frontend**: HTML, CSS, JavaScript y Bootstrap. 5 | - **Backend**: Spring boot con Java, 6 | - **Base de datos**: MySQL. 7 | 8 | ## Acoplando frontend con backend. 9 | 10 | El primer paso que debemos realizar para que nuestro proyecto pueda vivir de manera remota es realizar el acoplamiento de la carpeta donde se desarrolló el frontend con la carpeta donde se desarrolló el backend. 11 | 12 | > Es necesario recordarte que el punto de acceso de nuestro frontend es el archivo `index.html` el cual se debe encontrar en el nivel principal. 13 | 14 | Para realizar el acoplamiento, copiaremos la carpeta del frontend dentro de la carpeta del backend, en la ruta `src/main/resources/static` 15 | 16 | Puedes consultar el siguiente repositorio para observar la nueva estructura del proyecto 17 | [Repositorio de ejemplo](https://github.com/sergiotrrs/aws-ec2-demo.git) 18 | 19 | ## Configurando mi URL remota. 20 | 21 | Solicita la `IP pública` proporcionada por la instancia de AWS a la persona encargada, ya que esta será la dirección que reemplazarás en el frontend y te permitirá vincular con el servidor remoto que configuraremos más adelante. 22 | 23 | Hasta este momento hemos desarrollado nuestra API y realizado pruebas HTTP de manera local, pero necesitamos conectarnos a una IP remota para realizar pruebas de manera remota. Por ello, localiza todas las url de tu proyecto que apunten a `localhost:8080` y sustitúyela por la `IP pública` proporcionada. 24 | 25 | *Revisa cada archivo de tu código para asegurarte que se realicen los cambios correctos.* 26 | 27 | Así mismo, solicita a la persona encargada la información referente a tu instancia aprovisionada en AWS, como Región, Nombre de instancia, Id de instancia y el archivo `'nombre-par-claves'.pem` que servirá como el Par de claves para conectarte posteriormente a la instancia. 28 | 29 | ## Propiedades para Producción (Variables de entorno). 30 | 31 | Por seguridad, es necesario ocultar las propiedades del proyecto como variables de entorno, ya que de esta manera no exponemos información sensible a nivel producción. Para ello, realizamos lo siguiente: 32 | 33 | 1. Crear un nuevo archivo llamado `application-prod.properties` en la ruta `src/main/resources` 34 | - Este servirá exclusivamente para configuración de producción. 35 | - No es necesario modificar `application.properties` o `application.yml`. 36 | 37 | 2. Dentro del archivo `application-prod.properties` copiar lo siguiente: 38 | ```properties 39 | 40 | spring.jpa.hibernate.ddl-auto=update 41 | 42 | spring.datasource.url=jdbc:mysql://${MYSQLHOST}:${MYSQLPORT}/${MYSQLDATABASE} 43 | spring.datasource.username=${MYSQLUSER} 44 | spring.datasource.password=${MYSQLPASSWORD} 45 | spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver 46 | ``` 47 | 3. En la carpeta del proyecto abrir el archivo `.gitignore` y realizar comentarios sobre las siguientes líneas: 48 | ```properties 49 | # build 50 | # !**/src/main/**/build/ 51 | ``` 52 | 53 | ## ¿Qué es Gradle y para qué sirve en Spring Boot? 54 | 55 | Gradle es una herramienta de automatización de compilación que se utiliza para gestionar y construir proyectos de software. En un proyecto de Spring Boot, Gradle permite gestionar las dependencias, compilar el código, ejecutar pruebas, crear archivos ejecutables (.jar o .war) y desplegar la aplicación de manera eficiente. 56 | 57 | ## Construyendo el proyecto con Gradle. 58 | 59 | Necesitamos ejecutar varias tareas en nuestro proyecto, tales como configurar, descargar dependencias, compilar clases Java, ejecutar pruebas y crear archivos `jar`. Para ello haremos uso de las tareas de gradle. 60 | 61 | Tenemos dos opciones disponibles para realizar la construcción de nuestro proyecto (`'archivo' .jar`): 62 | 63 | ### Opción 1. 64 | Ubicar la opción de `Gradle Task` en la consola. Seleccionar la carpeta del proyecto `nombre_proyecto`, seleccionar `build` y dar doble click en la opción de `build` para iniciar la construcción del proyecto. 65 | 66 | ### Opción 2. 67 | Ubicarse en la carpeta del proyecto y ejecutar el comando: 68 | 69 | ```bash 70 | ./gradlew build 71 | ``` 72 | 73 | Una vez finalizada la construción del proyecto, se generan una serie de carpetas y un archivo llamado `'proyecto-version'.jar` según el nombre de nuestro proyecto y la versión del mismo. Este archivo se localiza en la ruta `build/libs/'proyecto-version'.jar` 74 | 75 | ## Archivo .gitignore 76 | 77 | Para el deploy remoto de nuestro proyecto, necesitamos enviar el código y los archivos .jar a un repositorio de Github, pero dichos archivos no deben ser ignorados. Para resolverlo, es necesario modificar el archivo `.gitignore` localizando las líneas siguientes y agregando un comentario (#) al inicio de las mismas. 78 | 79 | ```bash 80 | # build 81 | # !**/src/main/**/build/ 82 | ``` 83 | 84 | Con esto, le decimos a Github que no ignore los archivos que se encuentran dentro del directorio `build`. 85 | 86 | ## Creación y despliegue en Github. 87 | 88 | Una vez que hayamos realizado las configuraciones necesarias en nuestro proyecto integrador, es momento de crear un repositorio público y vacío en Github para realizar la conexión a dicho repositorio. Para ello sigue los pasos habituales desde git: 89 | 90 | ```bash 91 | git init 92 | ``` 93 | ```bash 94 | git add . 95 | ``` 96 | ```bash 97 | git commit -m 'comentario' 98 | ``` 99 | ```bash 100 | git remote add origin 'url.git' 101 | ``` 102 | ```bash 103 | git push -u origin main 104 | ``` 105 | 106 | ## Pasos finales. 107 | 108 | Para mayor organización, se sugiere crear una carpeta general que contenga al mismo nivel la carpeta del proyecto integrador (frontend integrado al backend) y el archivo `'nombre-par-claves'.pem` para continuar con las siguientes configuraciones de AWS. 109 | 110 | Te invitamos a consultar el archivo [MariaDB_installation_guide.md](MariaDB_installation_guide.md) para conocer las próximas configuraciones necesarias para el despliegue de la Aplicación. -------------------------------------------------------------------------------- /AWS_EC2_setup_guide.md: -------------------------------------------------------------------------------- 1 | # Amazon Web Services (AWS). 2 | 3 | **Amazon Web Services (AWS)** es una plataforma en la nube ofrecida por Amazon que proporciona una amplia gama de servicios en la nube (cloud computing), como almacenamiento, computación, bases de datos, redes, entre otros. AWS permite a las empresas y desarrolladores crear, desplegar y gestionar aplicaciones en la nube sin tener que preocuparse por la infraestructura física. 4 | 5 | ## Amazon EC2. 6 | 7 | **Amazon EC2 (Elastic Compute Cloud)** es uno de los servicios más populares de AWS y permite ejecutar aplicaciones en servidores virtuales, conocidos como instancias, en la nube. EC2 proporciona capacidad de computación escalable, lo que significa que puedes ajustar el tamaño de tus recursos según la demanda, pagando solo por el uso que realmente necesitas. 8 | 9 | ## Instancias. 10 | 11 | **Instancias de EC2** son servidores virtuales que puedes lanzar para ejecutar aplicaciones. Existen diferentes tipos de instancias con distintas configuraciones de CPU, memoria, almacenamiento y capacidad de red, lo que permite elegir la configuración más adecuada para las necesidades de tu aplicación. 12 | 13 | Beneficios de usar EC2: 14 | 15 | - Escalabilidad: Puedes aumentar o disminuir la cantidad de recursos en función de las necesidades de tu aplicación. 16 | - Pago por uso: Solo pagas por el tiempo que la instancia está en funcionamiento, lo que lo hace flexible y rentable. 17 | - Opciones de personalización: Puedes elegir entre una variedad de sistemas operativos y configuraciones de hardware. 18 | - Alta disponibilidad: EC2 proporciona opciones para distribuir instancias en diferentes regiones geográficas y zonas de disponibilidad, lo que garantiza que las aplicaciones permanezcan disponibles incluso en caso de fallos. 19 | 20 | ## Regiones de AWS. 21 | 22 | AWS tiene el concepto de una **Región**, que es una ubicación física en todo el mundo donde agrupamos los centros de datos. Llamamos a cada grupo de centros de datos lógicos “zona de disponibilidad”. Cada región de AWS consta de un mínimo de tres zonas de acceso aisladas y físicamente separadas dentro de un área geográfica. 23 | 24 | Es necesario seleccionar la Región más cercana a nuestra ubicación en la lista desplegable que se ubica en la parte superior derecha de la consola. Nosotros trabajaremos con dos regiones: `Ohio` y `Virginia`. Solo basta con seleccionar la región para cambiar entre ellas. 25 | 26 | ## Configurando Pares de Claves (key pairs). 27 | 28 | Los **pares de claves (key pairs)** son un mecanismo de seguridad utilizado en servicios de la nube como AWS EC2 para garantizar un acceso seguro a las instancias (servidores virtuales). Un par de claves consta de dos partes: 29 | 30 | - *Clave pública*: Esta clave se almacena en la instancia en la nube. Se utiliza para cifrar los datos que solo pueden ser descifrados por la clave privada correspondiente. 31 | - *Clave privada*: Esta clave se descarga y guarda localmente. Se utiliza para autenticarte y conectarte a la instancia. La clave privada descifra la información que fue cifrada con la clave pública, permitiéndote acceder de manera segura al servidor. 32 | 33 | ### Pasos para configurar el par de claves en EC2. 34 | 35 | Es necesario crear tantos pares de claves sean necesarios para asegurar las instancias en la nube. Para ello, sigue los siguientes pasos. 36 | 37 | 1. Iniciar sesión en la [Consola de AWS](https://console.aws.amazon.com/) con usuario y contraseña. 38 | 2. Seleccionar el servicio `EC2`. 39 | 3. Seleccionar la opción `Pares de claves` que se encuentra en la sección de **Red y Seguridad.** 40 | 4. Asignar un nombre al par de claves. 41 | 5. Seleccionar el Tipo de par de claves `RSA`. 42 | 6. Seleccionar el formato de archivo de clave privada `.pem`. 43 | 7. Crear pares de claves. 44 | 45 | Al crear el par de claves se genera un archivo `'nombre-par-claves'.pem` con el nombre que asignamos a nuestro par de claves. 46 | 47 | *Recuerda crear el par de claves, según la región o regiones que trabajarás.* 48 | 49 | ## Grupos de seguridad 50 | 51 | Los **grupos de seguridad** en AWS son un componente crucial para gestionar la seguridad de las instancias en la nube, como las instancias de EC2. Un grupo de seguridad actúa como un firewall virtual que controla el tráfico de red entrante y saliente a nivel de instancia. 52 | 53 | ### Pasos para crear Grupos de seguridad en EC2. 54 | 55 | Es necesario configurar los permisos para los grupos de seguridad. Para ello sigue los siguientes pasos: 56 | 57 | 1. Iniciar sesión en la [Consola de AWS](https://console.aws.amazon.com/) con usuario y contraseña. 58 | 2. Seleccionar el servicio `EC2`. 59 | 3. Seleccionar la opción `Grupos de seguridad` que se encuentra en la sección de **Red y Seguridad.** 60 | 4. Presionar el botón `Crear grupo de seguridad` para comenzar la configuración de nuestro grupo de seguridad. 61 | 5. Configurar el nombre del grupo de seguridad, así como la descripción "Permitir el acceso SSH, MariaDB y Spring boot". 62 | 6. Configurar las Reglas de Entrada. Vamos a agregar cuatro reglas a nuestro Grupo de seguridad. 63 | 64 | **Primer regla**. Seleccionamos el botón `Agregar regla` y configuramos de la siguiente manera: 65 | 66 | - Tipo: SSH 67 | - Origen: Anywhere-IPv4 68 | 69 | **Segunda regla**. Seleccionamos el botón `Agregar regla` y configuramos de la siguiente manera: 70 | 71 | - Tipo: HTTP 72 | - Origen: Anywhere-IPv4 73 | 74 | **Tercer regla**. Seleccionamos el botón `Agregar regla` y configuramos de la siguiente manera: 75 | 76 | - Tipo: MYSQL/Aurora 77 | - Origen: Anywhere-IPv4 78 | 79 | **Cuarta regla** Seleccionamos el botón `Agregar regla` y configuramos de la siguiente manera: 80 | 81 | - Tipo: TPC personalizado 82 | - Intervalo de puertos: 8080 83 | - Origen: Anywhere-IPv4 84 | 7. Presionamos el botón `Crear grupo de seguridad` para finalizar la creación. 85 | 86 | *Recuerda crear Grupos de seguridad, según la región o regiones que trabajarás.* 87 | 88 | ## Aprovisionando instancias en EC2. 89 | 90 | En el contexto de AWS, la palabra `aprovisionar` (del inglés "provision") se refiere al proceso de configurar y lanzar recursos en la nube para su uso. Cuando se habla de aprovisionar una instancia en EC2, significa que estás creando y configurando un servidor virtual con ciertos recursos (CPU, memoria, almacenamiento, etc.) listos para ejecutar aplicaciones. 91 | 92 | Para aprovisionar instancias es necesario seguir los siguientes pasos: 93 | 94 | 1. Iniciar sesión en la [Consola de AWS](https://console.aws.amazon.com/) con usuario y contraseña. 95 | 2. Seleccionar el servicio `EC2`. 96 | 3. Seleccionar la opción `Instancias` que se encuentra en la sección de **Instancias.** 97 | 4. Asignar un nombre a la instancia. 98 | 5. Seleccionar `Amazon Linux` como Imagen de Máquina de Amazon (AMI). 99 | 6. Configurar el `Par de claves` para el inicio de sesión, seleccionando el par de claves que generamos previamente. 100 | 7. Configurar el `firewall (grupos de seguridad)` seleccionando la opción `Seleccionar un grupo de seguridad existente`. 101 | 8. Lanzamos la instancia, presionando el botón `Lanzar instancias` y observamos que se ha creado. 102 | Podemos ver todas las instancias que hemos aprovisionado. 103 | 104 | > Podemos generar el número de instancias necesarias escribiendo el número de instancias. 105 | 106 | *Recuerda aprovisionar Instancias, según la región o regiones que trabajarás.* 107 | 108 | ## Cambiando el estado de las instancias. 109 | 110 | En AWS, las instancias de EC2 pasan por varios estados durante su **ciclo de vida**. Cada estado refleja la actividad o el estado actual de la instancia. Estos estados permiten gestionar de manera flexible las instancias, controlando el uso y los costos según las necesidades de la aplicación. 111 | 112 | *Estados de instancias:* 113 | 114 | - **Pendiente**: ste es el estado inicial de una instancia cuando se está lanzando.. 115 | - **En ejecución**: En ejecución, funcionando correctamente y lista para ser usada. 116 | - **Deteniéndose**: En proceso de detenerse. 117 | - **Detenida**: La instancia ha sido detenida correctamente, aunque la configuración de la instancia permanece intacta. 118 | - **Apagándose**: Este estado indica que la instancia está en proceso de apagarse de manera permanente. 119 | - **Terminada**: Instancia eliminada permanentemente. 120 | - **Reiniciando**: La instancia está reiniciándose, conservando sus configuraciones. 121 | - **Hibernación**: Permite "pausar" una instancia en lugar de detenerla completamente, preservándola en el mismo estado en que se encontraba antes de la hibernación. 122 | 123 | Dentro del panel de instancias podemos visualizar las instancias aprovisionadas con la información de cada una (nombre, Id, estado, tipo, estatus, entre otras) y podemos modificar los estados seleccionando la(s) instancia(s) necesarias. 124 | 125 | *Recuerda que las instancias se encuentran en las regiones donde se aprovisionaron.* 126 | -------------------------------------------------------------------------------- /NGINX_installation_guide.md: -------------------------------------------------------------------------------- 1 | # Configuración de NGINX como Proxy Inverso. 2 | 3 | ## ¿Por qué utilizar el puerto 8080 y no utilizar directamente el puerto 80 en mi aplicación de Spring Boot? 4 | 5 | En Spring Boot, el puerto por defecto para escuchar solicitudes HTTP es el 8080. Sin embargo, no es posible configurar directamente el puerto 80 en la propiedad `server.port`, del archivo `application.properties`, debido a restricciones de seguridad y permisos. 6 | 7 | Aquí tienes algunas razones por las que no se recomienda usar el puerto 80 directamente: 8 | 9 | - Privilegios de Puerto: En sistemas operativos tipo Unix/Linux, los puertos por debajo del 1024 (como el puerto 80 para HTTP) requieren privilegios de superusuario (root) para ser utilizados. Ejecutar tu aplicación como root es una mala práctica de seguridad. 10 | 11 | - Conflictos con Servicios Existentes: El puerto 80 podría estar ocupado por otros servicios web en la misma máquina, lo que causaría conflictos al iniciar tu aplicación. 12 | 13 | - Recomendaciones de Seguridad: Se sugiere utilizar un puerto no privilegiado (mayor a 1024) para las aplicaciones y usar un servidor web dedicado como NGINX para gestionar el acceso público. 14 | 15 | ## ¿Qué es un Proxy Inverso? 16 | 17 | Un proxy inverso es un servidor que actúa como intermediario entre los clientes (navegadores, aplicaciones móviles, etc.) y los servidores de aplicaciones. 18 | 19 | NGINX se utiliza comúnmente como un proxy inverso debido a su eficiencia y flexibilidad. 20 | 21 | Ventajas de Usar un Proxy Inverso con NGINX: 22 | 23 | - Seguridad: Oculta la infraestructura de tu backend, protegiendo los servidores de aplicaciones de ataques directos. 24 | 25 | - Balanceo de Carga: Puede distribuir el tráfico entre varias instancias de tu aplicación para mejorar la escalabilidad y disponibilidad. 26 | 27 | - Caché: Almacena en caché contenido estático y dinámico para reducir la carga en los servidores de aplicación y acelerar las respuestas. 28 | 29 | - Terminación SSL/TLS: NGINX puede manejar el cifrado y descifrado HTTPS, liberando a tu aplicación de esta tarea intensiva en CPU. 30 | 31 | ## Instalar NGINX en AWS Linux 2023 32 | 33 | ### Paso 1: Conectarse a su instancia de AWS Linux. 34 | 35 | Utilice su cliente SSH favorito para conectarse a su instancia de AWS Linux. 36 | 37 | ```bash 38 | ssh -i your_key.pem ec2-user@your_instance_public_ip 39 | ``` 40 | 41 | Es necesario que tu archivo de clave `.pem` tenga permisos de solo lectura; de lo contrario, podrías encontrarte con el error "Permissions 0644 for your_key.pem are too open". Para resolver este problema, establece permisos de solo lectura para el archivo `.pem`. 42 | 43 | ```bash 44 | chmod 400 your_key.pem 45 | ``` 46 | 47 | El comando `chmod` en sistemas operativos tipo Unix se utiliza para cambiar los permisos de un archivo o directorio. En este comando, 400 especifica que el propietario del archivo (your_key.pem) debe tener permisos de solo lectura, mientras que todos los demás usuarios no tienen ningún permiso. 48 | 49 | ### Paso 2: Actualizar el sistema. 50 | 51 | Antes de instalar cualquier paquete nuevo, es una buena práctica actualizar los paquetes existentes en el sistema. 52 | 53 | ```bash 54 | sudo dnf update 55 | ``` 56 | 57 | ### Paso 3: Instalar NGINX 58 | 59 | Para instalar NGINX en AWS Linux, utilice el siguiente comando: 60 | 61 | ```bash 62 | sudo dnf install nginx -y 63 | ``` 64 | 65 | ### Paso 4: Iniciar el servicio NGINX 66 | 67 | Inicie el servicio de nginx y habilítelo para que se inicie automáticamente en el arranque del sistema. 68 | 69 | ```bash 70 | sudo systemctl start nginx 71 | ``` 72 | ```bash 73 | sudo systemctl enable nginx 74 | ``` 75 | 76 | `systemctl` es una herramienta de administración de servicios en sistemas Linux. Permite interactuar con el sistema de inicio, controlar servicios (como iniciar, detener, reiniciar, habilitar o deshabilitar), ver el estado de los servicios y más 77 | 78 | ## Configurar NGINX como proxy inverso 79 | 80 | La práctica moderna, y la configuración por defecto en la mayoría de las distribuciones actuales, es utilizar el directorio `/etc/nginx/conf.d/`. Todos los archivos que terminen en `.conf` dentro de este directorio son cargados automáticamente por NGINX. Este método es más simple y limpio que el antiguo sistema de `sites-available` y `sites-enabled`, ya que no requiere la creación de directorios adicionales ni enlaces simbólicos. 81 | 82 | ### Paso 1: Crear el archivo de configuración para la aplicación 83 | 84 | Crea un nuevo archivo de configuración directamente en el directorio conf.d. Dale un nombre descriptivo, por ejemplo `my-ecommerce-demo.conf`. 85 | 86 | ```bash 87 | sudo nano /etc/nginx/conf.d/my-ecommerce-demo.conf 88 | ``` 89 | 90 | ### Paso 2: Agregar la configuración del proxy inverso 91 | 92 | Pega la siguiente configuración en el archivo que acabas de crear. Este bloque le dice a NGINX que escuche en el puerto 80 y redirija todo el tráfico a tu aplicación Spring Boot que se ejecuta en el puerto 8080. 93 | 94 | ```bash 95 | # This configuration effectively sets up a reverse proxy 96 | # server on port 80 that forwards incoming requests to a 97 | # backend server running on localhost:8080 98 | 99 | server { 100 | listen 80; 101 | listen [::]:80; 102 | server_name localhost; 103 | 104 | location / { 105 | # Pasa todas las solicitudes a la API de Spring Boot que se ejecuta en el puerto 8080 106 | proxy_pass http://localhost:8080; 107 | # Headers importantes para que la aplicación backend conozca la solicitud original 108 | proxy_set_header Host $host; 109 | proxy_set_header X-Real-IP $remote_addr; 110 | proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; 111 | proxy_set_header X-Forwarded-Proto $scheme; 112 | } 113 | } 114 | ``` 115 | 116 | Guarda el archivo y sal del editor (`Ctrl+X`, luego `Y`, y `Enter`). 117 | 118 | Esta configuración establece un bloque de servidor para un proxy inverso en NGINX. Aquí hay un desglose de lo que hace cada sección: 119 | 120 | - listen 80;: Configura NGINX para escuchar en el puerto 80 para conexiones HTTP entrantes. 121 | - listen [::]:80;: Similar al anterior, pero para conexiones IPv6. 122 | - server_name localhost;: Define el nombre del servidor al que se aplica este bloque de configuración. En este caso, se establece en 'localhost', lo que significa que este bloque de configuración manejará las solicitudes que lleguen al servidor con el nombre de host 'localhost'. 123 | 124 | Dentro del bloque location / { }: 125 | 126 | - proxy_pass http://localhost:8080;: Especifica que las solicitudes entrantes a esta ubicación deben ser reenviadas al servidor backend que se ejecuta en localhost en el puerto 8080. 127 | - proxy_set_header Host $host;: Establece el encabezado Host de la solicitud enmascarada al valor del encabezado 'Host' de la solicitud original. 128 | - proxy_set_header X-Real-IP $remote_addr;: Establece el encabezado X-Real-IP de la solicitud enmascarada a la dirección IP del cliente. 129 | - proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;: Agrega la dirección IP del cliente al encabezado X-Forwarded-For de la solicitud enmascarada. 130 | - proxy_set_header X-Forwarded-Proto $scheme;: Establece el encabezado X-Forwarded-Proto de la solicitud enmascarada a 'http' o 'https' según el protocolo de la solicitud original. 131 | 132 | 133 | ### Paso 3: Prueba de sintaxis en el archivo de configuración de NGINX 134 | 135 | El comando `sudo nginx -t` se utiliza para probar el archivo de configuración de NGINX en busca de errores de sintaxis sin aplicar realmente los cambios de configuración a la instancia de NGINX en ejecución. 136 | 137 | ```bash 138 | sudo nginx -t 139 | ``` 140 | 141 | Si todo está correcto, deberías ver un mensaje como: 142 | 143 | `nginx: the configuration file /etc/nginx/nginx.conf syntax is ok` 144 | 145 | `nginx: configuration file /etc/nginx/nginx.conf test is successful` 146 | 147 | Si hay errores de sintaxis, NGINX proporcionará un mensaje de error detallado que indicará el problema y el número de línea donde se produjo el error. 148 | 149 | ### Paso 7: Reiniciar el servicio de NGINX 150 | 151 | Para aplicar los cambios, es necesario reiniciar el servicio de NGINX. Utiliza el siguiente comando: 152 | 153 | ```bash 154 | sudo systemctl restart nginx 155 | ``` 156 | 157 | ### Paso 8: Realiza una petición HTTP en el puerto 80 158 | 159 | Antes de realizar la prueba, asegúrate de que tu backend se esté ejecutando en el puerto 8080, como se configuró anteriormente. 160 | 161 | - Desde la misma instancia EC2 162 | 163 | ```bash 164 | curl localhost/api/v1/users 165 | ``` 166 | 167 | Si el puerto 80 está permitido como entrada en la instancia EC2, puedes realizar una petición desde Postman o desde la línea de comandos local utilizando la dirección IP pública de tu instancia: 168 | 169 | - Desde tu máquina local 170 | 171 | ```bash 172 | curl http://your_instance_public_ip/api/v1/users 173 | ``` 174 | 175 | Recuerda reemplazar your_instance_public_ip con la dirección IP pública de tu instancia EC2. 176 | 177 | Si todo funciona, ¡has configurado exitosamente NGINX como un proxy inverso! -------------------------------------------------------------------------------- /HTTPS_setup_guide.md: -------------------------------------------------------------------------------- 1 | # Manual de Configuración HTTPS para API en EC2 con NGINX y Let's Encrypt 2 | 3 | Este manual detalla el proceso para asegurar una API REST de Spring Boot con un certificado SSL/TLS gratuito. Se utilizará NGINX como proxy inverso, **DuckDNS** para obtener un nombre de dominio gratuito y Let's Encrypt para la generación de certificados en una instancia EC2. 4 | 5 | ## ¿Qué es HTTPS y por qué es fundamental? 6 | 7 | HTTPS son las siglas de Hypertext Transfer Protocol Secure (Protocolo Seguro de Transferencia de Hipertexto). En términos sencillos, es la versión segura y cifrada de HTTP. La 'S' final es la clave, ya que indica que toda la comunicación entre tu navegador y el servidor web está encriptada. 8 | 9 | Esto garantiza tres pilares de la seguridad en la web: 10 | 11 | 1. Confidencialidad: La información que se envía (como contraseñas, datos personales o números de tarjeta de crédito) no puede ser leída por un atacante que intercepte la comunicación. 12 | 13 | 2. Integridad: Los datos no pueden ser modificados en tránsito sin que se detecte. Esto evita que un atacante inyecte código malicioso o altere la información que recibes. 14 | 15 | 3. Autenticación: Asegura que te estás comunicando con el servidor legítimo y no con un impostor. Esto es lo que verifica el certificado SSL/TLS. 16 | 17 | Los navegadores modernos aplican una estricta política de seguridad llamada "Bloqueo de Contenido Mixto" (Mixed Content Blocking). Esto significa que si tu frontend está en `https://my-ecommerce.com` y tu backend está en `http://api.my-ecommerce.com`, la comunicación fallará. El navegador no permitirá que una página segura haga peticiones a un servidor inseguro para proteger al usuario de posibles ataques. 18 | 19 | Por esta razón, es absolutamente necesario que tanto el frontend como el backend (tu API REST) se sirvan a través de HTTPS. 20 | 21 | ## ¿Qué es NGINX? 22 | 23 | NGINX es un servidor web de alto rendimiento que también puede funcionar como proxy inverso, balanceador de carga y caché HTTP. En esta configuración, lo usaremos como **proxy inverso**: recibirá las peticiones HTTPS desde internet, las desencriptará y las reenviará de forma segura a nuestra aplicación Spring Boot, que se ejecuta localmente en el puerto 8080. 24 | 25 | ## ¿Qué es Let's Encrypt y Certbot? 26 | 27 | **Let's Encrypt** es una autoridad de certificación (CA) gratuita, automatizada y abierta. Proporciona certificados SSL/TLS sin costo para habilitar HTTPS en los sitios web. 28 | 29 | **Certbot** es el cliente de software que se utiliza para obtener e instalar automáticamente los certificados de Let's Encrypt. Simplifica el proceso de configuración y también gestiona la renovación automática de los certificados antes de que expiren. 30 | 31 | ## Uso de DuckDNS para un Dominio Gratuito (Prueba de Concepto) 32 | 33 | Para que Let's Encrypt pueda emitir un certificado, necesitamos un nombre de dominio público. 34 | 35 | **¿Por qué no usar el DNS público que proporciona AWS?** 36 | La dirección DNS que AWS asigna por defecto a una instancia (ej. `ec2-xx-xx-xx-xx.compute-1.amazonaws.com`) presenta dos problemas para este caso: 37 | 1. **Es volátil**: Si detienes y vuelves a iniciar la instancia, tanto la IP pública como el nombre DNS cambiarán, rompiendo la configuración del certificado. 38 | 2. **Políticas de Let's Encrypt**: Let's Encrypt tiene políticas muy estrictas y límites de velocidad para la emisión de certificados en dominios de proveedores de nube masivos como `amazonaws.com`, lo que a menudo resulta en fallos. 39 | 40 | **¿Por qué DuckDNS es la solución para una prueba?** 41 | **DuckDNS** es un servicio gratuito de DNS dinámico que nos proporciona un subdominio estable (ej. `my-ecommerce-demo.duckdns.org`). Este nombre no cambia y podemos apuntarlo fácilmente a la IP pública de nuestra instancia, cumpliendo así con los requisitos de Let's Encrypt. 42 | 43 | ## Pasos para Configurar HTTPS con NGINX y Let's Encrypt 44 | 45 | A continuación se presentan los pasos para una API de Spring Boot llamada `my-ecommerce-demo`. 46 | 47 | ### Prerrequisitos 48 | 49 | 1. **API en Ejecución**: Tener la aplicación Spring Boot `my-ecommerce-demo.jar` ejecutándose en la instancia EC2, escuchando en el puerto `8080`. 50 | 2. **Dominio de DuckDNS Configurado**: 51 | * Ve a [DuckDNS](https://www.duckdns.org/) y crea una cuenta (puedes usar tu cuenta de Google, GitHub, etc.). 52 | * Registra el subdominio que desees, para este manual supondremos el nombre `my-ecommerce-demo`. 53 | * En el campo de la IP, **debes introducir la dirección IP pública actual de tu instancia EC2** y hacer clic en "update ip". 54 | 55 | ### Paso 1: Configurar el Security Group en AWS 56 | 57 | La instancia debe permitir el tráfico web entrante. En la consola de AWS, asegúrate que en **Grupo de Seguridad** de tu instancia tenga las siguientes reglas de entrada: 58 | 59 | | Tipo | Protocolo | Rango de puertos | Origen | Descripción | 60 | | :--- | :--- | :--- | :--- | :--- | 61 | | HTTP | TCP | 80 | 0.0.0.0/0 | Permite a Certbot validar el dominio. | 62 | | HTTPS | TCP | 443 | 0.0.0.0/0 | Permite el tráfico final seguro. | 63 | 64 | ### Paso 2: Instalar Certbot 65 | 66 | Instala la herramienta Certbot y su plugin específico para NGINX. 67 | 68 | ```bash 69 | sudo dnf install certbot python3-certbot-nginx -y 70 | ``` 71 | 72 | ### Paso 3: Instalación de NGINX y modificación del Archivo de Configuración para la API 73 | 74 | Realiza la [Configuración de NGINX como Proxy Inverso](NGINX_installation_guide.md). 75 | 76 | 1. Modifica el archivo de configuración específico para tu API. 77 | 78 | ```bash 79 | sudo nano /etc/nginx/conf.d/my-ecommerce-demo.conf 80 | ``` 81 | 82 | 2. Modifica el valor del atributo server_name con el DNS obtenido con [DuckDNS](https://www.duckdns.org/) 83 | 84 | ```bash 85 | # Esta es la línea clave que Certbot necesita encontrar. 86 | # Debe coincidir con tu dominio de DuckDNS. 87 | server_name my-ecommerce-demo.duckdns.org; 88 | ``` 89 | 90 | 3. Guarda el archivo y sal del editor (`Ctrl+X`, luego `Y`, y `Enter`). 91 | 92 | ### Paso 4: Obtener e Instalar el Certificado SSL 93 | Con la configuración de NGINX ya preparada, ahora Certbot podrá encontrar el dominio y automatizar todo el proceso. 94 | 95 | 1. Ejecuta Certbot, usando tu dominio de DuckDNS. 96 | 97 | ```bash 98 | sudo certbot --nginx -d my-ecommerce-demo.duckdns.org 99 | ``` 100 | 101 | 2. Certbot te guiará con algunas preguntas (email, términos de servicio). 102 | 103 | ### Paso 5: Verificación Final 104 | Tu API ya debería estar funcionando de forma segura a través de HTTPS en tu dominio de DuckDNS. 105 | 106 | 1. Prueba en el navegador: Abre un navegador web y navega a `https://my-ecommerce-demo.duckdns.org/` seguido de la ruta de algún endpoint de tu API. Deberías ver el ícono del candado, indicando una conexión segura. 107 | 108 | 2. Revisa la configuración (Opcional): Puedes abrir de nuevo el archivo de configuración para ver los cambios que hizo Certbot. 109 | ```bash 110 | cat /etc/nginx/conf.d/my-ecommerce-demo.conf 111 | ``` 112 | 113 | Notarás que ahora el archivo tiene directivas ssl_certificate, ssl_certificate_key y escucha en el puerto 443 ssl, además del bloque que redirige el tráfico del puerto 80 al 443. 114 | 115 | Una vez finalizado, tu API ya estará disponible en `https://generation-ch54.duckdns.org`. Certbot habrá transformado tu archivo de configuración para manejar el tráfico HTTPS en el puerto 443 y redirigir el del puerto 80. 116 | 117 | ### Consideraciones para un Entorno de Producción (Lectura opcional) 118 | 119 | La configuración anterior es excelente para una prueba de concepto (PoC), desarrollo o proyectos personales. Para una aplicación real en producción, la práctica recomendada es diferente: 120 | 121 | #### Dominio y Dirección IP 122 | 123 | - Comprar un Dominio Propio: En lugar de usar un subdominio gratuito, se debe comprar un dominio propio (ej. www.mi-ecommerce-real.com). Esto ofrece profesionalismo, credibilidad y control total. 124 | 125 | - Usar una Dirección IP Estática (Elastic IP): En AWS, se debe asignar una IP Elástica a la instancia EC2. Es una dirección IP pública estática que no cambia si la instancia se detiene o reinicia, garantizando que tu dominio siempre apunte al servidor correcto. 126 | 127 | #### Alternativas para Dominio y Certificado 128 | 129 | Existen varias formas de gestionar tu dominio y certificado SSL. Aquí se comparan dos enfoques comunes: uno totalmente integrado en AWS y otro usando un registrador externo como GoDaddy. 130 | 131 | ##### Alternativa A: Solución Integrada con AWS (Recomendado) 132 | 133 | Este es el enfoque moderno y escalable si tu infraestructura está en AWS. 134 | 135 | - Dominio: Puedes registrar tu dominio directamente con Amazon Route 53. Funciona como cualquier otro registrador (GoDaddy, Namecheap), pero se integra de forma nativa con otros servicios de AWS. 136 | 137 | - Certificado: Utiliza AWS Certificate Manager (ACM). 138 | 139 | - Costo: Proporciona certificados SSL/TLS públicos totalmente gratuitos. 140 | 141 | - Renovación Automática: ACM gestiona la renovación de los certificados automáticamente, sin necesidad de cron jobs o Certbot en la instancia. 142 | 143 | - Integración: El certificado de ACM no se instala en la instancia EC2. En su lugar, se asocia a un Application Load Balancer (ALB). El ALB gestiona todo el tráfico HTTPS (terminación SSL) y lo reenvía de forma segura a tus instancias EC2 por el puerto 8080. Esta arquitectura es más segura y facilita el escalado horizontal. 144 | 145 | ##### Alternativa B: Usando un Registrador Externo (ej. GoDaddy) 146 | 147 | Si ya tienes un dominio con un proveedor como GoDaddy, puedes integrarlo perfectamente con AWS. 148 | 149 | - Dominio: Gestionas tu dominio (mi-ecommerce-real.com) en el panel de GoDaddy. 150 | 151 | - Configuración de DNS: En GoDaddy, crearías un registro A que apunte a la IP Elástica de tu instancia EC2 o, preferiblemente, un registro CNAME que apunte al DNS de tu Application Load Balancer. 152 | 153 | - Opciones para el Certificado: 154 | 155 | - Usar AWS Certificate Manager (Recomendado): Aún puedes solicitar un certificado gratuito en ACM para tu dominio de GoDaddy. ACM te pedirá verificar la propiedad del dominio, generalmente añadiendo un registro CNAME específico en tu panel de DNS de GoDaddy. Una vez verificado, puedes usar ese certificado con un Application Load Balancer como en la alternativa anterior. 156 | 157 | - Usar Let's Encrypt: Puedes seguir usando Certbot en tu instancia EC2 para generar el certificado. Funciona bien, pero acopla la gestión del certificado a la instancia, lo que es menos flexible que gestionarlo a nivel de balanceador de carga. -------------------------------------------------------------------------------- /SpringBoot_App_installation_guide.md: -------------------------------------------------------------------------------- 1 | # Configuración para la ejecución de una Aplicación Spring Boot en AWS EC2. 2 | 3 | ## ¿Qué es Spring Boot? 4 | 5 | Spring Boot es framework de código abierto para crear aplicaciones Java de manera rápida y con un mínimo de configuración. Está construido sobre el proyecto Spring Framework y proporciona un conjunto de herramientas y convenciones que simplifican el desarrollo de aplicaciones empresariales. 6 | 7 | ## ¿Qué es una Api Rest? 8 | 9 | Una API REST (Representational State Transfer) es una arquitectura para el diseño de sistemas distribuidos basados en la web. En una API REST, los recursos (como datos o funcionalidades) se representan como URI (Identificadores de Recursos Uniformes) y se pueden acceder a través de operaciones estándar HTTP (GET, POST, PUT, DELETE, etc.). 10 | 11 | Una API REST permite a los desarrolladores crear aplicaciones que pueden comunicarse entre sí a través de Internet de manera flexible y ligera. Facilita la integración y el intercambio de datos entre diferentes sistemas y aplicaciones, lo que resulta en una mayor eficiencia y escalabilidad. 12 | 13 | ## Pasos para instalar OpenJDK y Git en AWS Linux 2023 14 | 15 | ### Paso 1: Conectarse a su instancia de AWS Linux. 16 | 17 | Utilice su cliente SSH favorito para conectarse a su instancia de AWS Linux. 18 | 19 | ```bash 20 | ssh -i your_key.pem ec2-user@your_instance_public_ip 21 | ``` 22 | 23 | Es necesario que tu archivo de clave `.pem` tenga permisos de solo lectura; de lo contrario, podrías encontrarte con el error "Permissions 0644 for your_key.pem are too open". Para resolver este problema, establece permisos de solo lectura para el archivo `.pem`. 24 | 25 | ```bash 26 | chmod 400 your_key.pem 27 | ``` 28 | 29 | El comando `chmod` en sistemas operativos tipo Unix se utiliza para cambiar los permisos de un archivo o directorio. En este comando, 400 especifica que el propietario del archivo (your_key.pem) debe tener permisos de solo lectura, mientras que todos los demás usuarios no tienen ningún permiso. 30 | 31 | ### Paso 2: Actualizar el sistema. 32 | 33 | Antes de instalar cualquier paquete nuevo, es una buena práctica actualizar los paquetes existentes en el sistema. 34 | 35 | ```bash 36 | sudo dnf update 37 | ``` 38 | 39 | ### Paso 3: Instalar OpenJDK. 40 | 41 | Amazon Corretto es una distribución sin costo, multiplataforma y lista para producción de Open Java Development Kit (OpenJDK). Corretto cuenta con soporte a largo plazo que incluirá mejoras de rendimiento y correcciones de seguridad: 42 | 43 | ```bash 44 | sudo dnf install java-17 45 | ``` 46 | 47 | ### Paso 4: Instalar Git y clonar un repositorio. 48 | 49 | Aunque Git y GitHub son herramientas independientes, se complementan entre sí para facilitar la colaboración y el desarrollo de software en equipo. Además, aunque no es necesario, Git y GitHub pueden utilizarse en conjunción con instancias EC2 de Amazon para transferir archivos y desplegar aplicaciones en la nube de AWS de manera eficiente. 50 | 51 | ```bash 52 | sudo dnf install git 53 | ``` 54 | Si no cuentas con un repositorio, puede clonar el siguiente proyecto de Spring Boot `aws-ec2-demo`. 55 | 56 | ```bash 57 | git clone https://github.com/sergiotrrs/aws-ec2-demo.git 58 | ``` 59 | El proyecto `aws-ec2-demo`cuenta con dos perfiles, en el perfil por default usa una base de datos en memoria H2, en el perfil `dev` realiza la conexión con una base de datos en MySQL. 60 | 61 | ## Ejecuta una aplicación de Spring Boot con una base de datos en memoria. 62 | 63 | ### Paso 1: Ejecuta una aplicación usando Gradle o Maven. 64 | 65 | Prueba la aplicación en la instancias EC2, para ello dirígete a la raíz del proyecto clonado y verifica los permisos del archivo gradlew o mvnw. 66 | 67 | ```bash 68 | ls -l gradlew 69 | ``` 70 | El archivo gradlew(o mvnw) deben tener permisos de ejecucíón, de no ser así, cambia los permisos para poder ejecutar el script. 71 | 72 | ```bash 73 | chmod +x gradlew 74 | ``` 75 | 76 | Ejecuta tu aplicación. En caso de que uses Maven ejecuta `./mvnw spring-boot:run`. 77 | 78 | ```bash 79 | ./gradlew bootRun 80 | 81 | ``` 82 | 83 | Para detener la aplicación pulsa las teclas `ctrl + c`. Deten la apliación hasta que hayas terminado con las pruebas que se describe en el siguiente paso. 84 | 85 | ### Paso 2: Realiza pruebas en los endpoints de tu aplicación 86 | 87 | Si has clonado el proyecto anteriormente, puedes realizar el registro de un usuario utilizando el comando cURL. Dado que la terminal SSH está ocupada ejecutando la aplicación Spring Boot, necesitarás abrir otra conexión SSH como se indicó en el [Paso 1: Conectar a tu instancia de AWS Linux](#paso-1-conectar-a-tu-instancia-de-aws-linux). Una vez que hayas abierto otra conexión SSH, ejecuta los siguientes comandos: 88 | 89 | ```bash 90 | curl -d '{"email":"winnie@disney.com","password":"honeyhoney","firstName":"winnie", "lastName":"pooh"}' -H "Content-Type:application/json" localhost:8080/api/v1/users 91 | ``` 92 | ```bash 93 | curl localhost:8080/api/v1/users 94 | ``` 95 | 96 | ## Ejecuta una aplicación de Spring Boot con una base de datos en MySQL o MariaDB 97 | 98 | ### Paso 1: Verificar la existencia de la base de datos en MySQL o MariaDB 99 | 100 | Antes de ejecutar la aplicación de Spring Boot, es importante asegurarse de que la base de datos necesaria esté disponible. Si no tienes una base de datos existente, puedes crear una nueva siguiendo las instrucciones proporcionadas en los tutoriales [MariaDB_installation_guide.md](MariaDB_installation_guide.md) y [MariaDB_createDB.md](MariaDB_createDB.md). 101 | 102 | Para la aplicación `aws-ec2-demo`, asegúrate de crear una base de datos con las siguientes credenciales: 103 | 104 | - **Host name**: localhost 105 | - **Port**: 3306 106 | - **Database**: `my_ecommerce` 107 | - **User name**: mickey_mouse 108 | - **Password**: d1sn3y 109 | 110 | ### Paso 2: Genera el empaquetado(.jar) de tu aplicación. 111 | 112 | Un archivo .jar es un archivo Java que se utiliza para empaquetar y distribuir aplicaciones Java. "JAR" significa "Java ARchive". Cuando ejecutas un archivo .jar de una aplicación Spring Boot, automáticamente se inicia un servidor embebido que ejecuta tu aplicación. Esto significa que no necesitas preocuparte por configurar un servidor web por separado; Spring Boot se encarga de todo por ti. 113 | 114 | Para generar el empaquetado (.jar) de tu aplicación, ejecuta el siguiente comando desde la raíz de tu aplicación. Si estás utilizando Maven, ejecuta `./mvnw clean package`. 115 | 116 | ```bash 117 | ./gradlew build 118 | ``` 119 | 120 | ## Paso 3: Ejecuta el archivo empaquetado de tu aplicación. 121 | 122 | Para ejecutar el archivo empaquetado de tu aplicación, utiliza el siguiente comando desde la raíz de tu aplicación `java -jar springboot_app.jar`. Si estás utilizando variables de entorno, indícalo como se muestra a continuación: 123 | 124 | ```bash 125 | java -jar -Dspring.profiles.active=prod -Dserver.port=8080 -DMYSQLHOST=localhost -DMYSQLDATABASE=my_ecommerce -DMYSQLPORT=3306 -DMYSQLUSER=mickey_mouse -DMYSQLPASSWORD=d1sn3y build/libs/aws-ec2-demo-1.0.0.jar 126 | ``` 127 | 128 | Si usas Maven cambia la ruta del empaquetado a `/target/my-ecommerce-demo-1.0.0.jar`. Puedes probar el funcionamiento de tu aplicación haciendo una consulta HTTP desde otra ventana de comandos conectada a tu instancia EC2. 129 | 130 | ```bash 131 | curl localhost:8080/api/v1/users 132 | ``` 133 | 134 | Deten la ejecución de tu empaquetado presionando las teclas `ctrl + c`. 135 | 136 | ### Paso 4 (opcional): Realiza pruebas a los endpoints de tu aplicación. 137 | 138 | Si la aplicación de Spring Boot está detenida, ejecútala nuevamente como se indicó en el paso anterior. Puedes registrar un nuevo usuario utilizando el comando cURL. Dado que la terminal SSH está ocupada ejecutando la aplicación Spring Boot, necesitarás abrir otra conexión SSH como se indicó en el [Paso 1: Conectar a tu instancia de AWS Linux](#paso-1-conectar-a-tu-instancia-de-aws-linux). 139 | 140 | Una vez que hayas abierto otra conexión SSH, ejecuta los siguientes comandos: 141 | 142 | ```bash 143 | curl -d '{"email":"winnie@disney.com","password":"honeyhoney","firstName":"winnie", "lastName":"pooh"}' -H "Content-Type:application/json" localhost:8080/api/v1/users 144 | ``` 145 | 146 | ```bash 147 | curl localhost:8080/api/v1/users 148 | ``` 149 | 150 | - Si el puerto por defecto(8080) está abierto en la instancia EC2, puedes hacer peticiones http usando Postman escribiendo la URL `http://your_instance_public_ip:8080/api/v1/users` 151 | 152 | - Debido que la conexión se realizará a una base de datos persistente, después de hacer una solicitud POST puedes detener tu aplicación y verificar que los datos agregados seguirán registrados. 153 | 154 | Una vez finalizado las pruebas deten tu aplicación presionando las teclas `ctrl + c`. 155 | 156 | ## Configurar y habilitar el servicio de tu aplicación en la instancia EC2. 157 | 158 | Los siguientes pasos te permiten configurar y habilitar un servicio en un sistema Amazon Linux, lo que asegura que el servicio se inicie automáticamente al arrancar el sistema y que se ejecute según la configuración especificada en el archivo de servicio. 159 | 160 | ### Paso 1: Crear el archivo de servicio. 161 | 162 | Primero, necesitas crear un archivo de servicio en el directorio /etc/systemd/system/ con la extensión .service. 163 | 164 | ```bash 165 | sudo touch /etc/systemd/system/springboot-app.service 166 | ``` 167 | 168 | ### Paso 2: Edita el archivo de servicios. 169 | 170 | El siguiente comando te ayudará a iniciar la configuración del archivo .service. Recuerda escribir correctamente el nombre del archivo creado anteriormente. 171 | 172 | ```bash 173 | sudo tee -a /etc/systemd/system/springboot-app.service <