S3 と同等の機能を持つ MinIOの使用方法 docker-compose を使用

## 概要

諸所諸々の事情(契約の問題や予算など)でAWSのサービスが使えない状況でも開発するためにdockerで使えるようにしてみました。
タイトルはMinIOですがほかにDynamoDB,MySQLも使えるようにしてあります。

## 事前準備

* dockerをまず導入します。windows Homeの場合は **Docker Quickstart Terminal** を使います。
* アプリの方はPythonを使っているため pythonのインストール(記事作成時は3.7です)。
    * JupyterNotebookなどでも可能です。
* boto3

## docker-compose

* 今回は `docker-compose` で起動させるためymlを作成します。
    * [公式](https://docs.min.io/docs/deploy-minio-on-docker-compose.html)を参考に作成します。
    * そのままでは`Invalid command line arguments: use path style endpoint for FS setup.`のエラーになってしまったので[こちら](https://github.com/minio/minio/issues/6803)を参考に修正しました。
    * あくまで開発用のため1つだけにしていますが本来は４つnodeを使うようです。
* MinIO以外にMySQLとDynamoDBも使えるようにしています。
* 最終的なファイルは以下になります。

* docker-compose.yml

```yml
version: '3.7'
services:
  dynamodb-local:
    build: ./dynamodb
    volumes:
      - dynamodb_data:/home/dynamodblocal/data
    ports:
      - 8000:8000
    command: -jar DynamoDBLocal.jar -dbPath ./data
  mysql:
    image: mysql:5.7
    command: mysqld --character-set-server=utf8 --collation-server=utf8_unicode_ci
    volumes:
      - db_data:/var/lib/mysql
    restart: always
    environment:
      MYSQL_ROOT_PASSWORD: 'password'
    ports:
      - 3306:3306
  minio1:
    image: minio/minio:RELEASE.2020-08-27T05-16-20Z
    volumes:
      - data1-1:/data1
      - data1-2:/data2
    ports:
      - "9000:9000"
    environment:
      MINIO_ACCESS_KEY: minio
      MINIO_SECRET_KEY: minio123
    command: server data1
    healthcheck:
      test: ["CMD", "curl", "-f", "http://localhost:9000/minio/health/live"]
      interval: 30s
      timeout: 20s
      retries: 3
volumes:
  dynamodb_data:
  db_data: {}
  data1-1:
  data1-2:
```

* DynamoDBのDockerファイル

```docker
FROM amazon/dynamodb-local

WORKDIR /home/dynamodblocal

# UID=1000 → DynamoDB Local の実行ユーザ
RUN mkdir data && chown -R 1000 data
```

* 起動すると以下のようにエンドポイントが表示されているのでメモ等取っておきます。
    * **Docker Quickstart Terminal** の場合はIPアドレスの部分をdocker 起動時に表示されるIPに読み替えてください。

```
minio1_1          | Endpoint:  http://172.20.0.4:9000  http://127.0.0.1:9000
minio1_1          |
minio1_1          | Browser Access:
minio1_1          |    http://172.20.0.4:9000  http://127.0.0.1:9000
```
* `http://192.168.99.100:9000/minio/` (Docker Quickstart Terminal のためIPアドレスが違っています)にアクセスすることでブラウザ上でバケットの中などの確認や作成などを行うことができます。



## S3機能の実装

* bucketの作成～ファイルアップロードまでのソースは以下のようになります。
* S3にアップロードする際のディレクトリ構成を `os.path.join` で作成すると `\\`で接続されてしまうのでreplaceで変換しています。


```python
import boto3
import os
from datetime import datetime

endpoint_url = os.getenv('S3_ENDPOINT', 'http://192.168.99.100:9000/')
aws_access_key_id = os.getenv('S3_ACCESS_KEY_ID', 'minio')
aws_secret_access_key_id = os.getenv('S3_SECRET_ACCESS_KEY_ID', 'minio123')

s3 = boto3.resource(
    's3',
    aws_access_key_id=aws_access_key_id,
    aws_secret_access_key=aws_secret_access_key_id,
    endpoint_url=endpoint_url
)

bucket=s3.Bucket('testbukcet')
bucket.create()
bucketPath=os.path.join('dir',datetime.now().strftime('%Y%m%d%H%M%S'),'out','test.csv')
filePath=bucketPath.replace('\\','/')
bucket.upload_file('test.csv',filePath)

```

* ブラウザで確認すると以下のように確認できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/657697/25b775db-0590-80a5-45e7-4909f700a5c0.png)