Skip to content

Todo para WordPress, el desarrollo web — y mucho más

🧠 Monitoreo de memoria y disco de EC2 con CloudWatch Agent: configuración paso a paso

🧠 Monitoreo de memoria y disco de EC2 con CloudWatch Agent: configuración paso a paso

Su instancia EC2 dejó de responder, pero ¿CloudWatch muestra que todo está bien? Un clásico. AWS proporciona métricas de CPU, red y E/S de disco de serie, pero no muestra el uso de memoria ni el espacio libre en disco. Esos números están ocultos dentro de la máquina virtual y, hasta que los extraiga, estará volando a ciegas.

Cuando la memoria se agota, la instancia no avisa; simplemente falla. El OOM Killer termina procesos en orden aleatorio y usted se queda conjeturando: ¿falló un plugin? ¿Se cayó la base de datos? La causa real es que se quedó sin los gigabytes de RAM que no estaba monitorizando. Con el disco ocurre lo mismo: los registros, las copias de seguridad y los archivos temporales llenan el almacenamiento en silencio, y una mañana se encuentra con No space left on device.

La solución es el CloudWatch Agent, el agente estándar de AWS que recopila métricas de memoria, disco, swap y alrededor de otras dos docenas de métricas del sistema y las envía a CloudWatch. La configuración lleva 20 minutos y cabe dentro de la capa gratuita (10 métricas personalizadas al mes). A continuación, una guía paso a paso desde IAM hasta un panel terminado.

💡 Resumen rápido:

  • Cree una política de IAM con cloudwatch:PutMetricData y asígnela a un usuario
  • Descargue e instale CloudWatch Agent en una instancia Ubuntu
  • Configure el archivo JSON: memoria, disco, swap
  • Inicie el agente y verifique que las métricas fluyen hacia CloudWatch
  • Construya un panel personalizado con gráficos de uso de memoria y disco

Gestión de identidad y acceso en AWS

El agente necesita permisos para enviar métricas a CloudWatch. Crearemos una política de IAM y la asignaremos a un usuario con acceso programático.

Política de IAM

Abra la consola de IAM, vaya a Políticas → Crear política y cambie a la pestaña JSON. Pegue este documento:

1{
2 "Version": "2012-10-17",
3 "Statement": [
4 {
5 "Sid": "CloudWatchAgentMetrics",
6 "Effect": "Allow",
7 "Action": [
8 "cloudwatch:PutMetricData",
9 "ec2:DescribeTags",
10 "cloudwatch:GetMetricStatistics",
11 "cloudwatch:ListMetrics"
12 ],
13 "Resource": "*"
14 }
15 ]
16}

Haga clic en Revisar política, introduzca un nombre (por ejemplo, CloudWatchAgentPolicy) y haga clic en Crear política.

Usuario de IAM

Vaya a Usuarios → Añadir usuario. Introduzca un nombre y asegúrese de marcar la casilla "Acceso programático"; esto proporciona el ID de clave de acceso y la clave de acceso secreta que el agente usará para autenticarse.

Creación de un usuario de IAM con acceso programático

En la pantalla de permisos, seleccione Adjuntar políticas existentes directamente. En el filtro de tipo de política, elija Administradas por el cliente para encontrar rápidamente la CloudWatchAgentPolicy que acaba de crear.

Asociación de la política de CloudWatch al usuario de IAM

Marque la política y haga clic en Siguiente → Crear usuario. AWS mostrará las claves de acceso. Guarde el ID de clave de acceso y la clave de acceso secreta ahora mismo. Si cierra la página, las claves desaparecerán para siempre y tendrá que volver a crearlas.

Claves de acceso de IAM tras la creación del usuario

Instalación de CloudWatch Agent

Los antiguos scripts de monitorización en Perl (CloudWatchMonitoringScripts-1.2.2.zip) están marcados como obsoletos desde hace tiempo. El enfoque actual es el CloudWatch Agent unificado, que recopila no solo memoria y disco, sino también swap, carga de CPU, interfaces de red y alrededor de otras dos docenas de métricas de serie.

Descarga e instalación

Conéctese a la instancia por SSH y descargue el paquete del agente para Ubuntu:

1wget https://amazoncloudwatch-agent.s3.amazonaws.com/ubuntu/amd64/latest/amazon-cloudwatch-agent.deb

