概要
諸所諸々の事情(契約の問題や予算など)でAWSのサービスが使えない状況でも開発するためにdockerで使えるようにしてみました。
タイトルはMinIOですがほかにDynamoDB,MySQLも使えるようにしてあります。
事前準備
- dockerをまず導入します。windows Homeの場合は Docker Quickstart Terminal を使います。
- アプリの方はPythonを使っているため pythonのインストール(記事作成時は3.7です)。
- JupyterNotebookなどでも可能です。
- boto3
docker-compose
-
今回は
docker-compose
で起動させるためymlを作成します。 -
MinIO以外にMySQLとDynamoDBも使えるようにしています。
-
最終的なファイルは以下になります。
-
docker-compose.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ファイル
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で変換しています。
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)