Eficiencia a escala: una historia de la optimización de costos de AWS

Publicado: 2022-07-22

Recientemente lancé una plataforma de análisis de criptomonedas, esperando una pequeña cantidad de usuarios diarios. Sin embargo, cuando algunos YouTubers populares encontraron útil el sitio y publicaron una reseña, el tráfico creció tan rápido que sobrecargó el servidor y la plataforma (Scalper.AI) se volvió inaccesible. Mi entorno AWS EC2 original necesitaba soporte adicional. Después de considerar varias soluciones, decidí usar AWS Elastic Beanstalk para escalar mi aplicación. Las cosas se veían bien y funcionaban sin problemas, pero me sorprendieron los costos en el panel de facturación.

Este no es un problema poco común. Una encuesta de 2021 encontró que el 82 % de los responsables de la toma de decisiones en la nube y TI se han encontrado con costos innecesarios en la nube, y el 86 % no cree que pueda obtener una visión integral de todos sus gastos en la nube. Aunque Amazon ofrece una descripción detallada de los gastos adicionales en su documentación, el modelo de precios es complejo para un proyecto en crecimiento. Para facilitar la comprensión, desglosaré algunas optimizaciones relevantes para reducir los costos de la nube.

Por qué elegí AWS

El objetivo de Scalper.AI es recopilar información sobre los pares de criptomonedas (los activos intercambiados cuando se negocia en un intercambio), ejecutar análisis estadísticos y proporcionar a los comerciantes de criptomonedas información sobre el estado del mercado. La estructura técnica de la plataforma consta de tres partes:

  • Scripts de ingestión de datos
  • un servidor web
  • una base de datos

Los scripts de ingestión recopilan datos de diferentes fuentes y los cargan en la base de datos. Tenía experiencia trabajando con los servicios de AWS, así que decidí implementar estos scripts configurando instancias EC2. EC2 ofrece muchos tipos de instancias y le permite elegir el procesador, el almacenamiento, la red y el sistema operativo de una instancia.

Elegí Elastic Beanstalk para la funcionalidad restante porque prometía una administración de aplicaciones fluida. El equilibrador de carga distribuyó correctamente la carga entre las instancias de mi servidor, mientras que la función de escalado automático manejó la adición de nuevas instancias para aumentar la carga. La implementación de actualizaciones se volvió muy fácil, tomó solo unos minutos.

Scalper.AI funcionó de manera estable y mis usuarios ya no enfrentaron tiempo de inactividad. Por supuesto, esperaba un aumento en el gasto ya que agregué servicios adicionales, pero los números fueron mucho mayores de lo que había previsto.

Cómo podría haber reducido los costos de la nube

Mirando hacia atrás, había muchas áreas de complejidad en el uso de los servicios de AWS en mi proyecto. Examinaremos las optimizaciones presupuestarias que descubrí mientras trabajaba con características comunes de AWS EC2: instancias de rendimiento ampliable, transferencias de datos salientes, direcciones IP elásticas y estados de finalización y detención.

Instancias de rendimiento ampliable

Mi primer desafío fue respaldar el consumo de energía de la CPU para mi proyecto en crecimiento. Los scripts de ingestión de datos de Scalper.AI brindan a los usuarios análisis de información en tiempo real; los scripts se ejecutan cada pocos segundos y alimentan la plataforma con las actualizaciones más recientes de los intercambios de cifrado. Cada iteración de este proceso genera cientos de trabajos asincrónicos, por lo que el aumento del tráfico del sitio requirió más potencia de CPU para reducir el tiempo de procesamiento.

La instancia más barata ofrecida por AWS con cuatro vCPU, a1.xlarge, me habría costado ~$75 por mes en ese momento. En su lugar, decidí repartir la carga entre dos instancias t3.micro con dos vCPU y 1 GB de RAM cada una. Las instancias t3.micro ofrecían suficiente velocidad y memoria para el trabajo que necesitaba a una quinta parte del costo de a1.xlarge. Sin embargo, mi factura aún era mayor de lo que esperaba al final del mes.

