【MinIO】Amazon S3をローカルで使用する方法

プログラミング

はじめに

この記事では、MinIOをいうサービスを使って、Amazon S3をローカルで使用できる環境を構築します。

MinIOはS3と互換性をもつので、aws sdk を用いたアクセスや、boto3を用いたpythonによる操作が可能です。

MinIO | S3 & Kubernetes Native Object Storage for AI
MinIO's High Performance Object Storage is Open Source, Amazon S3 compatible, Kubernetes Native and is designed for cloud native workloads like AI.

この記事に記載されているソースコードは以下のGitHubから入手することができます。

GitHub - Joichiro433/Blog-minio
Contribute to Joichiro433/Blog-minio development by creating an account on GitHub.

Docker Composeを用いたMinIOの構築

MinIOは公式からDocker imageが公開されています。

Docker

こちらを用いて、docker composeによる構築をおこないます。

docker-compose.yml

使用する docker-compose.yml ファイルは下記の通りです。

minio:
    image: minio/minio:latest
    container_name: minio
    environment:
        MINIO_ROOT_USER: localid
        MINIO_ROOT_PASSWORD: localpassword
    entrypoint: bash
    command: -c "/opt/bin/minio server /export --address :9999 --console-address :9001"
    volumes:
        - ./minio_data:/export  # MinIOストレージの永続化
    ports:
        - '9000:9999'
        - '9001:9001'

dockerコンテナの起動

docker-composeコマンドを実行して、コンテナを起動します。

$ docker-compose up -d

Creating minio ... done

起動が完了すると、新しく minio_data ディレクトリが作成され、このディレクトリがそのままバケットや階層と認識されます。

例として、minio_data ディレクトリの配下に次の階層構造を作成してみましょう。

docker-compose.yml
minio_data
 └─ localbucket
     └─ image_dir
         ├─ sample_image.jpg
         └─ sample_image2.jpg

minio_data 直下に作成したディレクトリ localbucket はバケットとして認識されます。上記の階層構造を作成したら、MinIOのコンソール上で認識されているか確認してみます。

http://localhost:9001にアクセスして、MinIOのコンソールを開きます。ログイン時のIDとパスワードは、docker-compose.ymlで定義した下記となります。

ID: localid
password: localpassword

下図のようにMinIOが作成した階層構造を認識できていることがわかります。

boto3を用いた、pythonによるS3 (MinIO) の操作

MinIOはS3と互換性をもつので、S3を操作するソースコードと同じものでMinIOを利用することができます。

pythonでS3を操作するには、boto3というライブラリが必要です。boto3のインストールはpipコマンドから行うことができます。

pip install boto3

それでは、pythonを用いてMinIOを操作してみます。先ほど作成したバケットに保存されているファイルの内容を取得してみます。

import boto3


BUCKET_NAME = 'localbucket'

if __name__ == '__main__':
    s3 = boto3.resource(
        service_name='s3', 
        endpoint_url='http://localhost:9000',
        aws_access_key_id='localid',
        aws_secret_access_key='localpassword',
        region_name='')
    bucket = s3.Bucket(BUCKET_NAME)
    for obj in bucket.objects.all():
        print(obj.key)
# 出力
image_dir/sample_image.jpg
image_dir/sample_image2.jpg

このように、S3を操作のと変わりなく、MinIOを利用することができます。

タイトルとURLをコピーしました