通过 NATS 发布 MinIO 事件

介绍

Minio 服务器支持与 Amazon S3 兼容的存储桶事件通知,以用于以下目标:AMQPElasticsearchRedisnats.ioPostgreSQLApache Kafka。本博文系列的第 4 部分介绍如何使用 NATS 发送存储桶通知。

配置 NATS 的步骤

我使用了 Ubuntu Linux 16.04、gnatsdnats 包。它需要安装 go 包,有关安装步骤,请遵循 https://docs.minio.io/docs/how-to-install-golang

$ go get github.com/nats-io/gnatsd
$ go get github.com/nats-io/nats

启动 NATS 服务器。

$ gnatsd --user yourusername --pass yoursecret
[1510] 2016/10/12 06:14:48.706544 [INF] Starting nats-server version 0.9.4
[1510] 2016/10/12 06:14:48.707441 [INF] Listening for client connections on 0.0.0.0:4222
[1510] 2016/10/12 06:14:48.708332 [INF] Server is ready

配置 Minio 的步骤

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

$ wget https://dl.minio.io/server/minio/release/linux-amd64/minio
$ chmod +x minio
In this case “myphotos” is used as my data directory for Minio server.
$ ./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’* 中更新 NATS 配置块,如下所示

"nats": {
            "1": {
                "enable": true,
                "address": "0.0.0.0:4222",
                "subject": "bucketevents",
                "username": "yourusername",
                "password": "yoursecret",
                "token": "",
                "secure": false,
                "pingInterval": 0
            }
        },

重新启动 Minio 服务器以反映上述配置更改。*“bucketevents”* 是本示例中 NATS 使用的 *主题*。

使用 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 图像上传或从 *‘images’* 存储桶(位于 *‘myminio’* 服务器上)删除时启用存储桶事件。这里的 ARN 值为 *arn:minio:sqs:us-east-1:1:nats.*。要详细了解 ARN,请遵循 AWS ARN 文档

$ ./mc mb myminio/images
$ ./mc events add  myminio/images arn:minio:sqs:us-east-1:1:nats --suffix .jpg
$ ./mc events list myminio/images
arn:minio:sqs:us-east-1:1:nats s3:ObjectCreated:*,s3:ObjectRemoved:* Filter: suffix=”.jpg”

步骤 4:在 NATS 上进行测试

使用以下程序,我们可以记录添加到 NATS 的存储桶通知。

package main

// Import Go and NATS packages
import (
  "runtime"
  "log"
  "github.com/nats-io/nats"
)

func main() {

    // Create server connection
    natsConnection, _ := nats.Connect("nats://yourusername:yoursecret@localhost:4222")
    log.Println("Connected")

    // Subscribe to subject
    log.Printf("Subscribing to subject 'bucketevents'\n")
    natsConnection.Subscribe("bucketevents", func(msg *nats.Msg) {

      // Handle the message
      log.Printf("Received message '%s\n", string(msg.Data) + "'")
  })

  // Keep the connection alive
  runtime.Goexit()
}
$ go run nats.go
2016/10/12 06:39:18 Connected
2016/10/12 06:39:18 Subscribing to subject 'bucketevents'

打开另一个终端,并将 JPEG 图像上传到“*images*”存储桶。

$ ./mc cp myphoto.jpg myminio/images

在运行 *nats.go* 程序的终端下方,控制台中会打印事件通知。

$ go run nats.go 
2016/10/12 06:51:26 Connected
2016/10/12 06:51:26 Subscribing to subject 'bucketevents'
2016/10/12 06:51:33 Received message '{"EventType":"s3:ObjectCreated:Put","Key":"images/myphoto.jpg","Records":[{"eventVersion":"2.0","eventSource":"aws:s3","awsRegion":"us-east-1","eventTime":"2016-10-12T13:51:33Z","eventName":"s3:ObjectCreated:Put","userIdentity":{"principalId":"minio"},"requestParameters":{"sourceIPAddress":"[::1]:57106"},"responseElements":{},"s3":{"s3SchemaVersion":"1.0","configurationId":"Config","bucket":{"name":"images","ownerIdentity":{"principalId":"minio"},"arn":"arn:aws:s3:::images"},"object":{"key":"myphoto.jpg","size":56060,"eTag":"1d97bf45ecb37f7a7b699418070df08f","sequencer":"147CCD1AE054BFD0"}}}],"level":"info","msg":"","time":"2016-10-12T06:51:33-07:00"}

如有更多疑问和评论,请加入我们的 Slack 聊天:https://slack.minio.io