Cómo desplegar InfluxDB Enterprise en AWS con Terraform
Hace unos días nos encontramos con un cliente que quería desplegar su nuevo cluster de InfluxDB Enterprise con Terraform, esto es así porque toda su infra estaba definida en código y no quería que este deployment fuera la excepción. Totalmente entendible, ese sería mi approach también.
Dentro del grupo de arquitectos, el que tuvo experiencia con Terraform es quien les escribe, me puse a investigar y rápidamente vi que teníamos en la organización de InfluxData un repo, creado por una persona que no esta más en la empresa, el cual era un módulo de Terraform para desplegar un cluster de InfluxDB Enterprise en AWS. ¿El problema? Que estaba super desactualizado ¿Cuánto? tres años.
Antes de pasarle el módulo al cliente, me puse a actualizarlo para que el mismo sea compatibles con las versiones actuales de Terraform. En cuestión de unas horitas la receta y el módulo estaban listos para usarse. ¿Vemos como funciona?.
¿Qué hace este módulo?
Este módulo es capaz de crear la cantidad de maquinas virtuales que se especifiquen en AWS, junto con volumenes de EBS atachados a esas VMs, también considera la creación de registros en una zona DNS pre creada para apuntar a cada uno de los data y meta nodes. También incluye la creación de un grupo de seguridad con la apertura de puertos para que los nodos puedan "hablarse" y por último un script para actualizar el sistema operativo (Debian), instale Python, descargue los bits para los data y meta nodes en sus respectivos nodos y proceda a la instalación de los mismos.
¿Qué no hace este modulo?
Lo que no hace este módulo es la configuración del cluster ya que hay que especificar configuración que es propia de cada cliente y levantar una configuración especifica serviría para un cliente pero dejaría afuera al resto de clientes que desean configurar el cluster de otra manera. Así que lo que no hace es especificar licencias, autenticación y el creado del cluster desde el meta node 1.
A desplegar
¿Qué necesito?
Lo que se necesita es tener pre creados algunos recursos, como por ejemplo, la zona DNS, así como también haber tenido subida la llave SSH para luego poder acceder a los servidores. También hay que tener a mano la información sobre la imagen AMI que se va a usar, (si no se especifica ninguna se usará Debian 10 por defecto), el ID de la subnet, el ID del VPC, qué tipo de instancia van a requerir para los data-nodes (Si no es especifica, m4.large será el tamaño de la instancia por defecto), así cómo también el nombre de la llave, el ID de la zona DNS y del grupo de seguridad.
Una vez que tenemos todo esto, veamos la receta que debemos desplegar...
La receta y el deploy:
La receta es la siguiente: Acá desplegaré un cluster de 2 data nodes y 3 meta nodes. Adjuntaré a cada VM un volumen EBS de 500GB de 1000 IOPS.
provider "aws" {
region = "us-east-2"
access_key = "your-access-key"
secret_key = "your-secret-key"
module "influxdb" {
source = "influxdata/influxdb/aws"
version = "1.0.6"
data_instances = 2
data_disk_size = 500
data_disk_iops = 1000
meta_instances = 3
ami = "ami-0f42acddbf04bd1b6"
subnet_id = "subnet-8d5c5643"
vpc_id = "vpc-b535e44g"
instance_type = "m4.large"
key_name = "ignacio"
zone_id = "Z044144236NI0U6A5435435"
security_group = ["sg-0c8dc3456"]
}
Una vez que tenemos todos nuestros datos, vamos con el famoso...
$ terraform plan
Veremos un plan de todo lo que va a realizar, si estamos de acuerdo, ejecutamos:
$ terraform apply
Tendremos un resultado similar al del plan (No lo pongo para que el articulo no se haga tan largo). Si estamos seguros de lo que vamos a hacer, tipeamos yes y comenzará toda la magia. Al finalizar, veremos algo así:
module.influxdb.aws_ebs_volume.data[1]: Creating...
module.influxdb.aws_instance.data_node[0]: Creating...
module.influxdb.aws_instance.meta_node[1]: Creating...
module.influxdb.aws_ebs_volume.data[0]: Creating...
module.influxdb.aws_security_group.data_node: Creating...
module.influxdb.aws_security_group.influxdb_cluster: Creating...
module.influxdb.aws_instance.meta_node[0]: Creating...
module.influxdb.aws_instance.data_node[1]: Creating...
module.influxdb.aws_ebs_volume.meta[2]: Creating...
module.influxdb.aws_instance.meta_node[2]: Creating...
module.influxdb.aws_security_group.influxdb_cluster: Creation complete after 5s [id=sg-03eb9646xxxxxxxx]
module.influxdb.aws_ebs_volume.meta[1]: Creating...
module.influxdb.aws_security_group.data_node: Creation complete after 6s [id=sg-0b371afxxxxxxxx]
module.influxdb.aws_ebs_volume.meta[0]: Creating...
module.influxdb.aws_ebs_volume.data[1]: Still creating... [10s elapsed]
module.influxdb.aws_ebs_volume.data[0]: Still creating... [10s elapsed]
module.influxdb.aws_instance.data_node[0]: Still creating... [10s elapsed]
module.influxdb.aws_instance.meta_node[1]: Still creating... [10s elapsed]
module.influxdb.aws_instance.meta_node[0]: Still creating... [10s elapsed]
module.influxdb.aws_ebs_volume.meta[2]: Still creating... [10s elapsed]
module.influxdb.aws_instance.data_node[1]: Still creating... [10s elapsed]
module.influxdb.aws_instance.meta_node[2]: Still creating... [10s elapsed]
module.influxdb.aws_ebs_volume.data[0]: Creation complete after 13s [id=vol-032c67b2xxxxxxxx]
module.influxdb.aws_security_group_rule.outbound: Creating...
module.influxdb.aws_ebs_volume.data[1]: Creation complete after 13s [id=vol-0ea59740xxxxxxxx]
module.influxdb.aws_ebs_volume.meta[2]: Creation complete after 13s [id=vol-0d17ab51xxxxxxxx]
module.influxdb.aws_security_group_rule.outbound: Creation complete after 2s [id=sgrule-33810xxxxxxxx]
module.influxdb.aws_ebs_volume.meta[1]: Still creating... [10s elapsed]
module.influxdb.aws_ebs_volume.meta[0]: Still creating... [10s elapsed]
module.influxdb.aws_ebs_volume.meta[1]: Creation complete after 13s [id=vol-0d909f3f0xxxxxxxx]
module.influxdb.aws_ebs_volume.meta[0]: Creation complete after 12s [id=vol-08af267xxxxxxxx]
module.influxdb.aws_instance.meta_node[1]: Still creating... [20s elapsed]
module.influxdb.aws_instance.data_node[0]: Still creating... [20s elapsed]
module.influxdb.aws_instance.meta_node[0]: Still creating... [20s elapsed]
module.influxdb.aws_instance.data_node[1]: Still creating... [20s elapsed]
module.influxdb.aws_instance.meta_node[2]: Still creating... [20s elapsed]
module.influxdb.aws_instance.data_node[1]: Creation complete after 28s [id=i-0ba1d0xxxxxxxx]
module.influxdb.aws_instance.data_node[0]: Creation complete after 28s [id=i-0baf13axxxxxxxx]
module.influxdb.aws_volume_attachment.data_attachment[0]: Creating...
module.influxdb.aws_volume_attachment.data_attachment[1]: Creating...
module.influxdb.aws_route53_record.data_node[0]: Creating...
module.influxdb.aws_route53_record.data_node[1]: Creating...
module.influxdb.aws_instance.meta_node[0]: Creation complete after 28s [id=i-065f4015xxxxxxxx]
module.influxdb.aws_instance.meta_node[1]: Creation complete after 28s [id=i-0ba5a50xxxxxxxx]
module.influxdb.aws_instance.meta_node[2]: Still creating... [30s elapsed]
module.influxdb.aws_route53_record.data_node[1]: Still creating... [10s elapsed]
module.influxdb.aws_volume_attachment.data_attachment[1]: Still creating... [10s elapsed]
module.influxdb.aws_volume_attachment.data_attachment[0]: Still creating... [10s elapsed]
module.influxdb.aws_route53_record.data_node[0]: Still creating... [10s elapsed]
module.influxdb.aws_instance.meta_node[2]: Creation complete after 39s [id=i-0bd47dxxxxxxxx]
module.influxdb.aws_volume_attachment.meta[1]: Creating...
module.influxdb.aws_volume_attachment.meta[2]: Creating...
module.influxdb.aws_volume_attachment.meta[0]: Creating...
module.influxdb.aws_route53_record.meta_node[2]: Creating...
module.influxdb.aws_route53_record.meta_node[1]: Creating...
module.influxdb.aws_security_group_rule.cluster_comms: Creating...
module.influxdb.aws_security_group_rule.cluster_comms: Creation complete after 2s [id=sgrule-xxxxxxxx]
module.influxdb.aws_route53_record.meta_node[0]: Creating...
module.influxdb.aws_volume_attachment.data_attachment[0]: Still creating... [20s elapsed]
module.influxdb.aws_route53_record.data_node[0]: Still creating... [20s elapsed]
module.influxdb.aws_route53_record.data_node[1]: Still creating... [20s elapsed]
module.influxdb.aws_volume_attachment.data_attachment[1]: Still creating... [20s elapsed]
module.influxdb.aws_route53_record.meta_node[1]: Still creating... [10s elapsed]
module.influxdb.aws_route53_record.meta_node[2]: Still creating... [10s elapsed]
module.influxdb.aws_volume_attachment.meta[0]: Still creating... [10s elapsed]
module.influxdb.aws_volume_attachment.meta[1]: Still creating... [10s elapsed]
module.influxdb.aws_volume_attachment.meta[2]: Still creating... [10s elapsed]
module.influxdb.aws_route53_record.meta_node[0]: Still creating... [10s elapsed]
module.influxdb.aws_volume_attachment.data_attachment[0]: Creation complete after 24s [id=vai-xxxxxxxx]
module.influxdb.aws_volume_attachment.data_attachment[1]: Creation complete after 24s [id=vai-xxxxxxxx]
module.influxdb.aws_route53_record.data_node[1]: Still creating... [30s elapsed]
module.influxdb.aws_route53_record.data_node[0]: Still creating... [30s elapsed]
module.influxdb.aws_volume_attachment.meta[2]: Still creating... [20s elapsed]
module.influxdb.aws_volume_attachment.meta[1]: Still creating... [20s elapsed]
module.influxdb.aws_route53_record.meta_node[2]: Still creating... [20s elapsed]
module.influxdb.aws_volume_attachment.meta[0]: Still creating... [20s elapsed]
module.influxdb.aws_route53_record.meta_node[1]: Still creating... [20s elapsed]
module.influxdb.aws_route53_record.meta_node[0]: Still creating... [20s elapsed]
module.influxdb.aws_route53_record.data_node[0]: Creation complete after 34s [id=Z0441442xxxxxxxx_influxdb-data01_A]
module.influxdb.aws_route53_record.data_node[1]: Creation complete after 34s [id=Z0441442xxxxxxxx_influxdb-data02_A]
module.influxdb.aws_volume_attachment.meta[1]: Creation complete after 24s [id=vai-1374xxxxxxxx]
module.influxdb.aws_volume_attachment.meta[0]: Creation complete after 24s [id=vai-8021xxxxxxxx]
module.influxdb.aws_volume_attachment.meta[2]: Creation complete after 24s [id=vai-1808xxxxxxxx]
module.influxdb.aws_route53_record.meta_node[1]: Still creating... [30s elapsed]
module.influxdb.aws_route53_record.meta_node[2]: Still creating... [30s elapsed]
module.influxdb.aws_route53_record.meta_node[0]: Still creating... [30s elapsed]
module.influxdb.aws_route53_record.meta_node[2]: Creation complete after 34s [id=Z044144xxxxxxxx_influxdb-meta03_A]
module.influxdb.aws_route53_record.meta_node[1]: Creation complete after 34s [id=Z044144236Nxxxxxxxx_influxdb-meta02_A]
module.influxdb.aws_route53_record.meta_node[0]: Creation complete after 35s [id=Z044144236Nxxxxxxxx_influxdb-meta01_A]
Apply complete! Resources: 24 added, 0 changed, 0 destroyed.
Una vez que esto esta listo, podríamos entrar a uno de los servidores por SSH, hacer un tail -f /var/log/syslog y vemos el avance de la configuración, descarga e instalación de los paquetes así como del start de los servicios.
Para ir cerrando
A partir de aquí, lo que resta es especificar la configuración que deseamos en nuestro Cluster y añadir estos 5 servidores al cluster usando influxd-ctl:
Por acá les dejo el código del módulo para que lo revisen y estén seguros de que es lo que se despliega y qué es lo que hace.
El enlace al módulo en la registry de Terraform: https://registry.terraform.io/modules/influxdata/influxdb/aws/latest
Espero que este artículo les haya servido, dejen dudas o consultas en los comentarios aquí abajo.