Este artículo demuestra los pasos necesarios para conectar directamente CloudWatch con Grafana, sin necesidad de bajar métricas a otro data source (como puede ser InfluxDB u otro). Esto permite crear todos los paneles y tableros que sea necesario sin implicar costo alguno e incorporando todas las posibilidades que permite Grafana.

Sólo se cobra el acceso a la API de CloudWatch, el cual es gratis hasta 1 millón de solicitudes. Teniendo en cuenta que por cada consulta Grafana hace una solicitud GetMetricStatistics, y cada vez que se solicita una dimensión en el editor de consultas hace una solicitud ListMetrics. Pasado el límite del millón de solicitudes, AWS cobra U$S 0,01 por cada 1000 solicitudes GetMetricStatistics o ListMetrics.

Grafana es una herramienta de visualización de métricas, monitoreo y alerta muy superior a lo que ofrece CloudWatch. Sin contar con el elevado costo de implementar tableros personalizados en AWS. Afortunadamente, Grafana soporta el uso de CloudWatch como origen de datos. Esto permite visualizar directamente en Grafana todos los datos y logs presentes en Logwatch.

Autenticación

Esta sección describe todos los pasos necesarios a llevar a cabo antes de poder agregar un data source CloudWatch en Grafana.

Para la autenticación desde Grafana se requiere crear una política de acceso a CloudWatch y vincularla a un nuevo rol. Además se requiere un usuario para acceder a CloudWatch desde Grafana.

Crear una política IAM

Abrir la consola de IAM y crear una nueva política desde "Políticas > Crear una política".

Seleccionar "JSON" y pegar la siguiente definición de política:

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "AllowReadingMetricsFromCloudWatch",
      "Effect": "Allow",
      "Action": [
        "cloudwatch:DescribeAlarmsForMetric",
        "cloudwatch:DescribeAlarmHistory",
        "cloudwatch:DescribeAlarms",
        "cloudwatch:ListMetrics",
        "cloudwatch:GetMetricStatistics",
        "cloudwatch:GetMetricData"
      ],
      "Resource": "*"
    },
    {
      "Sid": "AllowReadingLogsFromCloudWatch",
      "Effect": "Allow",
      "Action": [
        "logs:DescribeLogGroups",
        "logs:GetLogGroupFields",
        "logs:StartQuery",
        "logs:StopQuery",
        "logs:GetQueryResults",
        "logs:GetLogEvents"
      ],
      "Resource": "*"
    },
    {
      "Sid": "AllowReadingTagsInstancesRegionsFromEC2",
      "Effect": "Allow",
      "Action": ["ec2:DescribeTags", "ec2:DescribeInstances", "ec2:DescribeRegions"],
      "Resource": "*"
    },
    {
      "Sid": "AllowReadingResourcesForTags",
      "Effect": "Allow",
      "Action": "tag:GetResources",
      "Resource": "*"
    }
  ]
}

Presionar "Revisar la política" y especificar el nombre "Grafana-CloudWatch" y descripción "Acceso a CloudWatch desde Grafana".

Clic en "Crear una política" para finalizar.

Crear un rol IAM

El siguiente paso consiste en crear un rol para Grafana y asignarle la política creada en el paso anterior.

Abrir "Roles > Crear un rol". Seleccionar "Servicio de AWS/EC2" y continuar. Tipear "grafana" y seleccionar el rol "Grafana-CloudWatch". Finalmente especificar el nombre "Grafana" para el rol.

Crear un usuario IAM

Crear un usuario y asignarle el rol "Grafana":

Abrir "Usuarios > Añadir usuario(s). Especificar el nombre de usuario "grafana" y tipo de acceso "Acceso mediante programación".

En el siguiente paso elegir "Asociar directamente las políticas existentes" y elegir la política "Grafana-Logwatch".

Luego de revisar, crear el usuario y descargar el archivo .csv con la clave.

Asignar el rol IAM a la instancia EC2

Se debe asignar el rol IAM a la instancia EC2 donde está instalado grafana-server. Desde la consola de EC2, seleccionar la instancia correspondiente y abrir el menú "Acciones > Seguridad > Modificar rol de IAM". Elegir el rol "Grafana":

Configuración de Grafana

Antes de agregar el data source, configurar el archivo de credenciales de AWS:

root@debian:/var/log/grafana# cd
root@debian:~# cd /usr/share/grafana/
root@debian:/usr/share/grafana# nano .aws/credentials

Completar según los valores del .csv descargado al crear el usuario.

[default]
aws_access_key_id = ****
aws_secret_access_key = ****
region = us-east-1

Establecer permisos restrictivos al archivo de credenciales y el directorio .aws:

root@debian:/usr/share/grafana# chmod 750 .aws
root@debian:/usr/share/grafana# chmod 440 .aws/credentials 
root@debian:/usr/share/grafana# chown -R grafana:root .aws/

Configurar el Data Source CloudWatch

Acceder a "Configuration > Data Sources" y presionar "Addd data source".

Elegir "CloudWatch" y configurar de la siguiente forma:

Al guardar y testear se debe ver el mensaje "Data source is working".

Crear un panel

A partir de este momento es posible comenzar a crear paneles utilizando el data source "CloudWatch" como origen de datos:

Ejemplo de consulta:

Para transformar la gráfica de puntos desconectados en una curva (ya que el período de muestreo de CloudWatch es variable) es necesario convertir el "Null value" del panel (debajo de la sección "Stacking and null value" en la pestaña "Panel") a "connected".

Para el caso del billing, este se resetea el primer día de cada mes.

En la variable "Namespace" hay toneladas de métricas para graficar. Básicamente absolutamente todas las métricas que recolecta CloudWatch están disponibles para graficar en Grafana.

Referencias