Instale el paquete con dpkg:

1sudo dpkg -i amazon-cloudwatch-agent.deb

Si el gestor de paquetes se queja de dependencias faltantes, instálelas con un solo comando:

1sudo apt-get install -f

El agente está instalado pero aún no sabe qué métricas recopilar ni qué claves usar para la autenticación en CloudWatch. Vamos a configurarlo.

Nota: el agente también está disponible a través de AWS Systems Manager (SSM). Si tiene docenas de instancias, desplegarlo de forma centralizada mediante Run Command sin necesidad de SSH a cada máquina resulta más conveniente. Para una o dos instancias, la instalación manual es más sencilla y rápida.

Configuración del agente

Creación del archivo de configuración

La configuración de CloudWatch Agent es un documento JSON que describe qué métricas recopilar y con qué intervalo. Ejecute el asistente integrado:

1sudo /opt/aws/amazon-cloudwatch-agent/bin/amazon-cloudwatch-agent-config-wizard

El asistente hará varias preguntas interactivas: tipo de servidor (EC2/on‑premises), dónde enviar las métricas (CloudWatch) y qué métricas recolectar. Para monitorear memoria y disco, responda lo siguiente:

  • Sistema operativo: Linux
  • ¿Está usando Amazon EC2?:
  • Qué métricas recolectar: Métricas personalizadas (mem y disk_used_percent)
  • Resolución: 60 segundos (Estándar)
  • Archivos de log: omita si no necesita logs

El asistente generará un archivo config.json en el directorio /opt/aws/amazon-cloudwatch-agent/bin/. Este es un ejemplo mínimo funcional para porcentaje de memoria usada + porcentaje de disco usado + swap:

1{
2 "agent": {
3 "metrics_collection_interval": 60,
4 "run_as_user": "root"
5 },
6 "metrics": {
7 "metrics_collected": {
8 "mem": {
9 "measurement": [
10 "mem_used_percent"
11 ]
12 },
13 "disk": {
14 "measurement": [
15 "disk_used_percent"
16 ],
17 "resources": [
18 "/"
19 ]
20 },
21 "swap": {
22 "measurement": [
23 "swap_used_percent"
24 ]
25 }
26 }
27 }
28}

El parámetro resources para disk especifica el punto de montaje: "/" es el volumen raíz EBS NVMe SSD, el almacenamiento principal de la instancia. Si tiene volúmenes adicionales (por ejemplo, /data), agréguelos al arreglo.

Credenciales del agente

Las claves de acceso guardadas durante el paso de IAM deben proporcionarse al agente. Cree un archivo de credenciales en el directorio home del usuario:

1sudo nano /opt/aws/amazon-cloudwatch-agent/etc/amazon-cloudwatch-agent.toml

Agregue esta sección:

1[credentials]
2 shared_credential_profile = "AmazonCloudWatchAgent"

Luego agregue las credenciales al archivo estándar de credenciales de AWS:

1aws configure --profile AmazonCloudWatchAgent

El sistema solicitará el ID de clave de acceso, la clave de acceso secreta y la región. Después de completarlos, el agente podrá enviar métricas en nombre del usuario de IAM que usted creó.

Un enfoque alternativo es un rol de IAM asociado a la instancia. Esto es más seguro (no se almacenan claves en disco) y más simple al escalar. Si lanza EC2 con un rol de IAM que tenga cloudwatch:PutMetricData, el agente obtendrá los permisos automáticamente y usted puede omitir el paso de credenciales.

Pruebas

Inicie el agente manualmente y verifique que las métricas se estén enviando:

1sudo /opt/aws/amazon-cloudwatch-agent/bin/amazon-cloudwatch-agent-ctl \
2 -a fetch-config \
3 -m ec2 \
4 -c file:/opt/aws/amazon-cloudwatch-agent/bin/config.json \
5 -s

La bandera -s inicia el agente como un servicio. En uno o dos minutos, las primeras métricas aparecerán en CloudWatch. Para confirmar que los datos fluyen, abra la consola de CloudWatch, vaya a Métricas → Todas las métricas y busque el espacio de nombres CWAgent (el agente escribe allí por defecto).

Navegación por las métricas en la consola de CloudWatch

