DEV Community

Cover image for Desplegando Bot de Telegram a AWS ECS con AWS Copilot [paso a paso] para principiantes
Christian Prado Ciokler
Christian Prado Ciokler

Posted on • Edited on

Desplegando Bot de Telegram a AWS ECS con AWS Copilot [paso a paso] para principiantes

Copilot es una herramienta joven para crear e implementar servicios en contenedores sin manejar todos los problemas de configuración de ECS, EC2 y Fargate. Tal vez haya una mejor manera de implementar este tipo de proyecto, pero esta es una mas, quizás a alguien le resulte de útil.

🙏 Espero que les sea de ayuda 👍 este articulo, así que vamos al grano. 🚀

Tabla de contenido


El Stack ☝️

Para este proyecto vamos a utilizar las siguientes herramientas, no se preocupen si no saben cómo utilizarlas, le dejo los enlaces de la documentación a continuación. De todos modos, esta es una guía paso a paso hasta el final.

OS: Windows -debe funcionar con otros sistemas-
Node docs Instalación
AWS CLI v2 docs Instalación
Copilot Cli docs Instalación
Docker docs Instalación
Telegraf docs Instalación
Binance API docs
Axios docs


Instalando Node ☝️

Primero, instalamos Node, no hay mucho que decir al respecto, solo sigan este enlace aquí para descargar Node y el instalador los guiará a través del proceso. En el momento en que se crea esta publicación, estamos usando la versión 16.11.0.


Instalando AWS CLI ☝️

En primer lugar, debemos tener una cuenta de AWS, por lo que si no la tienen pueden crear una aquí.

Una vez creada la cuenta instalamos AWS CLI v2 y revisamos si funciona con el comando aws help

Con todo en orden, el siguiente paso es configurar las credenciales de AWS. Entonces necesitamos crear claves de acceso para un usuario de IAM.

  1. Inicie sesión en la Consola de administración de AWS y abra la consola de IAM aquí.

  2. En el panel de navegación, escoge Users.

  3. Elija el nombre del usuario cuyas claves de acceso desea crear y luego selecciona Security credentials .

  4. En la sección Access keys , selecciona Create access key.

  5. Para ver el nuevo par de claves de acceso, elija Show . No tendrá acceso a la clave secreta nuevamente después de que se cierre este cuadro de diálogo. Sus credenciales se verán así:
    Access key ID: AKIAIOSFODNN7EXAMPLE
    Secret access key: wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY

  6. Para descargar el par de claves, selecciona Download .csv file. Guarde las llaves en un lugar seguro. No tendrá acceso a la clave secreta nuevamente después de que se cierre este cuadro de diálogo.

  7. Mantenga las claves confidenciales para proteger su cuenta de AWS y nunca las envíe por correo electrónico. No las comparta fuera de su organización, incluso si una consulta parece provenir de AWS o Amazon.com. Nadie que represente legítimamente a Amazon jamás le pedirá su clave secreta.

  8. Después de descargar el archivo .csv, elija Close. Cuando crea una clave de acceso, el par de claves está activo de forma predeterminada y puede usar el par de inmediato.
    Para agregar las credenciales a la AWS CLI escribimos el comando aws configure --profile myprofilename en la terminal y seguimos los pasos.

  9. AWS Access Key ID [None]: AKIAI44QH8DHBEXAMPLE 

  10. AWS Secret Access Key [None]: je7MtGbClwBF/EXAMPLEKEY 

  11. Default region name [None]: us-east-1 

  12. Default output format [None]: json

Eso es todo, ¡haz configurado con éxito AWS CLI!


Instalando Copilot Cli ☝️

Las instrucciones para la instalación están aquí, una vez que haya terminado escriba copilot --help en su terminal si todo funciona como se supone,! Felicidades, tu pc es más inteligente que la mía, si tuviste un error no te preocupes yo tuve el mismo problema. Así es como puede solucionarlo.

Recuerde esta solución fue probada en el sistema operativo Windows.

  1. Busque los archivos instalados y elimínelos, copilot.exe, copilot.asc y ecs-cli.asc.
  2. Vuelva a instalarlos usando la terminal como administrador pero en esta carpeta.

Invoke-WebRequest -OutFile 'C:\Program Files\Amazon\Copilot\copilot.exe' https://github.com/aws/copilot-cli/releases/latest/download/copilot-windows.exe

Invoke-WebRequest -OutFile 'C:\Program Files\Amazon\Copilot\copilot.asc' https://github.com/aws/copilot-cli/releases/latest/download/copilot-windows.exe.asc

Invoke-WebRequest -OutFile 'C:\Program Files\Amazon\Copilot\ecs-cli.asc' https://github.com/aws/copilot-cli/releases/latest/download/copilot-windows.exe

  1. Presione Win + R y escriba esto rundll32.exe sysdm.cpl, EditEnvironmentVariables, se abrirá su panel de variables de entorno.
  2. Vaya a las variables del sistema, seleccione path y haga clic en editar, agregue una nueva ruta C:\Program Files\Amazon\Copilot o la ruta donde está el archivo copilot.exe.
  3. Guarde los cambios y reinicie.

Escribe el comando copilot --help en tu terminal y debería funcionar.


Instalando Docker ☝️

Descargue Docker aquí y siga las instrucciones.

Antes de instalar el backend de Docker Desktop WSL 2, debe completar los siguientes pasos:

  1. Instale Windows 10, versión 1903 o superior, o Windows 11.

  2. Habilite la función WSL 2 en Windows. Para obtener instrucciones detalladas, consulte la documentación de Microsoft.

  3. Descargue e instale el paquete de actualización del kernel de Linux.


    Configurando el proyecto ☝️

