aws S3 互換ストレージ MinIO 入門 〜 mc.exe を試しに動かしてみる

<img width="50%" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/427559/1e83c72d-be6a-a058-04d1-913fb3681535.jpeg"/>


## S3 の aws コマンドの代わりとなる mc コマンドを試す

MinIO は aws クラウドのストレージ S3 と互換性があるサービスですが aws のクラウドを使う必要はなく、自分のサーバーにインストールして簡易的な オブジェクト ストレージ（ファイル サーバー）を構築できます。

ここでは、S3 の aws コマンドの代わりとなる MinIO のクライアント mc を学習するための環境を Windows で簡単に作る方法を紹介します。たとえば、__バケットを作成する__ __aws__ __mb__ __コマンドに相当する__ __mc__ __mb__ __コマンド__ を簡単に試すことができるようになります。ほかにも、mc ls コマンドで一覧することや mc cp コマンドでアップロード・ダウンロードをすることを試すことができます。こうして試すことで オブジェクト ストレージ が何なのかのイメージが付き、Docker やサーバーに配置された MinIO の詳細の学習もスムーズになります。

MinIO のサービスは、3台のサーバーに分散配置すると堅牢で高性能になりますが、ここでは簡単に導入するため Windows のローカル 1台に配置します。クライアントも同じ Windows のローカルで動かします。

なお、この記事は MinIO の公式 https://docs.min.io/docs/minio-client-quickstart-guide.html を参考にしています。


## 手順の構造化文章

あいまいな文章はいいから厳密な手順が知りたいという方のためにまずは typrm に対応した構造化文章(YAML)で示します。一般的な文章は後の章で示します。

    設定:
        __FileName__: _a.txt
        __MinIO_Alias__: minioalias
        __BucketName__: bucket1
        __MinIO_ConsolePort__: 60277
        __MinIO_EndPoint__: http://localhost:9000
        __MinIO_AccessKey__: minioadmin
        __MinIO_SecretKey__: minioadmin
        __MinIO_Folder__: ${env:USERPROFILE}\AppData\Roaming\MinIO  #// USERPROFILE = C:\Users\____\

    MinIO サーバーをインストールします:
        minio.exe をダウンロードします:
            #ref: https://dl.min.io/server/minio/release/windows-amd64/minio.exe
        ヘルプを表示します:
            (PowerShell): |
                & ${env:USERPROFILE}\Downloads\minio
    MinIO サーバーを起動します:
        (新しい PowerShell): |
            - mkdir ${env:USERPROFILE}\AppData\Roaming\MinIO
                #template: __MinIO_Folder__
            - & ${env:USERPROFILE}\Downloads\minio server ${env:USERPROFILE}\AppData\Roaming\MinIO --console-address ":60277"
                #template: __MinIO_Folder__ --console-address ":__MinIO_ConsolePort__"
        ブラウザーで MinIO のコンソールを表示します:  #keyword: MinIO console
            URL: http://localhost:60277  #template: __MinIO_ConsolePort__
            Username: minioadmin         #template: __MinIO_AccessKey__
            Password: minioadmin         #template: __MinIO_SecretKey__
        ログを表示します:
            MinIO console >> Tools >> Logs
    MinIO クライアント mc.exe をインストールします:  #keyword: install mc MinIO
        mc.exe をダウンロードします:
            #ref: https://dl.min.io/client/mc/release/windows-amd64/mc.exe
        ヘルプを表示します:
            (PowerShell): |
                & ${env:USERPROFILE}\Downloads\mc
        公式: #ref: https://docs.min.io/minio/baremetal/reference/minio-cli/minio-mc.html
    エイリアスを新規作成します:
        (PowerShell): |
            & ${env:USERPROFILE}\Downloads\mc alias set  minioalias  http://localhost:9000  minioadmin  minioadmin
                #template: mc alias set  __MinIO_Alias__  __MinIO_EndPoint__  __MinIO_AccessKey__  __MinIO_SecretKey__
        （書式）:
            - mc alias set __Alias__  __EndPoint__
            - mc alias set __MinIO_Alias__  __EndPoint__  __AccessKey__  __SecretKey__  --api __API_Signature__
        __API_Signature__:
            --api オプションを省略した場合: S3v4
        （パスワードなどを環境変数に設定する場合）:
            export MC_HOST___Alias__=https://__AccessKey__:__SecretKey__@__EndPoint__
            #ref: https://docs.min.io/docs/minio-client-complete-guide.html >> Specify temporary host configuration through environment variable
    接続先の情報を表示します:
        (PowerShell): |
            & ${env:USERPROFILE}\Downloads\mc  admin info minioalias
                #template: mc  admin info __MinIO_Alias__
    バケットを一覧します:  #keyword: mc ls example
        (PowerShell): |
            & ${env:USERPROFILE}\Downloads\mc  ls minioalias
                #template: mc  ls __MinIO_Alias__
        （参考）インターネットにあるお試しサイト https://play.min.io/ にアクセスする場合: |
            & ${env:USERPROFILE}\Downloads\mc  ls play
    バケットを新規作成します:  #keyword: mc mb example
        (PowerShell): |
            & ${env:USERPROFILE}\Downloads\mc  mb minioalias/bucket1
            & ${env:USERPROFILE}\Downloads\mc  ls minioalias
                #template-at(-2): mc  mb __MinIO_Alias__/__BucketName__
                #template-at(-2): mc  ls __MinIO_Alias__
    ファイルをアップロードします:  #keyword: mc cp example
        (PowerShell): |
            echo a > _a.txt
                #template: __FileName__
            & ${env:USERPROFILE}\Downloads\mc  cp _a.txt  minioalias/bucket1
            & ${env:USERPROFILE}\Downloads\mc  ls minioalias/bucket1
                #template-at(-2): mc  cp __FileName__  __MinIO_Alias__/__BucketName__
                #template-at(-2): mc  ls __MinIO_Alias__/__BucketName__
            rm _a.txt
                #template: __FileName__
    終了します:
        minio.exe が実行されているシェル >> Ctrl + C
    アンインストールします:
        minio.exe や mc.exe を削除します:
            (PowerShell): |
                rm  ${env:USERPROFILE}\Downloads\minio.exe
                rm  ${env:USERPROFILE}\Downloads\mc.exe
        minio.exe が使っていたフォルダーを削除します:
            (PowerShell): |
                rm -r -fo ${env:USERPROFILE}\mc
                rm -r -fo ${env:USERPROFILE}\AppData\Roaming\MinIO