En un esfuerzo por entender por qué, busqué en la documentación de Amazon y encontré la respuesta: cuando el uso de la CPU de una instancia cae por debajo de una línea de base definida, recopila créditos, pero cuando la instancia supera el uso de la línea de base, consume los créditos obtenidos anteriormente. Si no hay créditos disponibles, la instancia gasta los "créditos excedentes" proporcionados por Amazon. Esta capacidad de ganar y gastar créditos hace que Amazon EC2 promedie el uso de CPU de una instancia durante 24 horas. Si el uso promedio supera la línea de base, la instancia se factura de manera adicional a una tarifa fija por vCPU-hora.

Supervisé las instancias de ingesta de datos durante varios días y descubrí que la configuración de mi CPU, que estaba destinada a reducir costos, hizo lo contrario. La mayor parte del tiempo, mi uso promedio de CPU fue más alto que la línea de base.

Un gráfico tiene tres selecciones desplegables elegidas en la parte superior de la pantalla. Los dos primeros, a la izquierda, son "10 de febrero de 2022 - 19 de febrero de 2022" y "Diario", seguidos de una pequeña "i" en un círculo. El tercero está a la derecha de la pantalla y dice "Línea" con un símbolo para un gráfico de líneas. Debajo de las selecciones desplegables, el cuadro contiene dos gráficos de líneas con filtros. En la parte superior, la línea de filtro dice "Agrupar por: Tipo de uso" (el filtro seleccionado, que tiene un fondo azul) y luego muestra los filtros no seleccionados: "Servicio, Cuenta vinculada, Región, Tipo de instancia, Recurso, Categoría de costo, Etiqueta , Más", con "Recurso" atenuado y los tres últimos con flechas desplegables junto a ellos. El gráfico de la línea superior tiene "Costos ($)" en el eje y, que van desde 0,0 a 2,5. El gráfico de línea inferior tiene "Uso (vCPU-Horas)" en el eje y, que va de 0 a 40. Ambos gráficos de línea comparten fechas etiquetadas en el eje x, que van desde el 10 de febrero hasta el 19 de febrero, y una clave etiquetando sus líneas moradas: "USE2-CPUCredits:t3". El gráfico de línea superior tiene aproximadamente ocho puntos conectados linealmente y una tendencia ascendente con el tiempo: un punto alrededor (10 de febrero, $0.3), un segundo alrededor (11 de febrero, $0.6), un tercero alrededor (12 de febrero, $0.5), un un cuarto alrededor (14 de febrero, $2.1), un quinto alrededor (15 de febrero, $2.4), un sexto alrededor (16 de febrero, $2.3), un séptimo alrededor (18 de febrero, $2.3) y un octavo alrededor (de febrero a 19, $2.6). El gráfico de línea inferior también tiene aproximadamente ocho puntos conectados linealmente y una tendencia ascendente con el tiempo: un punto alrededor (10 de febrero, 5 vCPU-horas), un segundo alrededor (11 de febrero, 15 vCPU-horas), un tercero alrededor (febrero -12, 10 vCPU-Horas), un cuarto alrededor (14 de febrero, 40 vCPU-Horas), un quinto alrededor (15 de febrero, 50 vCPU-Horas), un sexto alrededor (16 de febrero, 45 vCPU-Horas) , un séptimo alrededor (18 de febrero, 45 vCPU-Horas) y un octavo alrededor (19 de febrero, 55 vCPU-Horas).
El gráfico anterior muestra los aumentos de costos (gráfico superior) y el aumento del uso de crédito de CPU (gráfico inferior) durante un período en el que el uso de CPU estaba por encima de la línea de base. El costo en dólares es proporcional a los créditos excedentes gastados, ya que la instancia se factura por vCPU-hora.

Inicialmente analicé el uso de la CPU para algunos pares criptográficos; la carga era pequeña, así que pensé que tenía mucho espacio para crecer. (Utilicé solo una microinstancia para la ingesta de datos, ya que menos pares de criptografía no requerían tanta potencia de CPU). Sin embargo, me di cuenta de las limitaciones de mi análisis original una vez que decidí hacer que mis conocimientos fueran más completos y respaldar la ingesta de datos. para cientos de pares criptográficos, el análisis del servicio en la nube no significa nada a menos que se realice a la escala correcta.

