Amazon S3は、オンラインストレージサービスの代表的な存在であり、様々なアプリケーションで利用されています。しかし、S3を利用するためには、AWSのアカウントを持っている必要や費用を気にしなければなりません。
そこで、今回はローカル環境にS3を構築する方法をまとめていきます。具体的には、MinIOというオープンソースのツールを利用して、ローカル環境にS3を構築する方法をdockerを使って説明します。
開発環境
- Docker:
v20.10.22
- Docker Compose:
v2.15.1
- MinIO:
RELEASE.2023-02-27T18-10-45Z
Docker Compose V2を使っています。
V1を使っている場合は正しく動作しない場合もありますのでご確認ください。
MinIOとは?
MinIOは、Amazon S3互換の分散オブジェクトストレージシステムです。つまりは、AWS S3と同じような機能が提供され、それらをローカル環境やクラウド環境でも利用できることが大きな特徴です。S3と同じAPIを使用するため、既存のS3クライアントやアプリケーションを容易に移行できるため、ローカル開発環境で使用されることが多い。
公式Doc:一般的なMInIOのユースケースとしては以下の通り、
- バックアップ・アーカイブ
大容量かつ高い耐久性を持つストレージシステムであるため、バックアップやアーカイブ用途に最適。企業のデータ保護戦略に組み込まれることが多い。 - クラウドネイティブなアプリケーション
クラウドネイティブなアプリケーションに最適なストレージシステムであり、S3 APIを使用するため、AWS上で開発されたアプリケーションやサービスを容易に移行可能。 - マルチクラウドストレージ
異なるクラウドプロバイダーのストレージシステムを統合することができるため、マルチクラウド環境でのデータ管理に利用される。 - IoT・ビッグデータ分析
高速かつ大容量なストレージシステムであるため、IoTセンサーデータやビッグデータ分析用途に利用される。また、オープンソースであるため、コスト削減も期待できる。 - メディア配信
高速なファイル転送とストリーミング機能を持っており、メディア配信用途にも適している。ビデオやオーディオなどの大容量ファイルを効率的に配信することが可能。
構築の流れ
docker runコマンドを使用して手軽に起動します
コンソール画面にアクセスし、基本的な操作をしてみます
docker-compose.ymlに設定を記載し、MinIOを起動します
コンテナ起動時にバケットが自動で生成するように設定を追加します
CLIからMinIOに対して操作します
構築手順
Dockerコマンドを使用してMinIOを起動
まずはDockerコマンドを使用してMinIOを起動してみます。
公式Docの通りに以下のように実行
公式Doc:https://min.io/docs/minio/container/index.html#procedure
今回はminio_sampleというプロジェクトディレクトリ内で作業をしてきますので、
まずは直下にminioに必要なディレクトリを作成します。
その後、Dockerコマンドでminio用のイメージを使用してコンテナを立ち上げます。
$ mkdir -p ${HOME}/minio_sample/minio/data
$ docker run \
-p 9000:9000 \
-p 9090:9090 \
--user $(id -u):$(id -g) \
--name minio1 \
-e "MINIO_ROOT_USER=admin123" \
-e "MINIO_ROOT_PASSWORD=admin123" \
-v ${HOME}/minio_sample/minio/data:/data \
quay.io/minio/minio server /data --console-address ":9090"
ポート番号:APIとコンソール(GUI)でそれぞれポート番号を指定
ユーザーID/パスワード:コンソールへのログインやアプリケーションからAPIへ認証する際に使用
dataディレクトリ:MinIOストレージの永続化に必要。data配下にバケット毎の階層が切られていく
Unable to find image 'quay.io/minio/minio:latest' locally
latest: Pulling from minio/minio
c7e856e03741: Pull complete
e720bea877d0: Pull complete
6ff68fb4cd26: Pull complete
2027e8bcc8ac: Pull complete
2b8010e6091d: Pull complete
03c5ac69271e: Pull complete
Digest: sha256:bc176dfcea583924ae8153851a02eed747f32ea4f2c71935cd4318dfcad8366d
Status: Downloaded newer image for quay.io/minio/minio:latest
MinIO Object Storage Server
Copyright: 2015-2023 MinIO, Inc.
License: GNU AGPLv3 <https://www.gnu.org/licenses/agpl-3.0.html>
Version: RELEASE.2023-02-27T18-10-45Z (go1.19.6 linux/amd64)
Status: 1 Online, 0 Offline.
API: http://172.17.0.2:9000 http://127.0.0.1:9000
Console: http://172.17.0.2:9090 http://127.0.0.1:9090
Documentation: https://min.io/docs/minio/linux/index.html
Warning: The standard parity is set to 0. This can lead to data loss.
正常に起動すれば上記のようなログが出力される
イメージがローカル上に存在しない場合は、自動的にDocker Hubからpullされる
docker: Error: remote trust data does not exist for quay.io/minio/minio: quay.io does not have trust data for quay.io/minio/minio.docker run
を実行した際に上記のようなエラーメッセージが出た場合は、DOCKER_CONTENT_TRUSTが有効になっているためです。(作成されたDockerイメージが第三者によって改竄されていないかを検証する機能)
そのため、export DOCKER_CONTENT_TRUST=0
を実行すればイメージのpullができるようになります。
は正常な機能となりますので、無効にする場合は自己責任でお願いします
MinIOのコンソール画面を操作
先ほど実行時に出力されていたMinIOコンソールのURLへアクセスします
http://127.0.0.1:9090
実行時に設定していたMINIO_ROOT_USER
とMINIO_ROOT_PASSWORD
をそれぞれ入力してLoginボタンを押せば、MinIOコンソールのホーム画面に遷移します。
現状、バケット等は何も作られていないため一先ず作ってみます。
sample
というバケットを作成してみました。見た感じライフサイクル設定やアクセス制限などS3と同じ設定ができるようです。
次に「Object Browser」からバケットを選択して、適当なファイルをアップロードしてみます。
とりあえずバナナの画像をアップロードしてみました。
すると、コンソール上でも確認できますが、冒頭に作成したminio/dataディレクトリの方にもファイルが追加されていることが確認できるかと思います。
MinIOのコンテナを落としたとしてもディレクトリ内の階層やファイルは消えないため、永続化できることも確認できました。
Docker Composeを使用してMinIOを起動
次にDocker Composeを利用してMinIOのコンテナを起動してみます。
まずはdocker-compose.yml
を作成して、以下のように記述していきます。
version: '3.9'
services:
minio:
image: quay.io/minio/minio:latest
container_name: s3-minio
environment:
MINIO_ROOT_USER: admin123
MINIO_ROOT_PASSWORD: admin123
command: server --console-address ":9090" /data
volumes:
- ./minio/data:/data
ports:
- 9000:9000
- 9090:9090
先ほどDockerコマンドで指定した各パラメータと基本同じになります。
下記コマンドでコンテナを起動してみます。
$ docker-compose up
[+] Running 3/3
⠿ Network minio_sample_default Created 0.0s
⠿ Container s3-minio Created 0.1s
⠿ Container minio_sample-mc-1 Created 0.1s
Attaching to minio_sample-mc-1, s3-minio
s3-minio | MinIO Object Storage Server
s3-minio | Copyright: 2015-2023 MinIO, Inc.
s3-minio | License: GNU AGPLv3 <https://www.gnu.org/licenses/agpl-3.0.html>
s3-minio | Version: RELEASE.2023-02-27T18-10-45Z (go1.19.6 linux/amd64)
s3-minio |
s3-minio | Status: 1 Online, 0 Offline.
s3-minio | API: http://172.23.0.2:9000 http://127.0.0.1:9000
s3-minio | Console: http://172.23.0.2:9090 http://127.0.0.1:9090
s3-minio |
s3-minio | Documentation: https://min.io/docs/minio/linux/index.html
s3-minio | Warning: The standard parity is set to 0. This can lead to data loss.
先ほどと同じように実行時に出力されたMinIOコンソールのURLへアクセスすると同じログイン画面が表示されるはずです。
http://127.0.0.1:9090
起動時にバケットを自動生成
MinIOを使っていく中で、コンテナ起動時にバケットを自動生成してくれると助かると思ったので、
調べてみたところいくつか方法が見つかりました。
- マウントしているディレクトリ内に直接作成
- MinIO Client(mc)を利用して作成
- shファイルを作成して、ファイル内でaws-cliを実行して作成
docker-compose.yml
内に記述して起動時に実行する想定
今回は方法②を使って説明します。
version: '3.9'
services:
minio:
image: quay.io/minio/minio:latest
# ------略------
# ------以下を追加------
mc:
image: minio/mc
depends_on:
- minio
entrypoint: >
/bin/sh -c "
/usr/bin/mc alias set s3-minio http://minio:9000 admin123 admin123;
/usr/bin/mc mb s3-minio/sample --region=ap-northeast-1;
/usr/bin/mc policy set public s3-minio/sample;
exit 0;
"
entrypoint内に実際にバケットを作成するためのコマンドを実行してきます。
以下は、各コマンドの詳細です。
- alias set:対象のminioをエイリアスとして設定するためのコマンド
- エイリアス名を
s3-minio
とし、接続先や各種キーを設定
- エイリアス名を
- mb:新しいバケットを作成するためのコマンド
s3-minio
エイリアスを使用し、バケット名をsample
として設定
- policy set:バケットにアクセスポリシーを設定するためのコマンド
- 同じく
s3-minio
エイリアスを使用し、公開アクセスポリシーを設定
- 同じく
上記設定にてコンテナを起動すると、以下のようなログが出力される。
無事にsampleバケットが生成されています。
$ docker-compose up
[+] Running 2/0
⠿ Container s3-minio Created 0.0s
⠿ Container minio_sample-mc-1 Created 0.0s
Attaching to minio_sample-mc-1, s3-minio
s3-minio | MinIO Object Storage Server
s3-minio | Copyright: 2015-2023 MinIO, Inc.
s3-minio | License: GNU AGPLv3 <https://www.gnu.org/licenses/agpl-3.0.html>
s3-minio | Version: RELEASE.2023-02-27T18-10-45Z (go1.19.6 linux/amd64)
s3-minio |
s3-minio | Status: 1 Online, 0 Offline.
s3-minio | API: http://172.23.0.2:9000 http://127.0.0.1:9000
s3-minio | Console: http://172.23.0.2:9090 http://127.0.0.1:9090
s3-minio |
s3-minio | Documentation: https://min.io/docs/minio/linux/index.html
s3-minio | Warning: The standard parity is set to 0. This can lead to data loss.
batch_sample-mc-1 | Added `s3-minio` successfully.
batch_sample-mc-1 | Bucket created successfully `s3-minio/sample`.
batch_sample-mc-1 | mc: Please use 'mc anonymous'
batch_sample-mc-1 exited with code 0
aws-cliを使用してMinIOを操作
最後にaws-cli
にて、MinIOに対しての各種操作を実際のS3と同等にできるのか試していきたいと思います。
$ aws configure --profile minio 15:14:28
AWS Access Key ID [None]: admin123
AWS Secret Access Key [None]: admin123
Default region name [None]: ap-northeast-1
Default output format [None]: json
$ export AWS_DEFAULT_PROFILE=minio
$ awsp
AWS Profile Switcher
? Choose a profile (Use arrow keys)
user1
user2
❯ minio
バケットの作成
$ aws s3 --endpoint-url http://localhost:9000 mb s3://sample1
make_bucket: sample1
$ aws s3 --endpoint-url http://localhost:9000 mb s3://sample2
make_bucket: sample2
$ aws s3 --endpoint-url http://localhost:9000 mb s3://sample3
make_bucket: sample3
バケット一覧の取得
$ aws s3 --endpoint-url http://localhost:9000 ls
2023-03-05 15:10:52 sample1
2023-03-05 15:10:54 sample2
2023-03-05 15:10:56 sample3
オブジェクトのアップロード
# バケットに対象ファイルをコピー
$ aws s3 --endpoint-url http://localhost:9000 cp ./sample.json s3://sample1/sample.json 15:20:11
upload: ./sample.json to s3://sample1/sample.json
# バケットに対象ファイルを移動
$ aws s3 --endpoint-url http://localhost:9000 mv ./sample.json s3://sample1/sample.json 15:22:49
move: ./sample.json to s3://sample1/sample.json
オブジェクトのダウンロード
$ aws s3 --endpoint-url http://localhost:9000 cp s3://sample1/sample.json ./sample_dl.json 15:25:08
download: s3://sample1/sample.json to ./sample_dl.json
さらに詳しい情報やその他のコマンドについては公式ドキュメントを参考
AWS CLI での高レベル (S3) コマンドの使用
まとめ
今回は、オープンソースのツールであるMinIOを使用して、ローカル環境にS3を構築する方法をdockerコマンドやdocker-composeを使って説明しました。S3を利用するためにAWSアカウントを作成する必要がなく、手軽に試すことができるため、開発環境での利用や、テスト環境での利用に向いているかと思います。
場合によっては、大量の請求が….なんてことも有り得るのでMinIOなどのストレージサービスを利用するのが無難かと思います。
業務でも毎回構築方法や使用方法を調べていたので、今回備忘録としてまとめられて良かったです。
少しでも皆さんのお役に立てれば幸いです。