## 手順

### MinIO サーバーをインストールします

https://dl.min.io/server/minio/release/windows-amd64/minio.exe をブラウザーのアドレスバーに入力して Enter を押し、minio.exe をダウンロードします。 なお、このアドレスは、MinIO の公式 https://docs.min.io/docs/minio-client-quickstart-guide.html の Windows 用の説明に書かれているアドレスです。安全のため、ダウンロードするときは、URL のドメインが .min.io であることを確認してください。

Windows のスタートを開き、PowerShell と入力して PowerShell を開き、下記のように入力します。

    & ${env:USERPROFILE}\Downloads\minio

下記のようにヘルプが表示されればダウンロードは成功です。

    PS C:\Users\____> & ${env:USERPROFILE}\Downloads\minio
    NAME:
      minio.exe - High Performance Object Storage
    
    DESCRIPTION:
      Build high performance data infrastructure for machine learning, analytics and application data workloads with MinIO
    
    USAGE:
      minio.exe [FLAGS] COMMAND [ARGS...]
    
    COMMANDS:
      server   start object storage server
      gateway  start object storage gateway
    
    FLAGS:
      --certs-dir value, -S value  path to certs directory (default: "C:\\Users\\ts-ne\\.minio\\certs")
      --quiet                      disable startup information
      --anonymous                  hide sensitive information from logging
      --json                       output server logs and startup information in json format
      --help, -h                   show help
      --version, -v                print the version
    
    VERSION:
      RELEASE.2022-01-08T03-11-54Z


### MinIO サーバーを起動します

新しい PowerShell を開き、下記のように入力します。Windows Defender によるセキュリティの確認が表示されたら、許可してください。

    mkdir ${env:USERPROFILE}\AppData\Roaming\MinIO
    & ${env:USERPROFILE}\Downloads\minio server ${env:USERPROFILE}\AppData\Roaming\MinIO --console-address ":60277"

