Hola a todos, hoy quiero hacer un tutorial sobre una de mis formas favoritas de implementar una API REST rápida, usando NodeJS/Express, en un servidor Amazon EC2. Básicamente, esta técnica permite que su servidor EC2 responda a los cambios enviados a su repositorio de GitHub.
Cree un nuevo directorio en su máquina para que viva una aplicación NodeJS/Express. Estoy llamando a mi rekognition
Abra una terminal y ejecute este comando para inicializar un paquete.json npm init -y
Instalar express.js npm i express
Cree un servidor express básico con un 'hola mundo' en la ruta predeterminada
const express = require('express'); const app = express(); const port = 3000; app.get('/', (req, res) => { res.send('Hello World!'); }); app.listen(port, () => { console.log(`Example app listening at http://localhost:${port}`); });
Pruebe para asegurarse de que está viendo '¡Hola mundo!' en http://localhost:3000/
¡Buen trabajo, paso uno completo! 💪
Inicialice un repositorio de Git en su directorio y realice su primera confirmación:
git init git add . git commit -m "First commit"
Crea un repositorio remoto en tu cuenta de GitHub
Agregue el nuevo repositorio como origen y envíe su rama.
git remote add origin <REMOTE_REPOSITORY_URL> git push -u origin master
Reemplace <REMOTE_REPOSITORY_URL>
con el enlace al repositorio remoto que acaba de crear.
Es posible que necesites cambiar la configuración de tu repositorio para usar 'master' como rama predeterminada en lugar de 'main'.
Después de hacer esto, puede eliminar la rama 'principal'.
Paso 2: ¡completa! Estamos cocinando con gas ⛽️
Estos son los pasos para iniciar su instancia EC2:
Navegue hasta el panel de EC2 e inicie una nueva instancia.
Elija una AMI (imagen de máquina de Amazon) adecuada; Estoy usando Amazon Linux 2.
Ahora, probemos el inicio de sesión en su servidor a través de SSH en una terminal:
ssh ec2-user@<YOUR_SERVER_IP> -i <YOUR_PRIVATE_KEY>.pem
Reemplace las variables allí con los valores que definió para su instancia EC2.
Si ves esto, te has conectado a tu servidor, ¡felicidades! 👏
Instalemos NodeJS en nuestro servidor:
sudo yum install -y nodejs
Instale pm2 globalmente en nuestro servidor a través de npm
sudo npm i -g pm2
Instale git en el servidor y configure sus credenciales:
sudo yum install git -y
git config --global user.name "Your Name" git config --global user.email "[email protected]"
Bien, ahora vamos a crear una carpeta var/www/
si aún no existe:
sudo mkdir -p /var/www
Luego agregue propiedad a nuestro usuario ec2:
sudo chown -R ec2-user:ec2-user /var/www
Navegue al directorio desde la raíz de su servidor , no a la carpeta /home people 👌 cd ~/var/www
Ahora, desde aquí, clonaremos nuestro repositorio git: git clone https://github.com/USERNAME/REPO_NAME.git YOUR_PROJECT_DIRECTORY
Reemplace [NOMBRE DE USUARIO] [NOMBRE_REPO] y [DIRECTORIO_PROJECTO] con sus propios valores.
A continuación, cambiamos el directorio a nuestro repositorio, para que cd YOUR_PROJECT_DIRECTORY
pueda crear el archivo ecosystem.config.js
para nuestra configuración pm2:
nano ecosystem.config.js
Se parece a esto:
module.exports = { apps : [{ name: "my-app", // A name for your application script: "app.js", // The script file to launch the app instances: "max", // This can be set to the number of CPU cores to use, or "max" to use all available autorestart: true, // Automatically restart app if it crashes watch: false, // Enable/disable watching file changes for automatic restart max_memory_restart: '1G', // Optional: Restart app if it reaches a memory limit env: { NODE_ENV: "development", }, env_production: { NODE_ENV: "production", } }] };
Genial, está bien. Una vez creado y guardado, iniciemos la aplicación con pm2:
pm2 start ecosystem.config.js
Ahora podemos comprobar que tenemos un mensaje '¡Hola mundo!' desde nuestro servidor en el puerto 3000:
Para hacer que pm2 se inicie automáticamente al reiniciar el servidor, ejecutemos:
pm2 save pm2 startup
Para verificar que su servidor esté funcionando, puede verificar pm2 status
; Puedes leer los documentos en pm2 aquí.
Si has llegado hasta aquí, eres una superestrella ⭐️
Este es el último paso de nuestro proceso. Vamos a crear un archivo .yml
para que las acciones de Github actualicen nuestro servidor cada vez que se envíe un cambio a nuestra rama maestra.
En su repositorio, vaya a la pestaña "Acciones" y cree un nuevo flujo de trabajo personalizado. Estoy llamando al mío nodejs.yml
Aquí está el archivo .yml para actualizar el repositorio y reiniciar pm2:
name: Node.js CI/CD on Amazon Linux on: push: branches: [ master ] jobs: deploy: runs-on: ubuntu-latest steps: - uses: actions/checkout@v2 - name: Install dependencies run: npm install - name: Deploy to AWS EC2 uses: appleboy/scp-action@master with: host: ${{ secrets.REMOTE_HOST }} username: ${{ secrets.REMOTE_USER }} key: ${{ secrets.SSH_PRIVATE_KEY }} source: "./" # This now correctly points to the current directory target: "/var/www/your_project_directory" - name: Restart PM2 application uses: appleboy/ssh-action@master with: host: ${{ secrets.REMOTE_HOST }} username: ${{ secrets.REMOTE_USER }} key: ${{ secrets.SSH_PRIVATE_KEY }} script: | cd /var/www/your_project_directory pm2 reload all # This command restarts your application
Asegúrese de actualizar 'your_project_directory'
Por último, deberá agregar estos secretos ambientales. REMOTE_HOST
esta es la dirección IP de su servidor; REMOTE_USER
este es ec2-user
para la AMI de Amazon Linux 2 y luego pegue el contenido de su archivo .pem como SSH_PRIVATE_KEY
Puedes hacer todo esto en la configuración del repositorio:
¡Eso es todo! Ya terminamos jaja 😁
Puedes probar todo esto cambiando el mensaje 'Hola mundo' y enviando ese cambio a tu rama maestra; entonces deberías ver la actualización en http://your.ip.address:3000
Es un proceso un poco complicado de configurar, pero cuando estás desarrollando, es realmente bueno tener una canalización de CI/CD sencilla que implemente automáticamente los cambios en tu servidor API REST. De esa manera, puede implementar rápidamente los cambios en vivo y verlos en la interfaz de su aplicación web/móvil.
¡Déjame saber si esto fue útil en los comentarios y gracias por leer!
Tranquilízate,
— Wes