Expanda el espacio de nombres y verá las dimensiones InstanceId desglosadas por métricas: mem_used_percent, disk_used_percent y swap_used_percent. Haga clic en cualquier fila para generar un gráfico; puede verificar de inmediato que los datos están llegando y lucen razonables.

Cuatro métricas básicas (memoria, disco, swap, CPU) en dos instancias equivalen a 8 métricas. La capa gratuita de CloudWatch incluye 10 métricas personalizadas al mes, como se describe en la página de precios. Usted se mantiene dentro de ese límite. Si tiene más de tres instancias, algunas métricas excederán el límite, pero el costo es modesto: $0.30 por métrica al mes (datos de AWS a 2026).

Configuración de la programación

Por defecto, el agente se ejecuta como un servicio systemd y envía métricas en el intervalo especificado en metrics_collection_interval (60 segundos en nuestra configuración). No se requieren entradas adicionales en cron; systemd garantiza que el agente permanezca activo y se reinicie si falla.

Revise el estado:

1sudo systemctl status amazon-cloudwatch-agent

Verifique que el servicio esté active (running) y habilitado para el arranque (enabled). Si no es así, inícielo y habilítelo:

1sudo systemctl enable amazon-cloudwatch-agent
2sudo systemctl start amazon-cloudwatch-agent

Tras un reinicio, el agente se iniciará automáticamente.

Para una demostración visual del proceso completo, desde IAM hasta el panel de control, vea este video:

Crear un panel personalizado

Las métricas están llegando; ahora necesita empaquetarlas de forma ordenada. Le mostraré cómo crear un panel para monitorear una instancia de producción: memoria, disco, carga de CPU y saldo de créditos (para la serie T) en una sola pantalla.

Crear el panel

En la consola de CloudWatch, vaya a Dashboards → Create dashboard. Ingrese un nombre (por ejemplo, Production-EC2) y elija un tipo de widget.

Creación de un nuevo panel en CloudWatch

Seleccione Line para el primer gráfico; este tipo es el más adecuado para mostrar métricas a lo largo del tiempo.

Introducción de un nombre para el panel personalizado

Widget de gráfico

Haga clic en Add widget y seleccione el tipo Line, un gráfico de líneas simple y la mejor opción para la mayoría de las métricas. En el cuadro de diálogo que se abre, haga clic en Configure y navegue hasta el espacio de nombres CWAgent.

Selección del tipo de gráfico de líneas para el widget

Busque la métrica mem_used_percent para su instancia (por InstanceId) y haga clic en la fila; CloudWatch mostrará inmediatamente un gráfico.

Consejo: el tipo Stacked area funciona bien cuando un solo widget tiene múltiples métricas (por ejemplo, memoria + swap); Number es útil para leer instantáneamente el valor actual (práctico en una esquina del panel); Text es para encabezados y notas entre gráficos.

Ajustar el gráfico

Configuración del gráfico de métricas con selección del período

Algunos ajustes que hacen el gráfico legible:

  • Period: si el agente envía métricas una vez por minuto, elija un período de 1 minuto para ver la resolución completa de los datos.

  • Title: cambie el nombre de la leyenda del gráfico a algo amigable, como "RAM usada%" en lugar de mem_used_percent / i-1234567890abcdef0.

  • Y-axis maximum (Graph options): fije el límite (por ejemplo, 100 para porcentajes o 16 para 16 GB de RAM). Sin esto, CloudWatch autoescala el eje y un pico pequeño se ve tan alarmante como una situación crítica. Con un límite fijo, puede saber de un vistazo qué tan cerca está del límite.

Pestaña de opciones del gráfico con ajuste del máximo del eje Y

Haga clic en Create widget; el primer bloque del panel está listo. Repita para cada métrica: disk_used_percent, luego swap_used_percent, luego cpu_usage (una métrica integrada de EC2, no de CWAgent) y CPUCreditBalance para la serie T. Puede arrastrar, redimensionar y editar widgets. Cuando todo se vea bien, haga clic en Save dashboard.

Guardado del panel ensamblado en CloudWatch

El panel está listo. Agréguelo a favoritos (la estrella en el menú superior) y vuelva con un clic cuando necesite verificar el estado de la instancia antes de un despliegue o después de un pico de tráfico.

⁉️🤔 Preguntas frecuentes

¿Por qué las métricas estándar de EC2 no incluyen memoria y disco?

