ローカルの[[S3]]エミュレートとして[[LocalStack]]を使わずに[[MinIO]]を使ってみた。
## 理由
最近の情報を調べると、[[MinIO]]の方が手軽で使いやすいという情報を得たため。たしかに[[LocalStack]]は少しハマリどころがある気がする。
## 環境作成
<div class="link-card">
<div class="link-card-header">
<img src="https://min.io/docs/minio/container/_static/favicon.png" class="link-card-site-icon"/>
<span class="link-card-site-name">min.io</span>
</div>
<div class="link-card-body">
<div class="link-card-content">
<p class="link-card-title">MinIO Object Storage for Container — MinIO Object Storage for Container</p>
</div>
</div>
<a href="https://min.io/docs/minio/container/index.html"></a>
</div>
`docker-compose.yml`
```yaml
version: "3"
services:
minio:
image: quay.io/minio/minio
ports:
- 9000:9000
- 9001:9001
environment:
MINIO_ROOT_USER: user
MINIO_ROOT_PASSWORD: password
command: server /data --console-address ":9001"
```
起動する。
```console
docker compose up -d
```
## 動作確認
`localhost:9000` にアクセスしてトップページが表示されればOK。ユーザー名とパスワードに環境変数で設定した値を指定してログインする。
![[2024-12-24-22-43-58.avif]]
Object Browseが表示されればOK。
## AWS CLIのセットアップ
`minio` という名前の[[プロファイル]]を作成する。
```console
$ aws configure --profile minio
AWS Access Key ID [None]: user
AWS Secret Access Key [None]: password
Default region name [None]: ap-northeast-1
Default output format [None]: json
```
`~/.aws/config` に `endpoint_url` を追加する。
```toml
[profile minio]
region = ap-northeast-1
output = json
endpoint_url = http://localhost:9000
```
## バケットの作成
[[AWS CLI]]で `profile` に `minio` を指定する。
```console
$ aws s3 mb s3://sample-bucket --profile minio
make_bucket: sample-bucket
```
[[MinIO]]のObject Browserにバケットが出現する。
![[Pasted image 20241224225153.png]]
## バケットにオブジェクトを登録
```console
$ echo '{"id": 1}' > sample.json
$ aws s3 cp sample.json s3://sample-bucket/ --profile minio
upload: ./sample.json to s3://sample-bucket/sample.json
```
[[MinIO]]のObject Browserに `sample.json` が登録されていればOK。
![[Pasted image 20241224225339.png]]
## バケットからオブジェクトを取得
直接標準出力に表示するコマンドは以下。
```console
$ aws s3 cp s3://sample-bucket/sample.json - --profile minio
{"id": 1}
```
ファイルにダウンロードしたい場合。
```console
$ aws s3 cp s3://sample-bucket/sample.json download.json --profile minio
download: s3://sample-bucket/sample.json to ./download.json
```
## Publicなバケットをつくる
APIでバケットの結果を取得したいと思ったが、認証回りが面倒なことに気づいた。また、目的はローカル環境でのテスト用S3であるため、認証は必要ない。
### MinIOコンテナの生成方法変更 & 生成後にmcコマンド実行
`docker-compose.yml`
```yaml
version: "3"
services:
minio:
image: quay.io/minio/minio:latest
ports:
- 9000:9000
- 9001:9001
environment:
MINIO_ROOT_USER: user
MINIO_ROOT_PASSWORD: password
command: server /data --console-address ":9001"
mc:
image: minio/mc:latest
depends_on:
- minio
environment:
MINIO_ROOT_USER: user
MINIO_ROOT_PASSWORD: password
entrypoint: >
/bin/sh -c "
until (echo > /dev/tcp/minio/9000) >/dev/null 2>&1; do
echo 'Waiting for MinIO to be ready...';
sleep 1;
done;
mc alias set myminio http://minio:9000 user password;
mc mb myminio/sample-bucket;
mc anonymous set public myminio/sample-bucket;
"
```
これで `sample-bucket` は public なバケットになった。
### 動作確認
今一度 `sample.json` をバケットにpush。
```console
$ aws s3 cp sample.json s3://sample-bucket/ --profile minio
upload: ./sample.json to s3://sample-bucket/sample.json
```
[[curl]]でアクセスしてみる。
```console
$ curl "http://localhost:9000/sample-bucket/sample.json"
{"id": 1}
```
認証なしでバケットからデータを取得できた。[[HTTP]]なので[[Bruno]]のテストなどでも利用できそう。