terraform > nodejs endpoint to docker kafka

İbrahim Yıldız
3 min readOct 30, 2024

Kafka ve Zookeeper için Terraform ile Docker Ortamı Oluşturma

Bu blog yazısında, Terraform kullanarak Docker üzerinde Kafka ve Zookeeper ortamı oluşturmayı öğreneceksiniz. Uygulama Node.js ile yazılmış bir API ile Kafka’ya veri gönderecek ve verileri tüketmek için Kafka’nın komut satırı aracını kullanacağız.

1. Terraform Yapılandırması

Aşağıda, Kafka ve Zookeeper’ı başlatmak için gerekli olan Terraform yapılandırma dosyasını bulabilirsiniz. Bu dosya, özel bir ağ oluşturarak her iki servisi de bu ağa bağlayacaktır.

terraform {
required_providers {
docker = {
source = "kreuzwerker/docker"
version = "~> 2.0"
}
}
}

provider "docker" {}

# Kafka ve Zookeeper için özel bir ağ oluşturma
resource "docker_network" "kafka_net" {
name = "kafka-net"
}

# Zookeeper Docker imajını tanımlama
resource "docker_image" "zookeeper" {
name = "bitnami/zookeeper:latest"
}

# Kafka Docker imajını tanımlama
resource "docker_image" "kafka" {
name = "wurstmeister/kafka"
}

# Zookeeper konteyneri oluşturma
resource "docker_container" "zookeeper" {
name = "zookeeper"
image = docker_image.zookeeper.name
ports {
internal = 2181
external = 2181
}
env = ["ALLOW_ANONYMOUS_LOGIN=yes"]
networks_advanced {
name = docker_network.kafka_net.name
}
}

# Kafka konteyneri oluşturma
resource "docker_container" "kafka" {
name = "kafka"
image = docker_image.kafka.name
ports {
internal = 9092
external = 9092
}
env = [
"KAFKA_ADVERTISED_LISTENERS=INSIDE://kafka:9092,OUTSIDE://localhost:9093",
"KAFKA_LISTENER_SECURITY_PROTOCOL_MAP=INSIDE:PLAINTEXT,OUTSIDE:PLAINTEXT",
"KAFKA_LISTENERS=INSIDE://0.0.0.0:9092,OUTSIDE://0.0.0.0:9093",
"KAFKA_INTER_BROKER_LISTENER_NAME=INSIDE",
"KAFKA_ZOOKEEPER_CONNECT=zookeeper:2181",
"KAFKA_CREATE_TOPICS=baeldung:1:1"
]
depends_on = [docker_container.zookeeper]
networks_advanced {
name = docker_network.kafka_net.name
}
}

2. Node.js Uygulaması

Aşağıdaki kod, bir Express.js uygulaması olarak Kafka’ya veri gönderecek bir API sunmaktadır. Gerekli paketleri yüklemek için terminalde aşağıdaki komutu çalıştırın:

npm install express body-parser kafka-node

const express = require("express");
const bodyParser = require("body-parser");
const kafka = require("kafka-node");

const app = express();
app.use(bodyParser.json());

// Kafka istemcisi ve producer tanımı
const client = new kafka.KafkaClient({ kafkaHost: "localhost:9092" });
const producer = new kafka.Producer(client);

producer.on("ready", () => {
console.log("Producer is connected and ready.");
});

producer.on("error", (error) => {
console.error("Producer error:", error);
});

// POST isteği ile veri göndermek
app.post("/send", (req, res) => {
const { topic = 'baeldung', message } = req.body; // Varsayılan topic
const payloads = [{ topic, messages: message }];

producer.send(payloads, (error, data) => {
if (error) {
console.error("Error sending message:", error);
return res.status(500).json({ success: false, error });
}
console.log("Message sent successfully:", data);
res.json({ success: true, data });
});
});

const PORT = 3000;
app.listen(PORT, () => {
console.log(`Server is running on port ${PORT}`);
});

3. Kafka’ya Veri Göndermek

Uygulamanızı başlatmak için terminalde aşağıdaki komutu çalıştırın:

node test.js

ibrahimyildiz@192 ~ % docker exec -it kafka /opt/kafka/bin/kafka-topics.sh --create --topic my-topic --bootstrap-server localhost:9092 --partitions 1 --replication-factor 1
Created topic my-topic.

docker exec -it kafka /opt/kafka/bin/kafka-topics.sh --list --bootstrap-server localhost:9092



ibrahimyildiz@192 ~ % docker exec -it kafka /opt/kafka/bin/kafka-topics.sh --list --bootstrap-server localhost:9092
__consumer_offsets
baeldung
my-topic


ibrahimyildiz@192 ~ % docker exec -it kafka /opt/kafka/bin/kafka-console-consumer.sh --topic my-topic --from-beginning --bootstrap-server localhost:9092
Hello, My Topic!

--

--

No responses yet