s3互換のローカルストレージ環境minioにLaravelから保存する(vagrant)

Laravelからの保存先に実際のS3を使わずに、ローカルに疑似S3環境を作成してそこに保存させてみる。

minio

Minio: Private cloud storage

S3互換のオブジェクトストレージ環境。今回はVagrant上のCentOS7にいれた。
入れかたはまんま以下を参考に。

インストールはダウンロードして配置するだけ。

1
2
3
4
$ sudo curl https://dl.minio.io/server/minio/release/linux-amd64/minio -o /usr/local/bin/minio
$ sudo chmod +x /usr/local/bin/minio
$ sudo curl https://raw.githubusercontent.com/minio/minio-service/master/linux-systemd/minio.service -o /etc/systemd/system/minio.service
$ sudo useradd -s /sbin/nologin minio-user

オブジェクト保存先のディレクトリを作成してユーザを指定する。

1
2
$ sudo mkdir -p /var/lib/minio
$ sudo chown minio-user:minio-user /var/lib/minio

/etc/default/minio に設定ファイルを作成して記述。
アクセスキーとシークレットは後でログインや接続などに使用する。適当な値を入れておく。

1
2
3
4
5
6
7
8
9
10
11
# Local export path.
MINIO_VOLUMES="/var/lib/minio/"

# Use if you want to run Minio on a custom port.
MINIO_OPTS="--address :9000"

# Access Key of the server.
MINIO_ACCESS_KEY=AKIAIOSFODNN7EXAMPLE

# Secret key of the server.
MINIO_SECRET_KEY=wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY

自動起動設定と起動。

1
2
$ sudo systemctl enable minio
$ sudo systemctl start minio

ブラウザからアクセス出来るGUIが用意されている。
Vagrant経由でのアクセスは、Vagrantで指定しているIPに9000ポート(デフォルト。指定したポートで)でアクセスすると確認出来る。(httpなので注意)

例) http://192.168.33.33:9000/

画面右下にあるプラスボタンからバケットを作成出来る。
ここからファイルを直接アップすることも可能。
バケットは適当に作っておく。

Laravel

以下を参考にさせてもらった。

laravelから保存してみる。
基本的には環境の設定を渡してやるだけで動作する。

S3への保存をさせるのと、Formヘルパーを使ったのでそれぞれのパッケージを入れた。

1
2
$ composer require "laravelcollective/html":"^5.6.0"
$ composer require league/flysystem-aws-s3-v3

filesystems.phpでドライバーの設定をする。
S3の場合と微妙に違うため、minio用として分けておく方がよいと思われる。

config/filesystems.php

1
2
3
4
5
6
7
8
9
'minio' => [
    'driver' => 's3',
    'endpoint' => env('MINIO_ENDPOINT', 'http://127.0.0.1:9000'),
    'use_path_style_endpoint' => true,
    'key' => env('AWS_KEY'),
    'secret' => env('AWS_SECRET'),
    'region' => env('AWS_REGION'),
    'bucket' => env('AWS_BUCKET'),
],

デフォルトのS3用の設定は以下のようになっている。
デフォルトの設定

.envファイルで値を設定する。

1
2
3
4
5
6
FILESYSTEM_DRIVER=minio
MINIO_ENDPOINT="http://127.0.0.1:9000"
AWS_KEY=AKIAIOSFODNN7EXAMPLE
AWS_SECRET=wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY
AWS_REGION=us-east-1
AWS_BUCKET=sample-storage
  • FILESYSTEM_DRIVER : 設定したminioを指定
  • MINIO_ENDPOINT : vagrantの内部からアクセスすることになるので、ローカルホストにポート番号をつけた形で指定する
  • AWS_KEY : 設定した値
  • AWS_SECRET : 設定した値
  • AWS_REGION : なんでもよい
  • AWS_BUCKET : 作ったバケット

これであとは普通にs3に投げる方法で実装してやるだけでOK。
以下のような感じで作って試してみた。

ビュー (抜粋)

1
2
3
4
{!! Form::open(['files' => true]) !!}
    {!! Form::file('file_data') !!}
    {!! Form::submit('送信') !!}
{!! Form::close() !!}

コントローラー (抜粋)

1
2
3
4
5
6
7
8
9
10
public function fileUpload(Request $request)
{
    $file = $request->file('file_data');
    if(!is_null($file)){
        $filename = $file->store('hoge/fuga');
        return redirect('/')->with('success', $filename.'を保存しました。');
    }else{
        return redirect('/')->back();
    }
}

感想

アップしたものがGUIで確認出来たり、s3互換ということで、aws-cliが使えたりするらしく、がっつりテストしたりするなら便利かもしれない。
とはいえ、Laravelでの開発となると、ストレージにlocalを指定してやっても処理部分は全く同じ書き方で対応が出来るため、わざわざストレージを立ち上げてまでやる必要はないかもしれない…。

参考

   このエントリーをはてなブックマークに追加