Minio Kafka Bucket Notifications (no TLS) - allanrogerr/public GitHub Wiki
https://kafka.apache.org/documentation/#quickstart
Run on kafka-demo vm-broker instance
ssh -p 20058 [email protected] -o "ServerAliveInterval=5" -o "ServerAliveCountMax=100000" -o "StrictHostKeyChecking=off"
Get Kafka
wget https://dlcdn.apache.org/kafka/3.8.1/kafka_2.12-3.8.1.tgz
tar -xzf kafka_2.12-3.8.1.tgz
cd kafka_2.12-3.8.1
Get Java
sudo apt update
sudo apt install default-jre
java -version
Output
openjdk version "21.0.4" 2024-07-16
OpenJDK Runtime Environment (build 21.0.4+7-Ubuntu-1ubuntu224.04)
OpenJDK 64-Bit Server VM (build 21.0.4+7-Ubuntu-1ubuntu224.04, mixed mode, sharing)
Start the Kafka Environment
Kafka with ZooKeeper
bin/zookeeper-server-start.sh config/zookeeper.properties
New terminal
ssh -p 20058 [email protected] -o "ServerAliveInterval=5" -o "ServerAliveCountMax=100000" -o "StrictHostKeyChecking=off"
cd kafka_2.12-3.8.1
bin/kafka-server-start.sh config/server.properties
Create a topic to store your events
New terminal. Note that port 9092 was part of the output of the previous command
ssh -p 20058 [email protected] -o "ServerAliveInterval=5" -o "ServerAliveCountMax=100000" -o "StrictHostKeyChecking=off"
cd kafka_2.12-3.8.1
bin/kafka-topics.sh --create --topic quickstart-events --bootstrap-server localhost:9092
Output
Created topic quickstart-events.
Describe topic
bin/kafka-topics.sh --describe --topic quickstart-events --bootstrap-server localhost:9092
Write Some Events Into The Topic
bin/kafka-console-producer.sh --topic quickstart-events --bootstrap-server localhost:9092
Input the following examples after the >
prompt:
First event
Second event
Final event
Hit Ctrl-C
Read The Events
bin/kafka-console-consumer.sh --topic quickstart-events --from-beginning --bootstrap-server localhost:9092
Output
First event
Second event
Final event
Hit Ctrl-C
Import/export Your Data As Streams Of Events With Kafka Connect
echo "plugin.path=libs/connect-file-3.8.1.jar" >> config/connect-standalone.properties
Create seed data
echo -e "foo\nbar" > test.txt
Start two connectors
bin/connect-standalone.sh config/connect-standalone.properties \
config/connect-file-source.properties \
config/connect-file-sink.properties
Verify data delivered New terminal
ssh -p 20058 [email protected] -o "ServerAliveInterval=5" -o "ServerAliveCountMax=100000" -o "StrictHostKeyChecking=off"
cd kafka_2.12-3.8.1
more test.sink.txt
Output
foo
bar
Use consumer to check data in topic
bin/kafka-console-consumer.sh --bootstrap-server localhost:9092 --topic connect-test --from-beginning
Output
{"schema":{"type":"string","optional":false},"payload":"foo"}
{"schema":{"type":"string","optional":false},"payload":"bar"}
Processed a total of 2 messages
Observe delivery
New terminal
ssh -p 20058 [email protected] -o "ServerAliveInterval=5" -o "ServerAliveCountMax=100000" -o "StrictHostKeyChecking=off"
cd kafka_2.12-3.8.1
echo Another line>> test.txt
Observe output in consumer (previous terminal)
{"schema":{"type":"string","optional":false},"payload":"foo"}
{"schema":{"type":"string","optional":false},"payload":"bar"}
{"schema":{"type":"string","optional":false},"payload":"Another line"}
Stop Kafka processes in all terminals with Hit Ctrl-C
Minio integration
Start kafka with ZooKeeper
Terminal 1
ssh -p 20058 [email protected] -o "ServerAliveInterval=5" -o "ServerAliveCountMax=100000" -o "StrictHostKeyChecking=off"
cd ~/kafka_2.12-3.8.1 && bin/zookeeper-server-start.sh config/zookeeper.properties
Terminal 2
ssh -p 20058 [email protected] -o "ServerAliveInterval=5" -o "ServerAliveCountMax=100000" -o "StrictHostKeyChecking=off"
cd ~/kafka_2.12-3.8.1 && bin/kafka-server-start.sh config/server.properties
Create a topic Terminal 3
ssh -p 20058 [email protected] -o "ServerAliveInterval=5" -o "ServerAliveCountMax=100000" -o "StrictHostKeyChecking=off"
cd ~/kafka_2.12-3.8.1 && bin/kafka-topics.sh --create --topic minio-events --bootstrap-server localhost:9092
Output
Created topic minio-events.
ssh -p 20058 [email protected] -o "ServerAliveInterval=5" -o "ServerAliveCountMax=100000" -o "StrictHostKeyChecking=off"
cd ~/kafka_2.12-3.8.1 && bin/kafka-topics.sh --create --topic minio-audit --bootstrap-server localhost:9092
Output
Created topic minio-events.
Start consuming events
bin/kafka-console-consumer.sh --topic minio-events --from-beginning --bootstrap-server localhost:9092
Minio Integration
Terminal 3
ssh -p 20058 [email protected] -o "ServerAliveInterval=5" -o "ServerAliveCountMax=100000" -o "StrictHostKeyChecking=off"
Install and run minio
wget https://dl.min.io/server/minio/release/linux-amd64/minio
chmod +x minio
CI=on ./minio server /tmp/data --address :10000 --console-address :10090
Install mc and configure kafka
Terminal 4
ssh -p 20058 [email protected] -o "ServerAliveInterval=5" -o "ServerAliveCountMax=100000" -o "StrictHostKeyChecking=off"
mkdir ~/mc && cd ~/mc && wget https://dl.min.io/client/mc/release/linux-amd64/mc
chmod +x mc
./mc alias set minio-kafka http://127.0.0.1:10000 minioadmin minioadmin
Add the Kafka Endpoint to MinIO
./mc admin config set minio-kafka/ notify_kafka:PRIMARY \
brokers="127.0.0.1:9092" \
topic="minio-events" \
queue_dir="/tmp/minio/events" \
queue_limit="10" \
comment="initial"
./mc admin info --json minio-kafka
Obtain ARN from minio startup or from ./mc admin info --json minio-kafka | grep sqsARN
"sqsARN":["arn:minio:sqs::PRIMARY:kafka"]
Create bucket
./mc mb minio-kafka/kafka-demo-no-tls
Configure bucket notifications
./mc event add minio-kafka/kafka-demo-no-tls arn:minio:sqs::PRIMARY:kafka --event "put,delete,get,replica,ilm,scanner"
Output
Successfully added arn:minio:sqs::PRIMARY:kafka
OR in UI
Configure audit
./mc admin config set minio-kafka audit_kafka:KAFKA1 \
enable=on \
brokers=localhost:9092 \
topic=minio-audit \
queue_size=1000 \
queue_dir=/tmp/audit_queue
./mc admin config get minio-kafka audit_kafka
Modify bucket and observe bucket events e.g.
ubuntu@kafka-no-tls:~/kafka_2.12-3.8.1$ bin/kafka-console-consumer.sh --topic minio-events --from-beginning --bootstrap-server localhost:9092
{"EventName":"s3:ObjectAccessed:Head","Key":"kafka-demo-no-tls/text1","Records":[{"eventVersion":"2.0","eventSource":"minio:s3","awsRegion":"","eventTime":"2024-10-30T11:12:04.441Z","eventName":"s3:ObjectAccessed:Head","userIdentity":{"principalId":"minioadmin"},"requestParameters":{"principalId":"minioadmin","region":"","sourceIPAddress":"98.45.6.62"},"responseElements":{"content-length":"4","x-amz-id-2":"4583eb6562a9e7815e67b696a120c09f09901d3770caef92bcabadf9f989ca5c","x-amz-request-id":"1803369BC1D07053","x-minio-deployment-id":"21d6dc19-49f6-45d3-b9e1-66e7a5f15b3f","x-minio-origin-endpoint":"http://10.214.226.245:10000"},"s3":{"s3SchemaVersion":"1.0","configurationId":"Config","bucket":{"name":"kafka-demo-no-tls","ownerIdentity":{"principalId":"minioadmin"},"arn":"arn:aws:s3:::kafka-demo-no-tls"},"object":{"key":"text1","size":4,"eTag":"1cb251ec0d568de6a929b520c4aed8d1","contentType":"application/octet-stream","userMetadata":{"content-type":"application/octet-stream"},"sequencer":"18033660213701B1"}},"source":{"host":"98.45.6.62","port":"","userAgent":"MinIO (linux; amd64) minio-go/v7.0.77 MinIO Console/(dev)"}}]}
{"EventName":"s3:ObjectRemoved:Delete","Key":"kafka-demo-no-tls/text1","Records":[{"eventVersion":"2.0","eventSource":"minio:s3","awsRegion":"","eventTime":"2024-10-30T11:12:08.377Z","eventName":"s3:ObjectRemoved:Delete","userIdentity":{"principalId":"minioadmin"},"requestParameters":{"principalId":"minioadmin","region":"","sourceIPAddress":"98.45.6.62"},"responseElements":{"content-length":"151","x-amz-id-2":"4583eb6562a9e7815e67b696a120c09f09901d3770caef92bcabadf9f989ca5c","x-amz-request-id":"1803369CAC4E281D","x-minio-deployment-id":"21d6dc19-49f6-45d3-b9e1-66e7a5f15b3f","x-minio-origin-endpoint":"http://10.214.226.245:10000"},"s3":{"s3SchemaVersion":"1.0","configurationId":"Config","bucket":{"name":"kafka-demo-no-tls","ownerIdentity":{"principalId":"minioadmin"},"arn":"arn:aws:s3:::kafka-demo-no-tls"},"object":{"key":"text1","sequencer":"1803369CAC82E135"}},"source":{"host":"98.45.6.62","port":"","userAgent":"MinIO (linux; amd64) minio-go/v7.0.77 MinIO Console/(dev)"}}]}
Modify bucket and observe audit events e.g.
ubuntu@kafka-no-tls:~/kafka_2.12-3.8.1$ bin/kafka-console-consumer.sh --topic minio-audit --from-beginning --bootstrap-server localhost:9092
{"EventName":"s3:ObjectCreated:Put","Key":"kafka-demo-no-tls/text1","Records":[{"eventVersion":"2.0","eventSource":"minio:s3","awsRegion":"","eventTime":"2024-10-30T11:07:48.347Z","eventName":"s3:ObjectCreated:Put","userIdentity":{"principalId":"minioadmin"},"requestParameters":{"principalId":"minioadmin","region":"","sourceIPAddress":"98.45.6.62"},"responseElements":{"x-amz-id-2":"4583eb6562a9e7815e67b696a120c09f09901d3770caef92bcabadf9f989ca5c","x-amz-request-id":"18033660211A55DE","x-minio-deployment-id":"21d6dc19-49f6-45d3-b9e1-66e7a5f15b3f","x-minio-origin-endpoint":"http://10.214.226.245:10000"},"s3":{"s3SchemaVersion":"1.0","configurationId":"Config","bucket":{"name":"kafka-demo-no-tls","ownerIdentity":{"principalId":"minioadmin"},"arn":"arn:aws:s3:::kafka-demo-no-tls"},"object":{"key":"text1","size":4,"eTag":"1cb251ec0d568de6a929b520c4aed8d1","contentType":"application/octet-stream","userMetadata":{"content-type":"application/octet-stream"},"sequencer":"18033660213701B1"}},"source":{"host":"98.45.6.62","port":"","userAgent":"MinIO (linux; amd64) minio-go/v7.0.77 MinIO Console/(dev)"}}]}
{"accessKey":"minioadmin","api":{"name":"SetConfigKV","rx":169,"status":"OK","statusCode":200,"timeToResponse":"114262852ns","timeToResponseInNS":"114262852","tx":0},"deploymentid":"21d6dc19-49f6-45d3-b9e1-66e7a5f15b3f","event":"","remotehost":"127.0.0.1","requestHeader":{"Accept-Encoding":"zstd,gzip","Authorization":"AWS4-HMAC-SHA256 Credential=minioadmin/20241030//s3/aws4_request, SignedHeaders=host;x-amz-content-sha256;x-amz-date, Signature=a1cb38b1e610dbb7f785be639cdbc083a2f35c0f513b5dc7df3bb128c3cb8929","Content-Length":"169","User-Agent":"MinIO (linux; amd64) madmin-go/3.0.70 mc/RELEASE.2024-10-08T09-37-26Z","X-Amz-Content-Sha256":"69c89c7f99a05e22fab7c1c61e5141595fb836c9b8b07d4d1278e3bbb0b4f98e","X-Amz-Date":"20241030T111118Z"},"requestHost":"127.0.0.1:10000","requestID":"18033691160CE252","requestPath":"/minio/admin/v3/set-config-kv","responseHeader":{"Accept-Ranges":"bytes","Content-Length":"0","Server":"MinIO","Strict-Transport-Security":"max-age=31536000; includeSubDomains","Vary":"Origin,Accept-Encoding","X-Amz-Id-2":"4583eb6562a9e7815e67b696a120c09f09901d3770caef92bcabadf9f989ca5c","X-Amz-Request-Id":"18033691160CE252","X-Content-Type-Options":"nosniff","X-Minio-Config-Applied":"true","X-Xss-Protection":"1; mode=block"},"tags":{"GetObject":"name=config/config.json,pool=1,set=1","PutObject":"name=config/history/bfdb8730-3d14-4245-8a9c-08298c03b862.kv,pool=1,set=1"},"time":"2024-10-30T11:11:18.722790228Z","trigger":"incoming","userAgent":"MinIO (linux; amd64) madmin-go/3.0.70 mc/RELEASE.2024-10-08T09-37-26Z","version":"1"}