Eficiencia a escala: una historia de la optimización de costos de AWS
Publicado: 2022-07-22Recientemente 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.
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).
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:
- Mientras está conectado a la Consola de AWS, desde el menú Servicios de la parte superior izquierda, busque y abra el servicio CloudWatch.
- En el lado izquierdo de la página, en el menú desplegable Métricas , haga clic en Todas las métricas .
- 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).
- 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).
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.