Crea una carpeta y dale un nombre de tu elección, el mío será crypto-bot-app, abre tu carpeta en tu IDE y escribe npm init -y

Agrega los paquetes. Escribe en la terminal npm i telegraf axios
¡¡¡Todo listo!!!


Creando el bot ☝️

  1. Abra su aplicación de Telegram y busque el BotFather e inicie el bot.
  2. Escribe el comando /newbot y dale un nombre, el mío será crypto-bot y el nombre de usuario crptobot
  3. Debería recibir un token como este 2098237194:AAH9QoFokuBOn0IqES0IGJdJ_AR-tySMOX4, guárdelo para más tarde.

¡Creaste tu primer bot !! ¡¡Felicitaciones !!, ahora vamos a agregarle código.


Escribiendo código ☝️

Cree un archivo index.js en la carpeta del proyecto donde vamos a poner este código.

const {Telegraf} = require('telegraf');
const axios = require('axios');

const bot = new Telegraf('2098237194:AAH9QoFokuBOn0IqES0IGJdJ_AR-tySMOX4');//your token

// START-----------------------------------------------
bot.start(async (ctx) => {
  await ctx.reply(`Hi ${ctx.from.first_name}`);
  await ctx.reply(`I still under development but you can use me to get the latest price of a cryptocurrency`);
  await ctx.reply(`For example to know the price of an specific crypto write the command /price and the symbol of the cryptocurrency`);
  await ctx.reply(`/price btc`);
});

// COMMANDS===============================================================
bot.command(['price', 'Price', 'PRICE'], (ctx)=> {
    try {
        const ticker = ctx.message.text.toLowerCase().split('/price ')[1].toUpperCase();
        const {data} = await axios.get(`https://api.binance.com/api/v3/ticker/price?symbol=${ticker}USDT`);
        ctx.reply(ticker+': '+data.price+' USDT');
      } catch (error) {
        ctx.reply('Some error occurred in your request, please try again');
      }
});

bot.launch();
Enter fullscreen mode Exit fullscreen mode

Probando el código ☝️

Antes de correr el bot, agreguemos el siguiente fragmento de código a nuestro package.json.

 "scripts": {
    "start": "node index.js", //here
    "test": "test",  
},
Enter fullscreen mode Exit fullscreen mode

Ahora ejecute el comando npm start, vaya a telegram, abra su bot y escriba /start o /price btc

Una vez que reciba la respuesta esperada, podemos continuar este viaje.


Configurando dockerfile ☝️

Crea un archivo en el directorio de su proyecto y asígnele el nombre Dockerfile, agregue este código de configuración.

FROM node:16.9.1

WORKDIR /app

COPY package*.json ./

RUN npm install

COPY . .

EXPOSE 80

CMD ["npm","start"]
Enter fullscreen mode Exit fullscreen mode

Además, cree un archivo con el nombre .dockerignore y agregue este:

copilot
node_modules
Enter fullscreen mode Exit fullscreen mode

Desplegando a ECS con Copilot Cli ☝️

Ahora que tenemos el dockerfile configurado correctamente, vamos a subir el bot en ECS para que funcione 24 horas al día, 7 días a la semana.

  1. Escriba el comando copilot init.
  2. Nombre de la aplicación, crypto-bot-app.
  3. Elegimos la carga de trabajo, en mi caso Backend Service.
  4. Nombre el servicio de backend como bot-main-service.
  5. Despliegue la aplicación con el comando copilot app deploy.

Refactorizando y actualizando ☝️

En este punto, podemos hacer una refactorización para optimizar nuestro código. Primero, crearemos una carpeta "src" con un archivo javascript llamado "bot-functions.js" y agregaremos este código.

bot-functions.js

const axios = require('axios');

module.exports = functions = {
  start_message: async (ctx) => {
    await ctx.reply(`Hi ${ctx.from.first_name}`);
      await ctx.reply(`I still under development but you can use me to get the latest price of a cryptocurrency`);
      await ctx.reply(`For example to know the price of an specific crypto write the command /price and the symbol of the cryptocurrency`);
      await ctx.reply(`/price btc`);
  },
  getCryptocurrencyPrice: async (ctx) => {
    try {
      const ticker = ctx.message.text.toLowerCase().split('/price ')[1].toUpperCase();
      const {data} = await axios.get(`https://api.binance.com/api/v3/ticker/price?symbol=${ticker}USDT`);
      ctx.reply(ticker+': '+data.price+' USDT');
    } catch (error) {
      ctx.reply('Some error occurred in your request, please try again');
    }
  },
};

Enter fullscreen mode Exit fullscreen mode

luego vaya a index.js y realice algunos cambios.

index.js

const {Telegraf} = require('telegraf');
const functions = require('./src/bot-functions.js');

const bot = new Telegraf('2098237194:AAH9QoFokuBOn0IqES0IGJdJ_AR-tySMOX4');//your token

bot.start((ctx) => functions.start_message(ctx));

bot.command(['price', 'Price', 'PRICE'], (ctx)=> functions.getCryptocurrencyPrice(ctx));

bot.launch();

Enter fullscreen mode Exit fullscreen mode

Ahora probamos que todo está funcionando correctamente, agregamos los cambios con el comando copilot app deploy.


The End ☝️

Ten en cuenta que este es un proyecto de desarrollo con fines educativos, en el mundo real debe almacenar tokens e información importante en variables del entorno, y todas las buenas prácticas que el trabajo exige. Si te gusto, dale un pulgar arriba: +1: y compártelo.

hasta la próxima publicación ...

Top comments (0)