Amazon S3 の開発環境として MinIO を VPS にインストールする

こんにちは❗フリーランス・コンサルタント&エンジニアの 九保すこひ です。

さてさて、私は開発歴のある程度あったりするんですが、まだまだ知らないことだらけで、この間も以下のようなことがありました。

え!そんな便利なヤツあんの!?(しかも無料で使える)😮

そうです。

開発の世界は新しいものが頻繁に登場するので、そんな中「いいものであったとしても私のところまで届いていない」という事柄がたまに出てきたりするんですね。(もしくはアンテナがそっち向いてなかったのかも…🤔)

そして、今回そう思わされるきっかけになったのが、

MinIO(みにおー)

です。

MinIOは、簡単にいうと「自前で用意できる Amazon S3」です。

つまり、S3のようなストレージを自分でインストールして使えるというスグレモノです!

しかも、何がすごいって「S3 互換」なので .env を変更するだけで S3 用のコードが動くんです。

なので、開発にはもってこいなんですね。

そして、なんならVPSにインストールしてどこからでもアクセスできるようにしてみたくなりました。

そこで❗

今回はMinIOVPSにインストールしてローカル環境のLaravelからファイルをアップロードしてみたいと思います。

ぜひ何かの参考になりましたら嬉しいです。😊✨

MinIO は GUI も
すばらしかったです❗

開発環境: Ubuntu 20.04、nginx 1.18、Laravel 10.x

前提として

まずVPSnginxのウェブサーバーが入っていて、ちゃんとウェブサイトが動く状態になっている必要があります。

そして、今回は以下2つのようなサブドメインでアクセスできるようにします。

  • minio-api.example.com: API 部分
  • minio-console.example.com: コンソール(GUI)部分

なので、この2つのDNS設定は先に済ませておいてください。(各サービスで設定方法が違うのでここでは省略します)

では、今回も楽しんでやっていきましょう❗

Go 言語をインストールする

MinIO をインストールする前にGo言語をインストールします。
というのも、MinIOGo言語で作られているからです。

以下のコマンドを実行してください。

sudo apt update && sudo apt upgrade
sudo apt install golang

では、念のため以下のコマンドでインストールうまくいっているかチェックしておきましょう。

go version

すると、以下のような表示になるはずです。

go version go1.13.8 linux/amd64

これでGo言語はOKです!

MinIO をインストールする

続いて、SSHVPSにログインしたらMinIOをインストールしていきましょう。

今回はバイナリバージョンをインストールします。
以下のコマンドを実行してください。

wget https://dl.min.io/server/minio/release/linux-amd64/minio
chmod +x minio
sudo mv minio /usr/local/bin/

※ ちなみに/usr/local/bin/はパスが通ってる(≒ ショートカットで実行できる)場所です。環境によって違うかもですが基本的に/usr/local/bin/で大丈夫じゃないでしょうか🤔

これでminioコマンドが使えるようになりました。
以下のコマンドでバージョンを表示してみましょう。

minio -v

すると、以下のような表示になるはずです。

minio version RELEASE.2023-10-16T04-13-43Z (commit-id=edfb310a59edb6f1b645fc456b03dfcea770e1b4)
Runtime: go1.21.3 linux/amd64
License: GNU AGPLv3 <https://www.gnu.org/licenses/agpl-3.0.html>
Copyright: 2015-2023 MinIO, Inc.

※ ちなみに、昔はApache License Version 2.0でしたが、今はAGPL-3.0 licenseになってます。

では、以下のコマンドでMinIOが起動できるか試してみましょう。

minio server ~/minio-data

これでファイルを~/minio-dataで管理するMinIOが起動し、以下のような表示になります。

確認ができたら一旦「Ctrl + C」でMinIOをストップしてください。

ちなみに、ローカルで使う場合はこれで作業は完了です。
Laravelでは以下のようにすればOKでしょう。

.env

AWS_ACCESS_KEY_ID=minioadmin
AWS_SECRET_ACCESS_KEY=minioadmin
AWS_DEFAULT_REGION=us-east-1
AWS_BUCKET=your-bucket-name
AWS_USE_PATH_STYLE_ENDPOINT=true
AWS_ENDPOINT=http://127.0.0.1:9000

