Le Blog Amazon Web Services

Gérez la façon dont vos clients interagissent avec Apache Kafka à l’aide de Amazon API Gateway

À un moment donné, vous pouvez vous demander :

  • Comment puis-je implémenter l’authentification AWS Identity and Access Management (IAM) ou l’autorisation pour Amazon Managed Streaming for Apache Kafka (MSK) ?
  • Comment puis-je protéger mon cluster Apache Kafka contre les pics de trafic basés sur des scénarios spécifiques sans définir de quotas sur le cluster ?
  • Comment puis-je valider que les requêtes correspondent à un schéma JSON ?
  • Comment puis-je m’assurer que les paramètres sont inclus dans l’URI, la query string et les entêtes ?
  • Comment Amazon MSK peut-il ingérer des messages depuis des clients légers sans utiliser d’agent ou le protocole Apache Kafka natif ?

Ces tâches sont toutes possibles au travers de serveurs proxy ou de passerelles personnalisées, mais ces options peuvent être difficiles à mettre en œuvre et à gérer. D’un autre côté, API Gateway possède ces fonctionnalités et est un service entièrement opéré par AWS.

Dans cet article, nous vous montrerons comment Amazon API Gateway peut répondre à ces besoins en tant que composant entre votre cluster Amazon MSK et vos clients.

Amazon MSK est un service entièrement opéré par AWS pour Apache Kafka qui facilite la mise en service des clusters Kafka en quelques clics, sans avoir besoin de provisionner des serveurs, de gérer le stockage ou de configurer Apache Zookeeper manuellement. Apache Kafka est une plate-forme open-source pour la création de pipelines et d’applications de streaming en temps réel.

Certains cas d’utilisation incluent l’ingestion de messages provenant d’objets IoT légers qui ne prennent pas en charge le protocole Kafka natif ou l’orchestration de vos services de streaming avec d’autres services back-end, y compris des API tierces.

Ce pattern inclus les compromis suivants :

  • Coût et complexité dû à un autre service à exécuter et à maintenir,
  • En termes de performance car il ajoute un traitement supplémentaire pour construire et faire des requêtes HTTP. En outre, un proxy REST doit analyser les demandes, transformer les données entre les différents formats, et ce pour produire et consommer les requêtes.

Lorsque vous implémentez cette architecture dans un environnement de production, vous devez tenir compte de ces points en fonction de votre cas d’utilisation métier et de vos SLA.

Aperçu de la solution

Pour implémenter la solution, procédez comme suit :

  1. Créez un cluster MSK, un client Kafka et un proxy REST Kafka
  2. Créez un topic Kafka et configurez le proxy REST sur un client Kafka
  3. Créez une API avec l’intégration du proxy REST via API Gateway
  4. Testez les processus de bout en bout en produisant et en consommant des messages vers Amazon MSK

Le diagramme suivant illustre l’architecture de la solution :

Dans cette architecture, vous créez un cluster MSK et configurez une instance Amazon EC2 avec le proxy REST et le client Kafka. Vous exposez ensuite le proxy REST via Amazon API Gateway et testez également la solution en produisant des messages vers Amazon MSK à l’aide de Postman.

Pour l’implémentation en production, assurez-vous de configurer le proxy REST derrière un ELB avec un groupe Auto Scaling.

Prérequis

Avant de commencer, vous devez disposer des prérequis suivants :

  • Un compte AWS qui donne accès aux services AWS,
  • Un utilisateur IAM avec une clé d’accès et une clé d’accès secrète pour configurer l’AWS CLI,
  • Une paire de clés Amazon EC2.

Création d’un cluster MSK, d’un client Kafka et d’un proxy REST

AWS CloudFormation provisionnera toutes les ressources requises, y compris le VPC, les sous-réseaux, les groupes de sécurité, le cluster Amazon MSK, le client Kafka et le proxy REST. Pour créer ces ressources, procédez comme suit :

  • Lancement dans les régions eu-west-3 (Paris) ou us-east-1 ou us-west-2 . Il faut environ 15 à 20 minutes à CloudFormation pour créer toutes les ressources.
  • Dans la console AWS CloudFormation, choisissez AmazonMskApiBlog.
  • Sous Outputs, obtenez les détails MskClusterArn, KafkaClientec2InstancePublicDNS et MskSecurityGroupID.

  • Récupérez le ZooKeeperConnectionString et d’autres informations sur votre cluster avec la commande suivante (indiquez votre région, l’ARN du cluster et le nom de votre profil AWS) :
$ aws kafka describe-cluster --region <Remplacer_par_us-east-1_or_us-west-2_or_eu-west-3> --cluster-arn <Remplacer_par_votre_cluster-arn> --profile <Remplacer_par_votre_profile>

