S3っぽいMinIOが便利だったのでお知らせしたい
概要
MinIOを使ってみました。
要約
- MinIO使ってみた。
- ローカルでS3を試したいだけなら断然推したい。
- IAMポリシーの設定とか細かい使い方はよくわかってません。
使い方
Docker version 20.10.22, build 3a2c30b
MinIO Version: RELEASE.2023-01-18T04-36-38Z (go1.19.4 linux/amd64)
こんなcompose.ymlを書きます
version: '3'
services:
minio:
image: quay.io/minio/minio:RELEASE.2023-01-18T04-36-38Z
container_name: 'minio'
ports:
- 9871:9090 # exposeするポートはよしなにしてください
environment:
- MINIO_ROOT_USER=minioroot # ユーザ、パスワードもよしなにしてください
- MINIO_ROOT_PASSWORD=miniopass
command: server --console-address ":9090" /data
volumes:
- .s3/.minio/data:/data
imageのバージョンについて
latest
でもいいんですが、いろいろ参考にさせていただいた記事のなかでもバージョンが変わるとUIが変わったりパラメータが変わったり落ち着かなかったので、この記事ではバージョンを固定しています。
ポートについて
MinIOのデフォルトポートは9090
ですが、これだと他の環境と衝突しそうだったのでexposeするポートは変更しています。
rootユーザとパスワードについて
これもよしなに変更してください。
volumesについて
この記事では、compose.yml
と同階層の.s3/.minio/data
以下に永続化しています。ディレクトリが存在しない場合はcompose up
の時点で自動で作成され、コンテナのdata
にマウントされます。
[1]
コンテナの起動とUIの確認docker compose up
minio | Formatting 1st pool, 1 set(s), 1 drives per set.
minio | WARNING: Host local has more than 0 drives of set. A host failure will result in data becoming unavailable.
minio | MinIO Object Storage Server
minio | Copyright: 2015-2023 MinIO, Inc.
minio | License: GNU AGPLv3 <https://www.gnu.org/licenses/agpl-3.0.html>
minio | Version: RELEASE.2023-01-18T04-36-38Z (go1.19.4 linux/amd64)
minio |
minio | Status: 1 Online, 0 Offline.
minio | API: http://172.18.0.7:9000 http://127.0.0.1:9000
minio | Console: http://172.18.0.7:9090 http://127.0.0.1:9090
minio |
minio | Documentation: https://min.io/docs/minio/linux/index.html
minio | Warning: The standard parity is set to 0. This can lead to data loss.
minio |
minio | You are running an older version of MinIO released 6 days ago
minio | Update: Run `mc admin update`
minio |
minio |
起動したらexposeしたポートをブラウザで開きます。[2]
open http://localhost:9871
UsernameとPasswordに、ymlで指定したMINIO_ROOT_USER
、MINIO_ROOT_PASSWORD
をそれぞれ入力しLoginをクリックします。
ログインできました。「Create Bucket」なる頼もしいリンクが見えますのでクリックしてみます。
なにか言う前からInvalid bucket name
とか怒ってくるMinIOさんちょっと手厳しいですが、ここは臆せず、適当なbucket名を入力してCreate Bucketをクリックします。Featureの設定はとりあえずデフォルトのままにしておきます。
bucketができたようです!
あらためて、左ペインの「Object Browser」をクリックしてみますと、
ここでもbucketが作成されたことが確認できます。作成したばかりなのでサイズは0.0B
です。
Name列のsample-bucket
をクリックすると内容を確認できます。ここでサブディレクトリを作ったり、ファイルを直接アップロードしたりできます。
Laravelプロジェクトから使ってみる
せっかくなのでAPIを使った操作も試してみます。
LaravelではStorageファサードを使って、S3やMinIOのような互換プラットフォームを操作することができます。S3(MinIO)に接続するための設定はconfig/filesystems.php
に記述されていますが、
's3' => [
'driver' => 's3',
'key' => env('AWS_ACCESS_KEY_ID'),
'secret' => env('AWS_SECRET_ACCESS_KEY'),
'region' => env('AWS_DEFAULT_REGION'),
'bucket' => env('AWS_BUCKET'),
'url' => env('AWS_URL'),
'endpoint' => env('AWS_ENDPOINT'),
'use_path_style_endpoint' => env('AWS_USE_PATH_STYLE_ENDPOINT', false),
'throw' => true,
],
上記のとおり、実際には.env
を参照するような仕掛けになっています。なので.env
へ以下のように記述します。
AWS_ACCESS_KEY_ID=minioroot
AWS_SECRET_ACCESS_KEY=miniopass
AWS_DEFAULT_REGION=ap-northeast-1
AWS_BUCKET=sample-bucket
AWS_ENDPOINT=http://localhost:9000
AWS_USE_PATH_STYLE_ENDPOINT=true
AWS_ACCESS_KEY_ID
、AWS_SECRET_ACCESS_KEY
はそれぞれcompose.yml
で指定したMINIO_ROOT_USER
とMINIO_ROOT_PASSWORD
です。AWS_BUCKET
には前の操作で作成したbucket名を指定します。
ここまでを終えた上でLaravelで以下のようにしますと、
$json = [
"sample" => [
[
"name" => "daifuku",
"destination" => "kyoto",
],
]
];
$json = json_encode($json, JSON_UNESCAPED_UNICODE|JSON_UNESCAPED_SLASHES);
Storage::disk('s3')->put('/sample.json', $json);
$json
にまとめた内容が、sample.json
というファイル名でsample-bucket
に作成されます。
実際にAWS上で動かす場合はIAMロールを設定し、AWS_ACCESS_KEY_ID
やAWS_SECRET_ACCESS_KEY
は指定せずに動かす方法が一般的かと思います。
開発時に記述したパラメータをそのまま持ち込まないように注意しましょう。
ではまた!
Discussion