通过RabbitMQ发布Minio事件

通过RabbitMQ发布Minio事件


介绍

Minio服务器支持以下目标AMQPElasticsearchRedisnats.ioPostgreSQLApache Kafka的Amazon S3兼容存储桶事件通知本博客系列的第1部分介绍了使用RabbitMQ服务器通过AMQP发送存储桶通知您可以将此设置与AWS S3SQS服务进行比较。

配置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的步骤

可以从https://minio.io/downloads/下载最新的Minio服务器二进制文件

$ wget https://dl.minio.io/server/minio/release/linux-amd64/minio
$ chmod +x minio

在这种情况下,“ myphotos”用作Minio服务器的数据目录。
$ ./minio服务器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中所有可用的交换对于此设置,我们使用扇出交换。

使用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 http://localhost:9000 7I6R5G576YI641GS9J9F SuycBIe+O/s5zXxU9w+N4wkXHpBCKa2H6Ptlrc8c

第3步:启用存储桶通知

在此示例中,仅当在“ myminio”服务器上的“ images”存储桶中上传或删除JPEG图像时,才启用存储桶事件这里的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 '并在控制台上打印事件通知。为RabbitMQ使用了pika python客户端库。

#!/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”指出已成功创建类型为“ fanout”的RabbitMQ交换

如有其他问题和意见,请加入我们的Slack聊天室,网址为:http://slack.minio.org.cn/questions


上一篇 下一篇