Kafka Totalmente Administrado en AWS - Guía Express

portada

Intro

En pocas palabras…Apache Kafka es una poderosa herramienta open source que puede ser utilizada como broker de mensajes en un esquema pub/sub, lo cual resulta muy útil para la gestión de eventos/mensajes entre microservicios, pero también es muy usado en arquitecturas que requieren procesamiento en tiempo real por ejemplo transformando o realizando operaciones reactivas a streaming masivo de datos. Van a leer en cualquier articulo relacionado a Apache Kafka que se habla de high performance esto es porque la herramienta está diseñada y construida para manejar enormes cantidades de datos y escalar fácilmente en un esquema de clustering, lo cual hace a Apache Kafka una clara elección para muchas empresas

AWS MSK:

Entonces, por qué no levantamos una EC2 e instalamos Kafka en ella? o porque no lo instalamos en los fierros del datacenter? podríamos hacerlo pero como en todas las soluciones fully managed de AWS, con MSK (Managed Streaming for Apache Kafka) nos ahorramos una cantidad significativa de horas operativas, horas de hacer que cosas? por ej aprovisionar los clusters, configurar los kafka servers, configurar los zookeepers, verificar la comunicación en todo el esquema, hacer pruebas de escalado etc. en este post pueden ver un poco de la configuracion de kafka en un ambiente de pruebas (en ambientes productivos hay sufrimiento adicional xD), entonces con AWS MSK podemos tener todas las bondades de un Kafka Cluster bien configurado en cloud !!

wcloud

En AWS claro xD… que levanta el siguiente esquema:

arq

Y si parte del requerimiento es levantar la herramienta para “ayer” podemos levantar nuestro Kafka con un par de clics desde la consola de AWS o con IaC usando CloudFormation, Pulumi o Terraform por ejemplo. Les dejo algo de codigo para levantarlo con IaC y algunos comandos básicos de Kafka Client.

Cloud Formation Way

Les dejo el enlace al final del post, pero básicamente el core de su template de cloud formation debería tener esta facha:

"MSKCluster": {
            "Type": "AWS::MSK::Cluster",
            "Properties": {
                "BrokerNodeGroupInfo": {
                    "ClientSubnets": ["subnet-lalala","subnet-lelele","subnet-lilili"],
                    "InstanceType": "kafka.m5.large",
                    "SecurityGroups": ["sg-lalala"],
                    "StorageInfo": {
                        "EBSStorageInfo": {
                            "VolumeSize": 100
                        }
                    }
                },
                "ClusterName": "MymwareAcademy-Kafka",
                "EncryptionInfo": {
                    "EncryptionInTransit": {
                        "ClientBroker": "TLS",
                        "InCluster": false
                    }
                },
                "EnhancedMonitoring": "PER_TOPIC_PER_BROKER",
                "KafkaVersion": "2.2.1",
                "NumberOfBrokerNodes": 3,
                "Tags": {
                    "Environment": "k3s-pi",
                    "Owner" : "Manu"
                }
            }
        }

Algunas consideraciones, los bootstrap servers trabajan en el puerto 9092 y los zookeepers en el 2181 (para que lo tengan en cuenta en los sg), después no hay mucho mas secreto, pasamos la versión de Kafka y la cantidad de workers en el cluster, opcionalmente añadimos parámetros y outputs a nuestro template o incluso podemos crear los sg (con los ingress en 2181 y 9092) y subnets en el mismo template para luego consumirlos con un Ref o escribir un nested stack etc.

Terraform Way (the best way)

El caso análogo de lo que vimos anteriormente pero escrito en Terraform deberia verse así:

resource "aws_msk_cluster" "MymwareAcademy-Kafka" {
  cluster_name           = "MymwareAcademy-Kafka"
  kafka_version          = "2.2.1"
  number_of_broker_nodes = 3

  broker_node_group_info {
    instance_type   = "kafka.m5.large"
    ebs_volume_size = 100
    client_subnets = [
      "subnet-lalala",
      "subnet-lelele",
      "subnet-lilili",
    ]
    security_groups = ["sg-lalala"]
  }

Obviamente utilizando el provider de aws y pasando nuestro set de keys que debe tener permisos en el servicio MSK pero como ven la parte de MSK son solo un par de lineas.

AWS MSK CLI

AWS CLI tiene su propio subcomando dedicado a la gestión de este servicio, según mi punto de vista con opciones bastante limitadas en donde más allá de listar los cluster y tirar un típico describe, no sirve para mucho mas, quizas el uso de la cli msk puede aplicar para una vista general, o para obtener información útil como el ARN de un cluster en particular etc. les dejo un par de comandos:

  • lista los clusters MSK

      $ aws kafka list-clusters | more
    
  • ver detalles de un cluster en particular (reemplazar por arn valido)

      $ aws kafka describe-clusters --cluster-arn arn:aws:kafka:us-east-1:METAMORFOSIS:cluster/franz/kafka
    

Kafka Client

Listo, ya tenemos nuestro cluster de Kafka, ahora que? para probar el cluster podemos descargarnos los scripts de kafka de su pagina oficial con:

wget https://archive.apache.org/dist/kafka/2.0.0/kafka_2.11-2.0.0.tgz

tar -xvzf kafka_2.13-2.7.0.tgz

Ya con esos scripts en nuestra laptop, o en el contenedor consumer por ejemplo podemos crear un topico y comenzar a escribir en ese topico, que es el primer caso de uso que mencionaba al principio del post en donde utilizamos la herramienta para intercambio de mensajes entre aplicaciones:

kafka-topics.sh --create --topic mi-bonito-topico --bootstrap-server $REEMPLAZAR --replication-factor 2 --partitions 3

(el zookeeper y bootstrap server endpoint te lo da AWS una vez creado el cluster MSK)

Listamos los topicos para verificar que se creó correctamente:

kafka-topics.sh --zookeeper $REEMPLAZAR --list

Escribimos mensajes en el tópico con:

kafka-console-producer.sh --topic mi-bonito-topico --bootstrap-server $REEMPLAZAR

Una vez que le demos ENTER a ese comando, nuestra terminal va a quedar escuchando mensajes, así que escriban lo que se les ocurra que Don Kafka está escuchando…

En otra terminal vamos a levantar un consumer de ese tópico con:

kafka-console-consumer.sh --bootstrap-server $REEMPLAZAR --from-beginning --topic mi-bonito-topico

Vamos a comenzar a ver todos los mensajes que escribimos en el tópico anteriormente con el script de producer

magia

FUENTE

PD: Si no leíste la metamorfosis de Franz, anda corriendo a leerla, no te va a enseñar a usar MSK pero es una linda lectura xD !!

Invitame un CaféInvitame un Café