でも、今回はnginxを使ってminio-api.example.comのようなサブドメインで運用したいので、作業を続けます。

なお、AWS_USE_PATH_STYLE_ENDPOINTAPIへのアクセス方法の設定でtrueの場合は「パス形式」と呼ばれるドメインのURLに下にバケット名が入ってくる形になります。

例: https://**********/bucket-name/filename

逆にfalseの場合は「バーチャルホスト型」と呼ばれ、サブドメインとしてバケット名が使用されます。

例: https://bucket-name.*********/filename

今回はシンプルにいきたいので「パス形式」で実装しています。

環境変数をセットする

続いてMinIOで使うログイン情報を作っておきます。
以下のファイルを作ってください。

/etc/default/minio

MINIO_ROOT_USER=(あなたのユーザー名)
MINIO_ROOT_PASSWORD=(あなたのパスワード)

systemd にサービスとして登録する

もちろんMinIOはコマンドでいつでも起動できますがnginxMySQLのようにサービスとして起動できると再起動のときに自動的に起動してくれたりするなど管理がしやすいです。

そこで、systemdを独自につくってサービスとして使えるようにしましょう。
以下のファイルをviコマンドなどで作成してください。

/lib/systemd/system/

[Unit]
Description=MinIO
Documentation=https://docs.min.io
Wants=network-online.target
After=network-online.target
AssertFileIsExecutable=/usr/local/bin/minio

[Service]
ExecStart=/usr/local/bin/minio server /minio-data --address ":9001" --console-address ":9002"
User=minio-user
Group=minio-user
Restart=always
EnvironmentFile=-/etc/default/minio

[Install]
WantedBy = multi-user.target

※ とても基本的な構成になっています。もしより詳細を設定したい場合は本家のブログを参考にしてみてください。

📝 参考ページ: Configuring MinIO with SystemD

なお、ExecStartの意味は以下のとおりです。

  • フォルダは、/minio-data を使ってね
  • API は 9001 番ポートだよ
  • コンソール(GUI)は 9002 番ポートだよ

また、EnvironmentFileが先ほど作成したログイン情報の入ったファイルをセットしています。

ユーザー&グループをつくる

次に、まだ「minio-user」というユーザー&グループが存在していないのでこの2つを作ります。

sudo useradd -M -r -g minio-user
sudo useradd -M -r -g minio-user minio-user

そして、systemdの設定をリロードしておきます。

sudo systemctl daemon-reload

フォルダの権限を変更する

なお、忘れてはいけないのですが、今回は/minio-dataというフォルダにファイルを保存するようになっています。

しかし、このフォルダには先ほどのユーザー(今回の場合は、minio-user)がアクセス権限をもっていないといけません。

そこで、以下のコマンドを実行してフォルダをつくり、権限をつけてあげましょう。

sudo mkdir /minio-data
sudo chown minio-user:minio-user /minio-data/

これでsystemdの設定は完了しました。
以下のコマンドでMinIOを起動してみましょう。

sudo systemctl start minio.service

そして、念のためうまく起動できているかをチェックします。

sudo systemctl status minio.service

すると、こんなカンジで表示されるはずです。

ちなみに、このままではシステムをrebootコマンドなどで再起動してしまうと、MinIOサービスは停止してしまいます。

そのため、以下のコマンドで再起動しても自動でMinIOサービスが起動できるようにしておくといいでしょう。

sudo systemctl enable minio.service

これでsystemdの作業は完了です❗

nginx から MinIO を実行できるようにする

では、以下2つのドメインからアクセスできるようにnginxの設定を追加しましょう。

  • minio-api.example.com: API 部分
  • minio-console.example.com: コンソール(GUI)部分

/etc/nginx/sites-available/default

# 以下を追加