Transferencias de datos salientes

Otro resultado de la expansión de mi sitio fue el aumento de las transferencias de datos desde mi aplicación debido a un pequeño error. Con el tráfico en constante crecimiento y sin más tiempo de inactividad, necesitaba agregar funciones para captar y mantener la atención de los usuarios lo antes posible. Mi actualización más reciente fue una alerta de audio que se activaba cuando las condiciones del mercado de un par criptográfico coincidían con los parámetros predefinidos por el usuario. Desafortunadamente, cometí un error en el código y los archivos de audio se cargaron en el navegador del usuario cientos de veces cada pocos segundos.

El impacto fue enorme. Mi error generó descargas de audio de mis servidores web, lo que provocó transferencias de datos salientes adicionales. Un pequeño error en mi código resultó en una factura casi cinco veces mayor que las anteriores. (Esta no fue la única consecuencia: el error podría causar una pérdida de memoria en la computadora del usuario, por lo que muchos usuarios dejaron de regresar).

Un gráfico similar al anterior pero con el primer menú desplegable que dice "06 de enero de 2022 - 15 de enero de 2022", los "Costos ($)" del gráfico de línea superior que van de 0 a 30, y el gráfico de línea inferior que tiene " (GB)" en el eje y, que va de 0 a 300. Ambos gráficos de líneas comparten fechas etiquetadas en el eje x, que van desde el 6 de enero hasta el 15 de enero, y una clave que etiqueta sus líneas moradas: "USE2- Bytes de salida de transferencia de datos". El gráfico de línea superior tiene aproximadamente ocho puntos conectados linealmente y una tendencia ascendente con el tiempo: un punto alrededor (06 de enero, $2), un segundo alrededor (08 de enero, $4), un tercero alrededor (09 de enero, $7), un un cuarto alrededor (10 de enero, $6), un quinto alrededor (12 de enero, $15), un sexto alrededor (13 de enero, $25), un séptimo alrededor (14 de enero, $24) y un octavo alrededor (enero- 15, $29). El gráfico de línea inferior también tiene aproximadamente ocho puntos conectados linealmente y una tendencia ascendente con el tiempo: un punto alrededor (06 de enero, 10 GB), un segundo alrededor (08 de enero, 50 GB), un tercero alrededor (09 de enero de 80 GB), un cuarto alrededor (10 de enero, 70 GB), un quinto alrededor (12 de enero, 160 GB), un sexto alrededor (13 de enero, 270 GB), un séptimo alrededor (14 de enero, 260 GB) , y un octavo alrededor (15 de enero, 320 GB).
El gráfico anterior muestra los aumentos de costos (gráfico superior) y el aumento de las transferencias de datos salientes (gráfico inferior). Debido a que las transferencias de datos salientes se facturan por GB, el costo en dólares es proporcional al uso de datos salientes.

Los costos de transferencia de datos pueden representar más del 30 % de los aumentos de precios de AWS. La transferencia entrante de EC2 es gratuita, pero los cargos por transferencia saliente se facturan por GB (0,09 USD por GB cuando creé Scalper.AI). Como aprendí por las malas, es importante tener cuidado con el código que afecta los datos salientes; reducir las descargas o la carga de archivos cuando sea posible (o monitorear cuidadosamente estas áreas) lo protegerá de tarifas más altas. Estos centavos se suman rápidamente, ya que los cargos por transferir datos de EC2 a Internet dependen de la carga de trabajo y de las tarifas específicas de la región de AWS. Una advertencia final desconocida para muchos nuevos clientes de AWS: la transferencia de datos se vuelve más costosa entre diferentes ubicaciones. Sin embargo, el uso de direcciones IP privadas puede evitar costos adicionales de transferencia de datos entre diferentes zonas de disponibilidad de la misma región.

Direcciones IP elásticas

