通过 RabbitMQ 发布 MinIO 事件

简介
Minio 服务器支持与 Amazon S3 兼容的存储桶事件通知,以下目标可以使用 AMQP、Elasticsearch 、Redis、nats.io、PostgreSQL 和 Apache Kafka。本博客系列的第 1 部分介绍了使用 RabbitMQ 服务器通过 AMQP 发送存储桶通知。您可以将此设置与 AWS S3 & SQS 服务进行比较。
配置 RabbitMQ 的步骤
在本设置中,我在笔记本电脑上使用了 Ubuntu Linux 16.04、最新的 Minio 服务器二进制文件和 RabbitMQ 3.5.7–1。
安装 RabbitMQ 服务器并启用管理插件。
$ sudo apt-get install rabbitmq-server
$ sudo rabbitmq-plugins enable rabbitmq_management
创建一个名为“myuser”的用户,密码为“mypassword”。对于您的生产环境,您可能需要选择具有安全性的访问凭据。
$ sudo rabbitmqctl add_user myuser mypassword
$ sudo rabbitmqctl set_user_tags myuser administrator
$ sudo rabbitmqctl set_permissions -p / myuser ".*" ".*" ".*"
配置 Minio 的步骤
最新的 Minio 服务器二进制文件可以从 https://minio.io/downloads/ 下载。
$ wget https://dl.minio.io/server/minio/release/linux-amd64/minio
$ chmod +x minio
在本例中, “myphotos”用作 Minio 服务器的数据目录。
$ ./minio server myphotos
Endpoint: http://10.1.10.150:9000 http://127.0.0.1:9000
AccessKey: 7I6R5G576YI641GS9J9F
SecretKey: SuycBIe+O/s5zXxU9w+N4wkXHpBCKa2H6Ptlrc8c
Region: us-east-1
...
...
Minio 服务器配置文件的默认位置为 ~/.minio/config.json。按照以下步骤更新 ‘config.json’ 中的 AMQP 配置块。
"amqp": {
"1": {
"enable": true,
"url": "amqp://myuser:mypassword@localhost:5672",
"exchange": "bucketevents",
"routingKey": "bucketlogs",
"exchangeType": "fanout",
"mandatory": false,
"immediate": false,
"durable": false,
"internal": false,
"noWait": false,
"autoDeleted": false
}
}
重启 Minio 服务器以反映上述配置更改。Minio 支持 RabbitMQ 中可用的所有交换。在本设置中,我们使用的是 fanout 交换。
使用 Minio 客户端启用存储桶通知
步骤 1:下载并安装 Minio 客户端
$ wget https://dl.minio.io/client/mc/release/linux-amd64/mc
$ chmod 755 mc
步骤 2:添加 Minio 服务器主机别名信息
使用指向 Minio 服务器的访问密钥和密钥对 Minio 客户端进行配置。
$ ./mc config host add myminio https://:9000 7I6R5G576YI641GS9J9F SuycBIe+O/s5zXxU9w+N4wkXHpBCKa2H6Ptlrc8c
步骤 3:启用存储桶通知
在本例中,我们只会在将 JPEG 图像上传到或从 ‘myminio’ 服务器上的 ‘images’ 存储桶中删除时启用存储桶事件。这里的 ARN 值为 arn:minio:sqs:us-east-1:1:amqp. **。** 要了解有关 ARN 的更多信息,请参阅 AWS ARN 文档。
$ ./mc mb myminio/images
$ ./mc events add myminio/images arn:minio:sqs:us-east-1:1:amqp --suffix .jpg
$ ./mc events list myminio/images
arn:minio:sqs:us-east-1:1:amqp s3:ObjectCreated:*,s3:ObjectRemoved:* Filter: suffix=”.jpg”
步骤 4:监视交换上的事件
以下 python 脚本在队列交换 ‘bucketevents’ 上等待,并在控制台上打印事件通知。它使用 pika python 客户端 库来访问 RabbitMQ。
#!/usr/bin/env python
import pika
connection = pika.BlockingConnection(pika.ConnectionParameters(
host='localhost'))
channel = connection.channel()
channel.exchange_declare(exchange='bucketevents',
type='fanout')
result = channel.queue_declare(exclusive=False)
queue_name = result.method.queue
channel.queue_bind(exchange='bucketevents',
queue=queue_name)
print(' [*] Waiting for logs. To exit press CTRL+C')
def callback(ch, method, properties, body):
print(" [x] %r" % body)
channel.basic_consume(callback,
queue=queue_name,
no_ack=False)
channel.start_consuming()
执行此示例 python 脚本以监视控制台上的 RabbitMQ 事件。
$ python rabbit.py
打开另一个终端,并将 JPEG 图像上传到 “images” 存储桶。
$ ./mc cp myphoto.jpg myminio/images
上传完成后,您应该通过 RabbitMQ 接收以下事件通知。
$ python rabbit.py
‘{“Records”:[{“eventVersion”:”2.0",”eventSource”:”aws:s3",”awsRegion”:”us-east-1",”eventTime”:”2016–09–08T22:34:38.226Z”,”eventName”:”s3:ObjectCreated:Put”,”userIdentity”:{“principalId”:”minio”},”requestParameters”:{“sourceIPAddress”:”10.1.10.150:44576"},”responseElements”:{},”s3":{“s3SchemaVersion”:”1.0",”configurationId”:”Config”,”bucket”:{“name”:”images”,”ownerIdentity”:{“principalId”:”minio”},”arn”:”arn:aws:s3:::images”},”object”:{“key”:”myphoto.jpg”,”size”:200436,”sequencer”:”147279EAF9F40933"}}}],”level”:”info”,”msg”:””,”time”:”2016–09–08T15:34:38–07:00"}\n’
您可以使用官方 RabbitMQ 文档 上提供的不同语言绑定来创建自己的脚本。
步骤 5:在 RabbitMQ 上进行测试
使用 rabbitmqctl 命令行工具测试设置。
$ sudo rabbitmqctl list_exchanges
Listing exchanges …
direct
amq.direct direct
amq.fanout fanout
amq.headers headers
amq.match headers
amq.rabbitmq.log topic
amq.rabbitmq.trace topic
amq.topic topic
bucketevents fanout
“bucketevents fanout” 表示已成功创建 RabbitMQ 交换,类型为:‘fanout’。
如有更多问题和评论,请加入我们的 Slack 聊天:https://slack.minio.io