at backyard

Color my life with the chaos of trouble.

様々な言語からMinioのファイルアップロードを試す

様々な言語からMinioを試してみる。
※といっても、現在は3言語しかまだ書いていない

f:id:shinshin86:20170318082954p:plain

最近 Go言語で書かれた、S3互換のオブジェクトストレージサーバを触り始めたので、
各言語での試し方をこちらにメモしておく。
なお、あくまで現時点でのやり方となるので、もしこの記事が古くなっているようだったら、
公式からDocsに飛んで確認するのが望ましい。

www.minio.io



まずはNode.jsから

Node.js

セットアップ

npm install minio

実装

const Minio = require('minio');
const fs = require('fs');
const path = require('path');

const location = 'us-east-1';

const minioClient = new Minio.Client({
  endPoint: END_POINT,
  port: PORT,
  secure: false, // テストなのでひとまずfalseにしている
  accessKey: ACCESS_KEY,
  secretKey: SECRET_KEY
});

// Bucket作成
function createBucket(bucketName) {
  minioClient.makeBucket(bucketName, location, function(err) {
    if(err) return console.log(err);

    console.log('Bucket created successfully in ', location);
    console.log('Created bucket name  => ', bucketName);
  });
}

// imagesディレクトリ内の画像ファイルを作成したBucketに全てアップロードする
function fileUpload(bucketName, uploadDir) {
  let files = fs.readdirSync(uploadDir);
  files.forEach(function(file) {
    console.log('Upload file =>', file);

    // アップロードするファイル名
    let filePath = path.join(uploadDir, file);
    // fPutObjectを使用してファイルをBucket "SampleImages"にアップロードします
    minioClient.fPutObject(bucketName, file, filePath, 'image/png', function(err, etag) {
      if(err) return console.log(err);
      console.log('File upload successfully!!');
      console.log('Uploaded File Name => ', file);
    });
  });
}

// 作成するBucket名
const bucketName = 'nodetest';

// アップロード対象が格納されたディレクトリ名
let targetDir = 'images';

// アップロード対象の絶対パス
let uploadDir = path.join(__dirname, targetDir);

// 実行
createBucket(bucketName);
fileUpload(bucketName, uploadDir);

Python

セットアップ

pip install minio

実装

from minio import Minio
from minio.error import ResponseError
import os
import glob

# テストなのでひとまずsecureはFalseにしている
minioClient = Minio(END_POINT,
    access_key=ACCESS_KEY,
    secret_key=SECRET_KEY,
    secure=False)

# Bucketを作成する
def create_bucket(bucket_name):
    try:
        minioClient.make_bucket(bucket_name, location='us-east-1')
    except ResponseError as err:
        print(err)

# 対象ディレクトリなのファイルを取得し、アップロードする
def file_upload(bucket_name, upload_dir):
    for i in glob.glob(os.path.join(upload_dir, '*.png')):
        try:
            minioClient.fput_object(bucket_name, os.path.basename(i), i)
        except ResponseError as err:
            print(err)


# 作成するBucket名
bucket_name = 'pythontest'

# アップロード対象のファイルが格納されたディレクトリ名
target_dir = 'images'

# アップロード対象の絶対パス
upload_dir = os.path.join(os.getcwd(), target_dir)

print('File upload start');
create_bucket(bucket_name)
file_upload(bucket_name, upload_dir)
print('File upload successfully!')

Go

セットアップ

go get -u github.com/minio/minio-go

実装

package main

import (
	"fmt"
	"github.com/minio/minio-go" // Import Minio library.
	"io/ioutil"
	"log"
	"os"
	"path/filepath"
)

func main() {
	bname := "gotest"
	tdir := "images"
	tpath, err := os.Getwd()
	ssl := false // テストなのでひとまずfalseとしている
        location := "us-east-1"

	minioClient, err := minio.New(Endpoint,
		AccessKey,
		SecretKey, ssl)

	if err != nil {
		log.Fatalln(err)
	}

	// bucketを作成
	err = minioClient.MakeBucket(bname, location)
	if err != nil {
		// 既に同名のbucketが存在していないかを確認する
		exists, err := minioClient.BucketExists(bname)
		if err == nil && exists {
			fmt.Printf("We already own %s\n", bname)
		} else {
			log.Fatalln(err)
		}
	} else {
		fmt.Printf("Successfully created %s\n", bname)
	}

	// 指定したディレクトリからファイルを取得
	filelist, err := ioutil.ReadDir(filepath.Join(tpath, tdir))

	if err != nil {
		fmt.Println(err)
		return
	}

    // 取得したファイルをすべてアップロードする
	for index, element := range filelist {
		fmt.Printf("Uploading... %s : %d\n", element.Name(), index)

		n, err := minioClient.FPutObject(bname, element.Name(), filepath.Join(tpath, tdir, element.Name()), "image/png")
		if err != nil {
			log.Fatalln(err)
		}
		fmt.Printf("Successfully uploadefd %s of size %d\n", element.Name(), n)
	}
}

ひとまずここまで。
汚いコードをただ書き散らしているような気もする。。。精進していかねば。

あと、昨日からElixir触り始めたので、Elixirのサンプルも近々書きたい。


ちょっと試すだけでも使用コストがかかってしまうAmazon S3の代替手段として
Minioの存在価値はとてもあると思う。気軽にローカルでの開発などに使えるので、とても便利。

インストール関連の記事は検索してみると色々出て来るし、公式のスタートガイドも分かりやすい。

いいですね、Minio