L’exemple de code suivant montre l’une des lignes de l’output de cette commande :

{
…
…
"ZookeeperConnectString": "z-2.mskcluster.XXXXXX.c4.kafka.eu-west-3.amazonaws.com:2181,z-3.mskcluster.XXXXXX.c4.kafka.eu-west-3.amazonaws.com:2181,z-1.mskcluster.XXXXXX.c4.kafka.eu-west-3.amazonaws.com:2181"
}
  • Obtenez le BootStrapBrokerString avec la commande suivante (indiquez votre région, l’ARN du cluster et le nom de votre profil AWS) :
$ aws kafka get-bootstrap-brokers --region <Remplacer_par_us-east-1_or_us-west-2_or_eu-west-3> --cluster-arn <Remplacer_par_votre_cluster-arn> --profile <Remplacer_par_votre_profile>

La commande suivante montre le résultat de cette commande :

{
"BootstrapBrokerString": "b-2.mskcluster.XXXXXX.c4.kafka.eu-west-3.amazonaws.com:9092,b-3.mskcluster.XXXXXX.c4.kafka.eu-west-3.amazonaws.com:9092,b-1.mskcluster.XXXXXX.c4.kafka.eu-west-3.amazonaws.com:9092"
}

Création d’un topic Kafka et configuration d’un proxy REST Kafka.

Pour créer un topic Kafka et configurer un proxy REST Kafka sur un client Kafka, procédez comme suit :

  • Connectez-vous en SSH à votre instance Amazon EC2. Nous vous recommandons d’utiliser AWS Systems Manager pour des environnements de production afin d’augmenter le niveau de sécurité. Avec la commande suivante :
    ssh -i <Remplacer_par_votre_fichier_pem> ec2-user@<Remplacer_avec_le_dns_du_client_kafka>
  • Allez dans le dossier bin (kafka/kafka_2.12-2.2.1/bin/) de l’installation Kafka sur l’instance EC2.
  • Créez un topic avec la commande suivante (indiquez la valeur que vous avez obtenue pour ZookeeperConnectString à l’étape précédente) :
    /kafka-topics.sh --create --zookeeper <Remplacer_par_la_valeur_ZookeeperConnectString> --replication-factor 3 --partitions 1 --topic amazonmskapigwblog
    Si la commande réussit, le message suivant s’affiche: Created topic amazonmskapigwblog
  • Pour connecter le server REST au cluster Amazon MSK, modifiez le fichier kafka-rest.properties dans le répertoire (/home/ec2-user/confluent-5.3.1/etc/kafka-rest/) pour le pointer vers les URLs de connection ZookeeperConnectString et BootstrapserversConnectString de votre cluster AmazonMSK.
    sudo vi /home/ec2-user/confluent-5.3.1/etc/kafka-rest/kafka-rest.properties
    zookeeper.connect=<Remplacer_par_la_valeur_ZookeeperConnectString>
    bootstrap.servers=< Remplacer_par_la_valeur_BootstrapConnectString >

    Comme étape supplémentaire et facultative, vous pouvez mettre en place une connection SSL pour sécuriser la communication entre les clients REST et le proxy REST (HTTPS). Si SSL n’est pas requis, vous pouvez ignorer les étapes suivantes.

  • Générez les certificats serveur et client. Plus d’informations sur le site de Confluent
  • Ajoutez les configurations de propriétés nécessaires au fichier de configuration kafka-rest.properties. Voir l’exemple de code suivant :
    listeners=http://0.0.0.0:8082,https://0.0.0.0:8085
    ssl.truststore.location=<Replace_With_Your_tuststore.jks>
    ssl.truststore.password=<Replace_With_Your_tuststorepassword>
    ssl.keystore.location=<Replace_With_Your_keystore.jks>
    ssl.keystore.password=<Replace_With_Your_keystorepassword>
    ssl.key.password=<Replace_With_Your_sslkeypassword>

    Pour obtenir des instructions plus détaillées, consultez la section Encryption et Authentification avec SSL sur le site web de Confluent.

Vous avez maintenant créé un topic Kafka et configuré le proxy REST Kafka pour vous connecter à votre cluster Amazon MSK.

Création d’une API avec l’intégration du proxy

