[Python] S3互換オブジェクトストレージMinIOにファイルをアップロードする

背景

Amazon S3互換のストレージを扱うアプリケーションの開発をしているときにローカルで動作確認したくなりました。Dockerで起動できて便利なので、MinIOを試してみます。

MinIOではPython SDKが提供されていますが、今回はAWS SDK for Python (Boto3)を使ってクライアントアプリケーションを作成します。

MinIOサーバの起動

docker run -p 9000:9000 \
    -e MINIO_ACCESS_KEY=hoge \
    -e MINIO_SECRET_KEY=fugafuga \
    minio/minio server /data

アップロードするスクリプト

画像ファイルをアップロードする簡単なスクリプトです。

クラスが動的に生成されていて、IDEの補完が効かなくてboto3は使いにくいかもしれないと思いました。

import logging

import boto3
from botocore.exceptions import ClientError

logging.basicConfig(level=logging.INFO)


def main():
    endpoint_url = 'http://127.0.0.1:9000'
    access_key_id = 'hoge'
    secret_access_key = 'fugafuga'

    s3 = boto3.resource(
        service_name='s3',
        endpoint_url=endpoint_url,
        aws_access_key_id=access_key_id,
        aws_secret_access_key=secret_access_key)
    try:
        # バケットを作成する
        bucket = s3.create_bucket(Bucket='images')
        logging.info(f'Bucket "images" was created.')
    except ClientError as e:
        if e.response['Error']['Code'] in (
                'BucketAlreadyExists', 'BucketAlreadyOwnedByYou'):
            logging.info(f'Bucket "images" already exists.')
            bucket = s3.Bucket('images')
        else:
            logging.exception('Unknown exception.')
            raise

    # 画像をアップロードする
    for filename in ('cat01.png', 'cat02.png'):
        bucket.upload_file(f'images/{filename}', filename)
        logging.info(f'Object "{filename}" was uploaded to bucket "images".')

    # 確認
    for obj in bucket.objects.filter():
        logging.info(f'Object "{obj.key}" exists in bucket "{obj.bucket_name}".')


if __name__ == '__main__':
    main()

スクリプト実行

boto3をインストールするだけで実行できるようになります。

MinIOのWeb UI (http://127.0.0.1:9000) を見てみる。

参考

コメントする