Como configurar el agente de CloudWatch con Systems Manager para monitorear la memoria de una instancia EC2
Tags: aws
Published: 2022-03-31 16:56:17

CloudWatch nos permite monitorear diferentes tipos de métricas de los servicios de _AWS_, sin embargo si queremos monitorear la memoria de nuestras maquinas _EC2_, es necesario realizar la instalación del agente de CloudWatch para este fin.

En este ejemplo vamos a utilizar el servicio de _Systems Manager _para realizar la instalación del agente en una instancia _EC2_.

Los pasos a realizar son los siguientes.

1.Tener una(s) instancia(s) en _EC2_ ejecutándose con un ROL que tenga los siguientes permisos: _CloudWatchAgentServerPolicy_, _AmazonSSMManagedInstanceCore_.

2.Instalar el agente en nuestra(s) maquina _EC2_.

3.Configurar un Parametro en Parameter Store para almacenar la configuración del agente de _CloudWatch_.

4.Configurar el agente de _CloudWatch_.

5.Crear dashboard en _CloudWatch_.


Vamos a partir que tenemos una instancia EC2 en ejecución con un ROL que cuente con los permisos mencionados en el punto 1.

Para la instalación del agente vamos a utilizar el servicio _Systems Manager_ que dentro de sus funciones esta controlar la infraestructura que tenemos desplegada.

Empecemos: 

Vamos al servicio system manager y seleccionamos Run Command.