Incluso cuando se utilizan direcciones públicas como direcciones IP elásticas (EIP), es posible reducir los costos de EC2. Los EIP son direcciones IPv4 estáticas que se utilizan para la computación en la nube dinámica. La parte "elástica" significa que puede asignar un EIP a cualquier instancia de EC2 y usarlo hasta que decida detenerse. Estas direcciones le permiten intercambiar sin problemas instancias en mal estado por otras en buen estado reasignando la dirección a una instancia diferente en su cuenta. También puede usar EIP para especificar un registro DNS para un dominio de modo que apunte a una instancia EC2.

AWS proporciona solo cinco EIP por cuenta por región, lo que los convierte en un recurso limitado y costoso con un uso ineficiente. AWS cobra una tarifa por hora baja por cada EIP adicional y factura extra si reasigna un EIP más de 100 veces en un mes; mantenerse por debajo de estos límites reducirá los costos.

Estados de terminación y detención

AWS ofrece dos opciones para administrar el estado de las instancias EC2 en ejecución: terminar o detener. La terminación cerrará la instancia y la máquina virtual aprovisionada para ella ya no estará disponible. Todos los volúmenes de Elastic Block Store (EBS) adjuntos se desconectarán y eliminarán, y todos los datos almacenados localmente en la instancia se perderán. Ya no se le cobrará por la instancia.

Detener una instancia es similar, con una pequeña diferencia. Los volúmenes de EBS adjuntos no se eliminan, por lo que sus datos se conservan y puede reiniciar la instancia en cualquier momento. En ambos casos, Amazon ya no cobra por usar la instancia, pero si opta por detenerse en lugar de terminar, los volúmenes de EBS generarán un costo mientras existan. AWS recomienda detener una instancia solo si espera reactivarla pronto.

Pero hay una función que puede aumentar su factura de AWS a fin de mes, incluso si canceló una instancia en lugar de detenerla: las instantáneas de EBS. Estas son copias de seguridad incrementales de sus volúmenes de EBS almacenados en el Servicio de almacenamiento simple (S3) de Amazon. Cada instantánea contiene la información que necesita para crear un nuevo volumen de EBS con sus datos anteriores. Si finaliza una instancia, sus volúmenes de EBS asociados se eliminarán automáticamente, pero sus instantáneas permanecerán. Como S3 cobra por el volumen de datos almacenados, le recomiendo que elimine estas instantáneas si no las usará en breve. AWS presenta la capacidad de monitorear la actividad de almacenamiento por volumen utilizando el servicio CloudWatch:

  1. Mientras está conectado a la Consola de AWS, desde el menú Servicios de la parte superior izquierda, busque y abra el servicio CloudWatch.
  2. En el lado izquierdo de la página, en el menú desplegable Métricas , haga clic en Todas las métricas .
  3. La página muestra una lista de servicios con métricas disponibles, incluidos EBS, EC2, S3 y más. Haga clic en EBS y luego en Métricas por volumen . (Nota: la opción EBS solo estará visible si tiene volúmenes de EBS configurados en su cuenta).
  4. Haga clic en la pestaña Consulta . En la vista Editor , copie y pegue el comando SELECT AVG(VolumeReadBytes) FROM "AWS/EBS" GROUP BY VolumeId y luego haga clic en Run . (Nota: CloudWatch usa un dialecto de SQL con una sintaxis única).