# MinIO API
server {
    listen 80;
    server_name minio-api.(あなたのドメイン);

    location / {
        proxy_pass http://localhost:9001;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }
}

# MinIO Console
server {
    listen 80;
    server_name minio-console.(あなたのドメイン);

    location / {
        proxy_pass http://localhost:9002;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

        # To support websocket
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
    }
}

変更したら以下のコマンドでnginxを再起動してください。

sudo systemctl restart nginx

すると、セットしたドメインへアクセスすることができるようになります。

※ なお、本来はhttpsでアクセスできるようにすべきですが今回は省略します。certbotを使うと便利ですよ👍

これでMinIOのインストールは完了です。

バケットをつくる

では、http://minio-console.(あなたのドメイン)にアクセスしてログインします。

すると、画面左側にメニューがあるので「Buckets」をクリック。

すると、バケットのページに移動するので「Create Bucket」ボタンをクリック。

バケットを登録するフォームが表示されるので、適当な名前をつけて「Create Bucket」ボタンをクリックします。

※ バケット名は他の部分でも統一してください。

すると、以下のようにバケットが保存されます。

Laravel の .env に接続情報をセットする

では、.envに今回インストールしたMinIOサーバーへの接続情報をセットしておきましょう。

.env

AWS_ACCESS_KEY_ID=(あなたのユーザー名)
AWS_SECRET_ACCESS_KEY=(あなたのパスワード)
AWS_BUCKET=test-bucket
AWS_ENDPOINT=http://minio-api.********.com/(API への URL)

なお、(あなたのユーザー名)(あなたのパスワード)EnvironmentFileとして/etc/default/minioの中に保存した内容と同じです。

S3 用のパッケージをインストールする

では、最後にLaravelS3用のパッケージをインストールしましょう。
以下のコマンドを実行してください。

composer require league/flysystem-aws-s3-v3 "^3.0" --with-all-dependencies

これで全ての作業は完了です。
お疲れ様でした😊✨

テストしてみる

では実際にLaravel 10.xから今回インストールしたMinIOにファイルをアップロードしてみましょう。

まず、ルートに以下のコードを追加してください。

routes/web.php

use Illuminate\Support\Facades\Storage;

// 省略

Route::get('minio_upload', function(){

    if(! Storage::disk('s3')->put('test.txt', 'うまい肉が食いたいなぁ')) {

        dd('アップロードに失敗しました');

    }

    dd('アップロードに成功しました');

});

では、MinIOが起動していることを確認してからブラウザで「http://******/minio_upload」へアクセスします。

すると・・・・・・

はい❗
アップロードに成功しました」と表示されました。

では、実際にコンソールの方でも確認してみましょう。

どうなったでしょうか・・・・・・

はい❗
うまくアップロードできていますね。

では、念のためプレビューで中身も確認しておきましょう。

うまくいっているでしょうか・・・・・・

はい❗
ちゃんとテキストも保存されています。

すべて成功です✨😊👍

ちなみに: Storage をデバッグするには

先ほどのコードではもしアップロードのときにエラーが発生してもウンともスンとも言いません。

これは以下のようにtry ~ catchにしても同じです。

try {

    Storage::disk('s3')->put('test.txt', 'うまい肉が食いたいなぁ')

} catch (\Exception $e) {

    dd($e->getMessage());

}

もしStorageのデバッグをするには、これプラスconfig/filesystems.phpdisks.s3.throwtrueにする必要があります。

'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, // 👈 ここを true にする
],

これでエラー内容を知ることができるので開発しやすくなると思います。

企業様へのご提案

これは、S3ストレージに限らずですがawsの「ちょっと困ったところ」として従量課金なので料金が読みにくいという部分があるかと思います。

しかし、今回のMinIOを月額固定のVPSに設置すれば毎月同じ費用で運用することができます。

もしそういったご希望がございましたら、いつでもお気軽にご相談ください。
お待ちしております。😊✨

終わりに

ということで、今回はいつもとは違ってサーバー内の構築をメインにしてお届けしました。

ちなみに今回初めてsystemdを本格的に触りましたがいろいろと便利な使い方ができそうです。また機会があったらこの辺も深ぼっていこうかなってカンジです。

とにかく、MinIOいいですね。

Laravelのパッケージでも同じようなのが出てきたらもっと楽なのにな、なんて考えてました。(誰かつくって。please)

今回は以上です。

ではでは〜❗

「インボイスの事務処理、
やっぱめんどくさい!
仕事量まで負担増…😫」

開発のご依頼お待ちしております 😊✨
開発のご依頼はこちらから: お問い合わせ
どうぞよろしくお願いいたします!
このエントリーをはてなブックマークに追加       follow us in feedly  

開発効率を上げるための機材・まとめ