![Init Systems Manager]
(https://raw.githubusercontent.com/cecamilo00/posts/circleci-project-setup/Como%20configurar%20el%20agente%20de%20CloudWatch%20con%20Systems%20Manager%20para%20monitorear%20la%20memoria%20de%20una%20instancia%20EC2/Principal%20Systems%20Manager.png)

En la barra de búsqueda de la sección Command document vamos a buscar el comando: _AWS-ConfigureAWSPackage_ y lo seleccionamos.

![Set Command]
(https://raw.githubusercontent.com/cecamilo00/posts/circleci-project-setup/Como%20configurar%20el%20agente%20de%20CloudWatch%20con%20Systems%20Manager%20para%20monitorear%20la%20memoria%20de%20una%20instancia%20EC2/Comando%20de%20instalación.png)

Nos dirigimos a la sección Command parameters en donde vamos a definir el paquete que queremos instalar y en el campo name colocamos: _AmazonCloudWatchAgent_

![Set Package]
(https://raw.githubusercontent.com/cecamilo00/posts/circleci-project-setup/Como%20configurar%20el%20agente%20de%20CloudWatch%20con%20Systems%20Manager%20para%20monitorear%20la%20memoria%20de%20una%20instancia%20EC2/set package.png)

Después de haber definido el comando y el paquete que queremos ejecutar, debemos seleccionar la(s) instancia(s) en la(s) cual(es) queremos que se realice la ejecución del comando.Para esto nos dirigimos a la sección targets y seleccionamos la opción **Choose instances manually** y en el resultado de búsqueda realizamos la selección deseada, que para este caso es una única instancia.

![Set Package]
(https://raw.githubusercontent.com/cecamilo00/posts/circleci-project-setup/Como%20configurar%20el%20agente%20de%20CloudWatch%20con%20Systems%20Manager%20para%20monitorear%20la%20memoria%20de%20una%20instancia%20EC2/choose target.png)

Para ver los resultados de ejecución del comando podemos seleccionar un bucket en el cual se deben almacenar los resultados de la ejecución, pero para este ejercicio no vamos a activar que los resultados se guarden en un bucket de S3, por lo tanto debemos desactivar la opción en la sección Output options y damos click en el botón Run.

![Output options]
(https://raw.githubusercontent.com/cecamilo00/posts/circleci-project-setup/Como%20configurar%20el%20agente%20de%20CloudWatch%20con%20Systems%20Manager%20para%20monitorear%20la%20memoria%20de%20una%20instancia%20EC2/output options.png)

Al ejecutar el comando vamos a ver una pantalla como la siguiente, donde vamos a poder ver el estado de la ejecución del comando.

![Output options]
(https://raw.githubusercontent.com/cecamilo00/posts/circleci-project-setup/Como%20configurar%20el%20agente%20de%20CloudWatch%20con%20Systems%20Manager%20para%20monitorear%20la%20memoria%20de%20una%20instancia%20EC2/result install agent.png)

El siguiente paso que debemos hacer es configurar las métricas que el agente va a monitorear (memoria en uso, memoria disponible y memoria total). Vamos a crear un parámetro en Parameter Store con la siguiente configuración:

```
{
  "agent": {
    "metrics_collection_interval": 60,
    "logfile": "/opt/aws/amazon-cloudwatch-agent/logs/amazon-cloudwatch-agent.log"
  },
  "metrics": {
    "metrics_collected": {
      "mem": {
        "measurement": [
          { "name": "mem_used", "rename": "MemoryUsed" },
          { "name": "mem_available", "rename": "MemoryAvailable" },
          { "name": "mem_total", "rename": "TotalMemory" }
        ]
      }
    },
    "append_dimensions": {
      "InstanceId": "${aws:InstanceId}"
    }
  }
}
```
Para configurar el parámetro vamos a _Parameter Store_ que se encuentra dentro de _System Mananager_ y damos click en Create Parameter.

![Principal Parameter Store]
(https://raw.githubusercontent.com/cecamilo00/posts/circleci-project-setup/Como%20configurar%20el%20agente%20de%20CloudWatch%20con%20Systems%20Manager%20para%20monitorear%20la%20memoria%20de%20una%20instancia%20EC2/principal page parameter store.png)

Diligenciamos las campos requeridos del parámetro y damos click en **Create parameter**. En el campo value se agrega el json definido arriba.

![Principal Parameter Store]
(https://raw.githubusercontent.com/cecamilo00/posts/circleci-project-setup/Como%20configurar%20el%20agente%20de%20CloudWatch%20con%20Systems%20Manager%20para%20monitorear%20la%20memoria%20de%20una%20instancia%20EC2/create parameter.png)

Para terminar la configuración de nuestro agente debemos ejecutar nuevamente otro comando con la siguiente configuración:

Buscamos y seleccionamos el comando: _AmazonCloudWatch-ManageAgent_

![Principal Parameter Store]
(https://raw.githubusercontent.com/cecamilo00/posts/circleci-project-setup/Como%20configurar%20el%20agente%20de%20CloudWatch%20con%20Systems%20Manager%20para%20monitorear%20la%20memoria%20de%20una%20instancia%20EC2/configure%20%20agent%20command.png)

Definimos la configuración que va tener el comando y pasamos el nombre del parámetro que creamos en _Parameter Store_ que para este caso su nombre es: EC2AgentMemory 

![Config parameter agent]
(https://raw.githubusercontent.com/cecamilo00/posts/circleci-project-setup/Como%20configurar%20el%20agente%20de%20CloudWatch%20con%20Systems%20Manager%20para%20monitorear%20la%20memoria%20de%20una%20instancia%20EC2/config%20parameter%20agent.png)

Ahora debe seleccionamos la(s) instancia(s) en la(s) cuales queremos ejecutar el comando, podemos quitar la selección para que nuestros resultados de ejecución se guarden en S3 cómo lo hicimos anteriormente, damos click en Run y vemos que nuestro comando se ejecute correctamente.

![Config parameter agent]
(https://raw.githubusercontent.com/cecamilo00/posts/circleci-project-setup/Como%20configurar%20el%20agente%20de%20CloudWatch%20con%20Systems%20Manager%20para%20monitorear%20la%20memoria%20de%20una%20instancia%20EC2/command execution.png)

Ya que hemos instalado y configurado el agente de _CloudWatch_ en nuestra instancia podemos ir a _CloudWatch_ a Crear nuestro Dashboard.

Buscamos en la barra de búsquedas el servicio de _CloudWatch_ y lo seleccionamos. Ya en la pagina principal de _CloudWatch_ damos click en **Dashboards** y damos click en **Create dashboard**. 

![Create dashboard]
(https://raw.githubusercontent.com/cecamilo00/posts/circleci-project-setup/Como%20configurar%20el%20agente%20de%20CloudWatch%20con%20Systems%20Manager%20para%20monitorear%20la%20memoria%20de%20una%20instancia%20EC2/create dashboard.png)

Le damos el nombre a nuestro Dashboard

![Create dashboard]
(https://raw.githubusercontent.com/cecamilo00/posts/circleci-project-setup/Como%20configurar%20el%20agente%20de%20CloudWatch%20con%20Systems%20Manager%20para%20monitorear%20la%20memoria%20de%20una%20instancia%20EC2/name dashboard.png)

En la siguiente pantalla seleccionamos el tipo de widget que queremos utilizar para la métrica que vamos a seleccionar.

![Type widget]
(https://raw.githubusercontent.com/cecamilo00/posts/circleci-project-setup/Como%20configurar%20el%20agente%20de%20CloudWatch%20con%20Systems%20Manager%20para%20monitorear%20la%20memoria%20de%20una%20instancia%20EC2/select widget.png)

Ahora debemos seleccionar si queremos como fuente de datos de nuestro widget una métrica o un log. Para nuestro caso seleccionamos Metrics.

![Metric]
(https://raw.githubusercontent.com/cecamilo00/posts/circleci-project-setup/Como%20configurar%20el%20agente%20de%20CloudWatch%20con%20Systems%20Manager%20para%20monitorear%20la%20memoria%20de%20una%20instancia%20EC2/metric.png)

En la siguiente pantalla vemos una sección llamada Custom namespaces. Esta sección se creo cuando ejecutamos los comandos desde parameter store.Damos click en CWAgent.

![Custom namespaces]
(https://raw.githubusercontent.com/cecamilo00/posts/circleci-project-setup/Como%20configurar%20el%20agente%20de%20CloudWatch%20con%20Systems%20Manager%20para%20monitorear%20la%20memoria%20de%20una%20instancia%20EC2/custom namespaces.png)

Damos click en InstanceId.

![Custom namespaces]
(https://raw.githubusercontent.com/cecamilo00/posts/circleci-project-setup/Como%20configurar%20el%20agente%20de%20CloudWatch%20con%20Systems%20Manager%20para%20monitorear%20la%20memoria%20de%20una%20instancia%20EC2/instanceid.png)

Ahora vamos a seleccionar las métricas: **MemoryAvailable** y **MemoryUsed** y damos click en **Create widget **.

![select metrics]
(https://raw.githubusercontent.com/cecamilo00/posts/circleci-project-setup/Como%20configurar%20el%20agente%20de%20CloudWatch%20con%20Systems%20Manager%20para%20monitorear%20la%20memoria%20de%20una%20instancia%20EC2/select metrics.png)

Vemos que nuestro widget fue agregado a nuestro Dashboard. Damos click en **Save dashboard** para almacenar los cambios.

![Save dashboard]
(https://raw.githubusercontent.com/cecamilo00/posts/circleci-project-setup/Como%20configurar%20el%20agente%20de%20CloudWatch%20con%20Systems%20Manager%20para%20monitorear%20la%20memoria%20de%20una%20instancia%20EC2/save dashboard.png)


Hemos visto cómo configurar el agente de cloud watch para monitorear el uso de memoria en una o varias instancias EC2.Hay formas de hacer este procedimiento desde la terminal, sin embargo lo debemos hacer en cada instancia por separado. Lo que nos ofrece _Systems Manager_ es poder realizar este tipo de configuraciones en varias instancias con un único procedimiento.

Como vimos en el ejemplo solo agregamos un widget a nuestro Dashboard con dos métricas, ahora pueden agregar un nuevo widget al dashboard de tipo numero para ver el total de memoria de la instancia EC2.

Me pueden encontrar en

[Camilo Cabrales](https://www.linkedin.com/in/camilo-cabrales-31a0bb53/)

# Referencias
[Systems Manager](https://docs.aws.amazon.com/es_es/systems-manager/latest/userguide/what-is-systems-manager.html)

[Metricas CloudWatch Agent](https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/metrics-collected-by-CloudWatch-agent.html)

[Instalar CloudWatch Agent Terminal ](https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/installing-cloudwatch-agent-commandline.html)