背景
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) を見てみる。