MiniOコンテナ起動時にバケットを作成するようにdocker-compose.ymlに記載する（匿名ユーザーに対するアクセスポリシーの設定）

## 概要

- MiniOコンテナを自動作成するスクリプトを簡単に紹介する。

## 方法

- 下記のようなスクリプトを実行することでコンテナの作成とバケットのポリシーの設定をする事ができる。

    ```shell
    until (/usr/bin/mc config host add myminio http://minio:ポート数 ルートユーザー名 ルートユーザーパスワード) do echo '...waiting...' && sleep 1; done;
    /usr/bin/mc mb myminio/作成したいバケット名;
    /usr/bin/mc anonymous set 未認証者のバケットアクセスポリシー myminio/作成したいバケット名;
    ```

- docker-compose.ymlの記載は下記のようになる。

    ```docker-compose.yml
    minio:
      build:
        context: ./.docker/minio
        dockerfile: Dockerfile
      volumes:
        - "./minio/data:/data:delegated"
      ports:
        - ${MINIO_API_HOST_PORT}:${MINIO_API_CONTAINER_PORT}
        - ${MINIO_CONSOLE_HOST_PORT}:${MINIO_CONSOLE_CONTAINER_PORT}
      environment:
        - MINIO_ROOT_USER=${MINIO_ROOT_USER}
        - MINIO_ROOT_PASSWORD=${MINIO_ROOT_PASSWORD}
        - MINIO_SERVER_ADDRESS=${MINIO_SERVER_ADDRESS}
        - MINIO_BUCKET_NAME=${MINIO_BUCKET_NAME}
      command: server /data --console-address :${MINIO_CONSOLE_HOST_PORT}
    createbuckets:
      image: minio/mc
      depends_on:
        - minio
      environment:
        - MINIO_API_CONTAINER_PORT=${MINIO_API_CONTAINER_PORT}
        - MINIO_ROOT_USER=${MINIO_ROOT_USER}
        - MINIO_ROOT_PASSWORD=${MINIO_ROOT_PASSWORD}
        - MINIO_SERVER_ADDRESS=${MINIO_SERVER_ADDRESS}
        - MINIO_BUCKET_NAME=${MINIO_BUCKET_NAME}
      entrypoint: >
        /bin/sh -c "
        until (/usr/bin/mc config host add myminio http://minio:$$MINIO_API_CONTAINER_PORT $$MINIO_ROOT_USER $$MINIO_ROOT_PASSWORD) do echo '...waiting...' && sleep 1; done;
        /usr/bin/mc mb myminio/$$MINIO_BUCKET_NAME;
        /usr/bin/mc anonymous set none myminio/$$MINIO_BUCKET_NAME;
        exit 0;
        "
    ```

- docker-compose.ymlと同階層に.envを定義して下記の様に記載した。（一部値は都合上マスクする。）

    ```.env
    # minio
    MINIO_API_HOST_PORT=9000
    MINIO_API_CONTAINER_PORT=9000
    MINIO_CONSOLE_HOST_PORT=9001
    MINIO_CONSOLE_CONTAINER_PORT=9001
    MINIO_ROOT_USER=root_user
    MINIO_ROOT_PASSWORD=XXXXXXXXXXXX
    MINIO_BUCKET_NAME=hoge
    MINIO_SERVER_ADDRESS=http://localhost:9000
    ```

- すでに既存設定でバケットが作られている場合は`rm -rf ./minio/data/*`を実行し、MiniOの永続化データを削除する。
- 下記コマンドを実行し、docker-compose.ymlに記載したスクリプトを実行する。

    ```
    docker-compose up -d
    ```

## バケットポリシーについて

- バケットポリシーはスクリプトの下記の部分で設定している。

    ```
    /usr/bin/mc anonymous set none myminio/$$MINIO_BUCKET_NAME;
    ```

- 上記の`none`がポリシーの指定に当たる。
- このポリシーは「未認証者」に対するポリシーである。
- ポリシーは下記の種類がある。
    - none: S3でいうとPrivateバケット（ただし、「未認証者」たる匿名ユーザー向けのポリシー設定なため、純粋なPrivateバケットの設定とは異なるかもしれない。）
    - download: ダウンロードのみ許可
    - upload: アップロードのみ許可
    - public: S3でいうとPublicバケット
- 参考程度にそれぞれのポリシーを割り当ててバケットを作成したときのMiniO上の見た目を下記にまとめる。
    - none: S3でいうとPrivateバケット `/usr/bin/mc anonymous set none myminio/$$MINIO_BUCKET_NAME;`でバケット作成
        - AccessはR/Wと表示される。

            ![MinIO_Console.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306417/916be8b6-d383-6f5e-37dd-3fd38367071c.png)

        - バケット詳細に入るとAccessが「Private」になっている。Access Policyが「n/a」になっているが、どうやらn/aで問題ないらしい。（匿名ユーザーに対するアクセスポリシーを設定しており、バケット全体のポリシー設定ではない。Access Policyはバケット全体のポリシーを表しているらしい、したがってn/aでも問題なく設定はできている模様。逆にどうやったらコマンドでバケット全体のポリシーを設定する事ができるんだ？）

            ![MinIO_Console.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306417/ab632ce0-e51b-7526-8e69-aa7be2c47eda.png)

    - download: ダウンロードのみ許可`/usr/bin/mc anonymous set download myminio/$$MINIO_BUCKET_NAME;`でバケット作成
        - AccessはR/Wと表示される。

            ![MinIO_Console.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306417/916be8b6-d383-6f5e-37dd-3fd38367071c.png)

        - Access Policyが「custom」になりJSONが記載されていた。

            ![MinIO_Console.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306417/91b8a8b8-f5d4-ad8a-78c5-27c3a041054e.png)
            ![MinIO_Console.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306417/293c8737-0b3a-3890-bbb8-f6b4bbfea743.png)


    - upload: アップロードのみ許可 `/usr/bin/mc anonymous set upload myminio/$$MINIO_BUCKET_NAME;`でバケット作成
        - AccessはR/Wと表示される。

            ![MinIO_Console.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306417/916be8b6-d383-6f5e-37dd-3fd38367071c.png)

        - Access Policyが「custom」になりJSONが記載されていた。

            ![MinIO_Console.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306417/91b8a8b8-f5d4-ad8a-78c5-27c3a041054e.png)
        
    - public: S3でいうとPublicバケット `/usr/bin/mc anonymous set public myminio/$$MINIO_BUCKET_NAME;`でバケット作成
        - AccessはR/Wと表示される。

            ![MinIO_Console.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306417/862c43a1-52d8-7ff6-89d2-71989cb10ef8.png)

        - バケット詳細だとAccessは「Public」と表示される。Access Policyは「public」と表示される。

            ![MinIO_Console.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306417/d0fa4b23-372e-7095-8e82-ab390e0b905b.png)


## おまけ

- `docker-compose up -b`を実行してもエラーも出ず、コンテナも作られない場合、下記の様にログをターミナルで見ることでなにかつかめるかもしれない。

https://qiita.com/miriwo/items/3b002304c2e26345eb04

- 自分の環境でいうとログを見るコマンドは下記になる。

    ```
    docker-compose logs createbuckets
    ```

## 参考文献

https://min.io/docs/minio/linux/reference/minio-mc/mc-anonymous-set.html#mc.anonymous.set.PERMISSION

https://min.io/docs/minio/linux/reference/minio-mc/mc-anonymous-set.html

https://go-tech.blog/aws/s3-minio/

https://ymmooot.dev/articles/17