背景
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は使いにくいかもしれないと思いました。
client.pyimport 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) を見てみる。
