Soporte de Autoscaling

¿Cómo funciona el autoscaling de AWS con Zabbix?

Para manejar el autoscaling desde Zabbix debemos tener en cuenta dos puntos distintos.

1. Añadir una nueva instancia en Zabbix cuando aparece

Esto puede hacerse usando Autoregistro de agentes Zabbix activos versión 5.4, versión 6.0. De esta forma, cuando una nueva instancia aparece, Zabbix la añade de forma automática como un nuevo equipo.

2. Guardar el id de la instancia en el inventorio de Zabbix

Cuando la instancia desaparece (scale in), vamos a recibir un mensaje con el ID de esa instancia, así que tenemos que tener asociado este id en el inventorio del host en Zabbix para poder buscarlo y borrarlo cuando desaparezca.

3. Recivir los mensajes de escalado de AWS

Cuando AWS produce un evento de escalado envía un mensaje SNS a un tema SNS que nosotros hayamos definido. Conectando ese SNS a una cola SQS podemos leer los mensajes desde Zabbix y eliminar las instancias que sean removidas de los grupos de escalado.

Vea este sencillo diagrama de cómo funciona:

Zabbix with autoscaling diagram

Configurar el cliente

Dos pasos son necesario para configurar tus clientes para manejar autoescalados en Zabbix:

  • Configurar el agente de Zabbix
  • Añadir un archivo con un parámetro de usuario para el elemento instance_id

Configuración del agente Zabbix

Debemos cambiar (además de cualquier otro cambio que puedas necesitar) seis puntos en el archivo de configuracion local de nuestro agente Zabbix (normalmente situado en /etc/zabbix/zabbix_agentd.conf):

  1. Comentar la opción Server
  2. Añadir ServerActive=YOUR__ZABBIX__IP__ADDRESS para configurar el servidor activo
  3. Comentar la opción Hostname
  4. Poner la opción StartAgents a 0
  5. Poner la opción HostnameItem a system.hostname
  6. Poner la opción HostMetadataItem a system.uname

Con esta configuración, lo que hacemos es configurar nuestro cliente zabbix como activo (el cliente manda información al servidor, y no recibe chequeos de el). Además, definimos que Zabbix use el nombre de la máquina como nombre de equipo, así evitamos tener que cambiarlo cada vez que un nuevo servidor arranca, y simplificamos la configuración de escalados. Por último, definimos que Zabbix envíe el valor del comando “uname” para definir la información de este equipo que enviamos al servidor Zabbix. Como las instancias en AWS usan un kernel especial, el valor “aws” aparece en el y podemos usarlo para registrar el servidor.

Parámetro instance_id

Por defecto, cuando un nuevo servidor desde un autoescalado aparece en Zabbix, este se enlace con un template especial llamado AWS EC2 Template, que contiene un elemento llamada instance_id asociado con el elemento “alias” del inventario. Para esto necesitamos añadir en nuestro cliente Zabbix un parámetro de usuario que envíe el valor de este elemento.

Esto podemos hacerlo creando un archivo en /etc/zabbix/zabbix_agentd.d/template_aws_ec2.conf que contenga:

UserParameter=aws.ec2.instance_id,curl -s http://169.254.169.254/latest/meta-data/instance-id

Configurar el servidor

Una vez que ya hemos configurado nuestros clientes, el siguiente paso es configurar el servidor para borrar las instancias eliminadas. Para ello, la forma más rápida y simple consiste de dos pasos:

  • Enviar los mensajes de escalado a una cola SQS
  • Configurar el servidor para leer la cola SQS

Enviar los mensajes de escalado a una cola SQS

Necesitamos que las notificaciones enviadas por el servicio de autoescalado se guarden en una cola SQS para garantizar la durabilidad y la escala. Como el autoscaling de AWS envía las notificaciones a un tema SNS, necesitamos:

  • crear un tema SNS
  • crear una cola SQS
  • configurar SNS para enviar los mensajes a SQS
  • crear un usuario de IAM que pueda leer los mensajes.

Como este tipo de configuración es complicada, puedes usar nuestro Stack de CloudFormation para crear todos los elementos en la región que desees. Después de desplegar el stack, en la pestaña Outputs encontrarás cuatro valores que debes anotar:

  • SNSTopicARN: El ARN del asunto SNS creado
  • SQSQueueURL: La URL de la cola SQS queue
  • SQSReadIAMUserAccessKey and SQSReadIAMUserSecretKey: El usuario y clave del usuario IAM

necesitas esos datos para la configuración. Para ello, edita el archivo /etc/zabbix/zabbix_ami.yml, en el código similar a:

sqs:
  delay_seconds: 60
  default_region: us-east-1
  queues:
  - url:
    access_key_id:
    secret_access_key:
    region:

Para cada SQS con notificaciones de escalado, necesitaremos añadir un array de elementos similar al que existe, con los datos indicados por Cloudformation.

Tienes mas información sobre este archivo de configuración en la sección Archivo de configuración de AMI