🔖

S3っぽいMinIOが便利だったのでお知らせしたい

2023/01/30に公開

概要

MinIOを使ってみました。

要約

  • MinIO使ってみた。
  • ローカルでS3を試したいだけなら断然推したい。
  • IAMポリシーの設定とか細かい使い方はよくわかってません。

使い方

version
Docker version 20.10.22, build 3a2c30b
MinIO Version: RELEASE.2023-01-18T04-36-38Z (go1.19.4 linux/amd64)

こんなcompose.ymlを書きます

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にマウントされます。

コンテナの起動とUIの確認[1]

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

minio

UsernameとPasswordに、ymlで指定したMINIO_ROOT_USERMINIO_ROOT_PASSWORDをそれぞれ入力しLoginをクリックします。

ログイン後

ログインできました。「Create Bucket」なる頼もしいリンクが見えますのでクリックしてみます。

create bucket

なにか言う前からInvalid bucket nameとか怒ってくるMinIOさんちょっと手厳しいですが、ここは臆せず、適当なbucket名を入力してCreate Bucketをクリックします。Featureの設定はとりあえずデフォルトのままにしておきます。

sample bucket

bucketができたようです!

bucketできた

あらためて、左ペインの「Object Browser」をクリックしてみますと、

object browser

ここでもbucketが作成されたことが確認できます。作成したばかりなのでサイズは0.0Bです。

bucket内容

Name列のsample-bucketをクリックすると内容を確認できます。ここでサブディレクトリを作ったり、ファイルを直接アップロードしたりできます。

Laravelプロジェクトから使ってみる

せっかくなのでAPIを使った操作も試してみます。

LaravelではStorageファサードを使って、S3やMinIOのような互換プラットフォームを操作することができます。S3(MinIO)に接続するための設定はconfig/filesystems.phpに記述されていますが、

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へ以下のように記述します。

.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_IDAWS_SECRET_ACCESS_KEYはそれぞれcompose.ymlで指定したMINIO_ROOT_USERMINIO_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_IDAWS_SECRET_ACCESS_KEYは指定せずに動かす方法が一般的かと思います。
開発時に記述したパラメータをそのまま持ち込まないように注意しましょう。

ではまた!

参考記事

脚注
  1. ここでは出力を確認するため-dオプションをつけていません。通常はdocker compose up -dでもちろんOKです。 ↩︎

  2. かっこよくopenコマンドを使っていますが、ブラウザに直打ちでももちろんOKです。VSCodeだとログに出力されているhttp://127.0.0.1:9090をCommandキー押しながらクリックしたくなりますが、この記事ではポートNoを変更しているので残念ながらアクセス拒否されてしまいます。 ↩︎

Discussion