AWS virtualiza CPU y red a nivel de hipervisor; estas métricas están disponibles externamente sin ingresar al sistema operativo invitado. La memoria y el disco son recursos internos de la máquina virtual; el hipervisor no los conoce. Para verlos, necesita un agente dentro del sistema operativo que lea /proc/meminfo y df y envíe los datos a CloudWatch. Eso es exactamente lo que hace CloudWatch Agent: una vez por minuto consulta los contadores del sistema y los envía al espacio de nombres CWAgent. La lista completa de aproximadamente dos docenas de métricas está en la documentación oficial de AWS.

¿Cuánto cuesta esto?

Para un escenario típico de 1 o 2 instancias con 4 métricas cada una, nada. La capa gratuita de CloudWatch incluye 10 métricas personalizadas, 10 alarmas y 3 paneles por cuenta al mes, según la página de precios de CloudWatch. Dos instancias con 4 métricas cada una suman 8 de las 10 métricas gratuitas. Si tiene más de tres instancias, exceder el límite cuesta $0.30 por métrica al mes. Para una docena de servidores, eso son $6-9 al mes, el precio por evitar sorpresas a las tres de la mañana.

¿Por qué CloudWatch Agent es mejor que los viejos scripts en Perl?

Los scripts en Perl (mon-put-instance-data.pl) han sido oficialmente obsoletos desde 2023 y no reciben actualizaciones. CloudWatch Agent es la herramienta con soporte oficial que escribe no solo en CloudWatch sino también en Amazon Managed Prometheus; recopila métricas a través de StatsD y collectd; puede enviar logs y trazas. Lo más importante, se integra con Systems Manager, lo que significa que puede desplegarlo en 50 instancias con un solo comando desde la consola, sin SSH. Si todavía tiene scripts en Perl ejecutándose, migre: el antiguo formato awscreds.conf con claves en texto plano en disco es un agujero de seguridad. CloudWatch Agent funciona con roles de IAM y no requiere almacenar secretos en un archivo de texto.

¿Qué debo hacer si las métricas no aparecen en CloudWatch?

Verifique en orden: (1) estado del servicio mediante systemctl status amazon-cloudwatch-agent, que debería estar active; (2) logs del agente en /opt/aws/amazon-cloudwatch-agent/logs/amazon-cloudwatch-agent.log, donde encontrará el error específico; (3) permisos de IAM, el usuario o rol debe tener el permiso cloudwatch:PutMetricData; (4) región, el agente y la consola deben apuntar a la misma región de AWS. En mi experiencia, la abrumadora mayoría de los problemas son de permisos o de discrepancia de región.

¿Puedo monitorear instancias Windows?

Sí, CloudWatch Agent soporta Windows Server en igualdad de condiciones con Linux. La instalación es mediante un instalador MSI desde el mismo bucket de S3 (amazon-cloudwatch-agent.s3.amazonaws.com/windows/amd64/latest/). La configuración usa el mismo JSON, pero los nombres de las métricas difieren: en lugar de mem_used_percent, use Memory % Committed Bytes In Use. El asistente de configuración en Windows sustituirá automáticamente los nombres correctos.

Lo que el monitoreo de memoria y disco proporciona en la práctica

Lanzó CloudWatch Agent en una instancia Ubuntu, configuró la recolección de memoria, disco y swap, y agregó un panel con gráficos. ¿Qué cambió? Exactamente una cosa: el punto ciego desapareció. Usted ve no solo CPU y red, sino también los dos principales asesinos de instancias: fugas de memoria y discos llenos.

En la práctica, esto significa que nota la memoria aumentando gradualmente tres días ANTES de que el OOM Killer termine PHP-FPM. Ve que el disco se llenó casi por completo después de una actualización de tema y limpia los logs ANTES de que la base de datos colapse. Sin estas métricas, cada incidente se convierte en una investigación post-mortem. Con ellas, recibe una alerta en el canal media hora antes de la interrupción.

Si tiene más de tres instancias, configure CloudWatch Alarms en valores umbral (por ejemplo, mem_used_percent > 90 durante 5 minutos) y conecte notificaciones a través de SNS a Slack o Telegram. Agente + alarmas = se entera del problema por AWS, no por un cliente.

La configuración del agente es una inversión única de 20 minutos por instancia. Después de eso, funciona por sí solo.