Pour créer une API avec l’intégration de Proxy REST Kafka via API Gateway, procédez comme suit :

  1. Dans la console API Gateway, choisissez Créer une API.
  2. Pour le type d’API, choisissez API REST
  3. Choisissez Build
  4. Choisissez Nouvelle API
  5. Pour Nom d’API, entrez un nom (par exemple, amazonmsk-restapi)
  6. Comme étape facultative, pour Description, entrez une brève description
  7. Choisissez Créer une API. L’étape suivante consiste à créer une ressource enfant
  8. Sous Ressources, sélectionnez un élément de ressource parent
  9. Sous Actions, choisissez Créer une ressource. Le volet Nouvelle ressource enfant s’ouvre.
  10. Sélectionnez Configurer en tant que ressource proxy.
  11. Pour Nom de la ressource, entrez proxy.
  12. Pour Chemin de ressource, saisissez /{proxy+}.
  13. Sélectionnez Activer le CORS d’API Gateway.
  14. Choisissez Créer une ressource.

    Après avoir créé la ressource, la fenêtre Créer une méthode s’ouvre.
  15. Pour Type d’intégration, sélectionnez Proxy HTTP
  16. Pour URL de point de terminaison, entrez une URL de ressource de backend HTTP (le DNS Public de votre instance Amazon EC2 Kafka Client; par exemple, http://KafkaClientEC2InstancePublicDNS:8082/{proxy} ou https://KafkaClientEC2InstancePublicDNS:8085/{proxy}).
  17. Utilisez les paramètres par défaut pour les champs restants
  18. Choisissez Enregistrer
  19. Si vous utilisez SSL, pour URL de point de terminaison, utilisez le point de terminaison HTTPS

    Dans l’API que vous venez de créer, le chemin de ressource de {proxy+} devient l’espace réservé de l’un des points de terminaisons backend http://KafkaClientEC2InstancePublicDNS:8082/
  20. Choisissez l’API que vous venez de créer
  21. Sous Actions, choisissez Déployer l’API
  22. Pour Etape de déploiement, choisissez Nouvelle étape
  23. Pour Nom de l’environnement, entrez le nom de l’environnement (par exemple, dev, test ou prod)
  24. Cliquez sur Déployer
  25. Enregistrez l’URL après avoir déployé l’API
  26. Votre proxy REST Kafka, qui a été exposé via API Gateway, ressemble maintenant à https://VotreURLApiGateway/dev/topics/amazonmskapigwblog. Vous utilisez cette URL à l’étape suivante.

Test des processus de bout en bout

Pour tester les processus de bout en bout en produisant et en consommant des messages à Amazon MSK. Procédez comme suit :

  1. Connectez-vous en SSH à l’instance Amazon EC2 du client Kafka avec la ligne de commande suivante : ssh -i "xxxxx.pem" ec2-user@KafkaClientEC2InstancePublicDNS
  2. Allez dans le répertoire confluent-5.3.1/bin et démarrez le service kafka-rest avec la  commande suivante : ./kafka-rest-start /home/ec2-user/confluent-5.3.1/etc/kafka-rest/kafka-rest.properties. Si le service a déjà démarré, vous pouvez l’arrêter avec la ligne de commande suivante : ./kafka-rest-stop /home/ec2-user/confluent-5.3.1/etc/kafka-rest/kafka-rest.properties
  3. Ouvrez une autre fenêtre de terminal
  4. Dans le répertoire kafka/kafka_2.12-2.2.1/bin, démarrez le Kafka console consumer avec la ligne de commande suivante : ./kafka-console-consumer.sh --bootstrap-server "BootstrapserversConnectString" --topic amazonmskapigwblog --from-beginning. Vous pouvez désormais produire des messages à l’aide de Postman. Postman est un client HTTP pour tester les services Web. Assurez-vous d’ouvrir les ports TCP sur le groupe de sécurité du client Kafka pour votre IP
  5. Dans Headers, sélectionnez la clé Content-Type et la valeur application/vnd.kafka.json.v2+json
  6. Dans Body, sélectionnez raw
  7. Choisissez JSON. Cela génère le code suivant :
    {"records":[{"value":{"deviceid": "AppleWatch4","heartrate": "72","timestamp":"2019-10-07 12:46:13"}}]}


    La capture d’écran suivante montre les messages envoyés au consommateur Kafka à partir du point de terminaison REST API Gateway.

Conclusion

Cet article a illustré comment configurer des points de terminaison REST pour Amazon MSK avec API Gateway. Cette solution peut vous aider à produire et à consommer des messages vers Amazon MSK à partir de n’importe quel appareil IoT ou langage de programmation sans dépendre du protocole ou des clients Kafka natifs.

Article original par Prasad Alle, Senior Big Data Consultant, et Francisco Oliveira, Senior Solutions Architect Data Lakes & Analytics. Traduit de l’anglais par Jean-Robin Foehn, Solutions Architect accompagnant les clients français dans leur transformation digitale et leur adoption du cloud.