下記のように表示されればサーバーの起動は成功です。

    PS C:\Users\____> & ${env:USERPROFILE}\Downloads\minio server ${env:USERPROFILE}\AppData\Roaming\MinIO --console-address ":60277"
    API: http://192.168.2.110:9000  http://127.0.0.1:9000
    RootUser: minioadmin
    RootPass: minioadmin
    
    Console: http://192.168.2.110:60277 http://127.0.0.1:60277
    RootUser: minioadmin
    RootPass: minioadmin
    
    Command-line: https://docs.min.io/docs/minio-client-quickstart-guide
       $ mc.exe alias set myminio http://192.168.2.110:9000 minioadmin minioadmin
    
    Documentation: https://docs.min.io
    WARNING: Detected default credentials 'minioadmin:minioadmin', we recommend that you change these values with 'MINIO_ROOT_USER' and     'MINIO_ROOT_PASSWORD' environment variables


### ブラウザーで MinIO のコンソールを表示します

ブラウザーで http://localhost:60277 を開きます。

<img width="50%" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/427559/153bbf15-a6e0-02f8-f5c3-52aeddb678c0.jpeg"/>

Username にはサーバー起動時に表示される RootUser、つまり minioadmin を入力します。

Password にはサーバー起動時に表示される RootPass、つまり minioadmin を入力します。

ログインしたらダッシュボードが表示されます。

<img width="50%" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/427559/db604658-3f33-1e73-b34d-e9d226f29b47.jpeg"/>

Tools メニューの Logs を選ぶと、ログが表示されます。

<img width="50%" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/427559/c1895fc3-bcca-6045-5bd1-945833bbcc7d.jpeg"/>


### MinIO クライアント mc.exe をインストールします

https://dl.min.io/client/mc/release/windows-amd64/mc.exe をブラウザーのアドレスバーに入力して Enter を押し、minio.exe をダウンロードします。なお、このアドレスは、MinIO の公式 https://docs.min.io/docs/minio-client-quickstart-guide.html の Windows 用の説明に書かれているアドレスです。安全のため、ダウンロードするときは、URL のドメインが .min.io であることを確認してください。

PowerShell で下記のように入力します。

    & ${env:USERPROFILE}\Downloads\mc

下記のようにヘルプが表示されればダウンロードは成功です。

    PS C:\Users\____> & ${env:USERPROFILE}\Downloads\mc
    mc.exe: Configuration written to `C:\Users\____\mc\config.json`. Please update your access credentials.
    mc.exe: Successfully created `C:\Users\____\mc\share`.
    mc.exe: Initialized share uploads `C:\Users\____\mc\share\uploads.json` file.
    mc.exe: Initialized share downloads `C:\Users\____\mc\share\downloads.json` file.
    NAME:
      mc - MinIO Client for cloud storage and filesystems.
    
    USAGE:
      mc [FLAGS] COMMAND [COMMAND FLAGS | -h] [ARGUMENTS...]
    
    COMMANDS:
      alias      set, remove and list aliases in configuration file
      ls         list buckets and objects
      mb         make a bucket
      rb         remove a bucket
      cp         copy objects
      mirror     synchronize object(s) to a remote site
      cat        display object contents
      head       display first 'n' lines of an object
      pipe       stream STDIN to an object
      share      generate URL for temporary access to an object
      find       search for objects
      sql        run sql queries on objects
      stat       show object metadata
      mv         move objects
      tree       list buckets and objects in a tree format
      du         summarize disk usage recursively
      retention  set retention for object(s)
      legalhold  manage legal hold for object(s)
      diff       list differences in object name, size, and date between two buckets
      rm         remove object(s)
      version    manage bucket versioning
      ilm        manage bucket lifecycle
      encrypt    manage bucket encryption config
      event      manage object notifications
      watch      listen for object notification events
      undo       undo PUT/DELETE operations
      anonymous  manage anonymous access to buckets and objects
      tag        manage tags for bucket and object(s)
      replicate  configure server side bucket replication
      admin      manage MinIO servers
      update     update mc to latest release
    
    GLOBAL FLAGS:
      --autocompletion              install auto-completion for your shell
      --config-dir value, -C value  path to configuration folder (default: "C:\\Users\\____\\mc")
      --quiet, -q                   disable progress bar display
      --no-color                    disable color theme
      --json                        enable JSON lines formatted output
      --debug                       enable debug output
      --insecure                    disable SSL certificate verification
      --help, -h                    show help
      --version, -v                 print the version
    
    TIP:
      Use 'mc --autocompletion' to enable shell autocompletion
    
    VERSION:
      RELEASE.2022-01-07T06-01-38Z


### エイリアスを新規作成します