Aparece una página web con un menú de encabezado azul oscuro en la parte superior de la página, que de izquierda a derecha incluye el logotipo de aws, un menú desplegable "Servicios", una barra de búsqueda, un icono de código, un icono de campana, un icono de signo de interrogación, un texto desplegable que dice "N. Virginia" y un texto desplegable que dice "Cuenta de prueba de Toptal". Debajo, vemos la parte principal de la página web en blanco. La izquierda de la página tiene un menú desplegable con el título "CloudWatch" y una "X". Debajo, de arriba a abajo, el menú dice: "Favoritos y recientes", "Paneles", "Alarmas" (en negrita, con tres menús desplegables: "En alarma", "Todas las alarmas" y "Facturación"), "Registros" (en negrita, con dos menús desplegables: "Grupos de registros" y "Perspectivas de registros"), "Métricas" (en negrita, con tres menús desplegables: "Todas las métricas", que se resalta en naranja brillante, " Explorer" y "Flujos"), "Trazas de rayos X" (en negrita), "Eventos" (en negrita) y "Supervisión de aplicaciones" (en negrita). Todo el texto en negrita en el menú tiene un triángulo de menú desplegable a la izquierda del texto. La mitad de la página web muestra un gráfico en la mitad superior de la página y un editor en la mitad inferior de la página. El gráfico tiene dos líneas de encabezados. La primera línea dice "CloudWatch > Métricas" a la izquierda (con el texto "CloudWatch" en azul) y "Cambiar a su interfaz original" en azul a la derecha. La segunda línea dice "Gráfico sin título" con un ícono de edición a la izquierda y muestra opciones a la derecha: "1h, 3h, 12h, 1d, 3d, 1w, Personalizado" (con "3h" en azul y "Personalizado" con un icono de calendario), "Línea" (con un icono desplegable), "Acciones" (con un icono desplegable) y un botón de actualización con un icono desplegable. El gráfico en sí tiene un texto en el centro que dice: "Su gráfico de CloudWatch está vacío. Seleccione algunas métricas para que aparezcan aquí". El editor también tiene dos líneas de encabezados. La primera línea dice "Examinar", "Consulta" (resaltado en naranja), "Métricas gráficas", "Opciones" y "Fuente" a la izquierda, y "Agregar matemática" (con un ícono desplegable) y "Agregar consulta" (con un icono desplegable) a la derecha. La segunda línea dice "Metrics Insights: editor de consultas" e "Información" (en azul) a la izquierda, y "Generador" y "Editor" (con "Editor" seleccionado) a la derecha. Debajo del editor hay un botón naranja "Ejecutar" a la izquierda y el texto "Use Ctrl + Intro para ejecutar la consulta, Ctrl + Espacio para autocompletar" a la derecha. La derecha de la página web tiene un menú blanco, que dice "Consultas" y "Ayuda" de arriba a abajo.
Una descripción general de la configuración de monitoreo de CloudWatch descrita anteriormente (se muestra con datos vacíos y sin métricas seleccionadas). Si tiene instancias de EBS, EC2 o S3 existentes en su cuenta, aparecerán como opciones de métricas y completarán su gráfico de CloudWatch.

CloudWatch ofrece una variedad de formatos de visualización para analizar la actividad de almacenamiento, como gráficos circulares, líneas, barras, gráficos de áreas apiladas y números. El uso de CloudWatch para identificar instantáneas y volúmenes de EBS inactivos es un paso fácil para optimizar los costos de la nube.

Dinero extra en tu bolsillo

Aunque las herramientas de AWS como CloudWatch ofrecen soluciones decentes para el monitoreo de costos en la nube, varias plataformas externas se integran con AWS para un análisis más completo. Por ejemplo, las plataformas de administración de la nube como CloudHealth de VMWare muestran un desglose detallado de las principales áreas de gasto que se pueden usar para el análisis de tendencias, la detección de anomalías y el monitoreo de costos y rendimiento. También le recomiendo que configure una alarma de facturación de CloudWatch para detectar aumentos repentinos en los cargos antes de que se vuelvan excesivos.

Amazon ofrece muchos servicios excelentes en la nube que pueden ayudarlo a delegar el trabajo de mantenimiento de servidores, bases de datos y hardware al equipo de AWS. Si bien los costos de la plataforma en la nube pueden crecer fácilmente debido a errores o errores de los usuarios, las herramientas de monitoreo de AWS brindan a los desarrolladores el conocimiento para defenderse de los gastos adicionales.

Con estas optimizaciones de costos en mente, está listo para poner en marcha su proyecto y ahorrar cientos de dólares en el proceso.

El logotipo de AWS con la palabra "SOCIO" y el texto "Servicios de nivel avanzado" debajo.
Como socio consultor avanzado en Amazon Partner Network (APN), Toptal ofrece a las empresas acceso a expertos certificados por AWS, bajo demanda, en cualquier parte del mundo.