ローカルの[[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]]のテストなどでも利用できそう。