エイリアスとは、特定の MinIO サーバーにログインするための情報と関連づけられた MinIO の変数です。MinIO サービスの名前に相当します。mc コマンドから操作対象の MinIO サービスを指定するときにエイリアスを指定します。

PowerShell で下記のように入力します。minioalias という名前でエイリアスを設定しています。

    & ${env:USERPROFILE}\Downloads\mc alias set  minioalias  http://localhost:9000  minioadmin  minioadmin

パラメーターの意味は下記の通りです。

    mc alias set  __MinIO_Alias__  __MinIO_EndPoint__  __MinIO_AccessKey__  __MinIO_SecretKey__


### 接続先の情報を表示します

接続先がどこにあるのか、接続先が生きているのかを確認します。

PowerShell で下記のように入力します。minioalias の部分は表示対象のエイリアスです。

    & ${env:USERPROFILE}\Downloads\mc  admin info minioalias

たとえば下記のように表示されます。

    PS C:\Users\____> & ${env:USERPROFILE}\Downloads\mc  admin info minioalias
    ●  localhost:9000
       Uptime: 38 minutes
       Version: 2022-01-08T03:11:54Z
       Network: 1/1 OK


### バケットを新規作成して一覧します

バケットを新規作成するには、PowerShell で下記のように入力します。

    & ${env:USERPROFILE}\Downloads\mc  mb minioalias/bucket1

バケットを一覧するには、PowerShell で下記のように入力します。

    & ${env:USERPROFILE}\Downloads\mc  ls minioalias

たとえば下記のように表示されます。

    PS C:\Users\____> & ${env:USERPROFILE}\Downloads\mc  mb minioalias/bucket1
    Bucket created successfully `minioalias/bucket1`.
    PS C:\Users\____> & ${env:USERPROFILE}\Downloads\mc  ls minioalias
    [2022-01-09 22:43:56 JST]     0B bucket1/


### ファイルをアップロードします

PowerShell で下記のように入力します。

    echo a > _a.txt  #// アップロードするファイルを用意します
    & ${env:USERPROFILE}\Downloads\mc  cp _a.txt  minioalias/bucket1
    rm _a.txt  #// アップロードしたのでローカルのファイルを削除します
    & ${env:USERPROFILE}\Downloads\mc  ls minioalias/bucket1

たとえば下記のように表示されます。

    PS C:\Users\____> & ${env:USERPROFILE}\Downloads\mc  mb minioalias/bucket1
    Bucket created successfully `minioalias/bucket1`.
    PS C:\Users\____> & ${env:USERPROFILE}\Downloads\mc  ls minioalias
    [2022-01-09 22:43:56 JST]     0B bucket1/
    PS C:\Users\____> echo a > _a.txt  #// アップロードするファイルを用意します
    PS C:\Users\____> & ${env:USERPROFILE}\Downloads\mc  cp _a.txt  minioalias/bucket1
    _a.txt:               8 B / 8 B [==========================================================================] 843 B/s 0s
    PS C:\Users\____> rm _a.txt  #// アップロードしたのでローカルのファイルを削除します
    PS C:\Users\____> & ${env:USERPROFILE}\Downloads\mc  ls minioalias/bucket1
    [2022-01-09 22:46:52 JST]     8B _a.txt

MinIO コンソールには下記のように表示されます。

<img width="50%" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/427559/85266ed2-68b5-89f2-898d-963af37f730b.jpeg"/>

Browse ボタン（右上）を押すと、バケットの中のオブジェクト（ファイル）の一覧を表示できます。

<img width="50%" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/427559/1e83c72d-be6a-a058-04d1-913fb3681535.jpeg"/>


## コマンドのドキュメント

コマンドの公式ドキュメントは下記にあります。下記のリンク先の 7. Commands に一覧があります。

https://docs.min.io/docs/minio-client-complete-guide.html


## 終了とアンインストール

### MinIO サービスを終了します

minio.exe が実行されているシェルで Ctrl + C を押します。

### MinIO や mc をアンインストールします

PowerShell で下記のように入力します。

    rm  ${env:USERPROFILE}\Downloads\minio.exe
    rm  ${env:USERPROFILE}\Downloads\mc.exe

### minio.exe が使っていたフォルダーを削除します:

PowerShell で下記のように入力します。

    rm -r -fo ${env:USERPROFILE}\mc
    rm -r -fo ${env:USERPROFILE}\AppData\Roaming\MinIO