よしたく blog

ITエンジニアとして自分が知らなかったことをまとめています

MinIOをboto3を使ってPythonから操作する

Python で S3 を操作するときに使う、AWS SDK for Python(boto3) を使って MinIO も操作できる。 以前作った環境を利用し、Python から操作できるか確認する。

yoshitaku-jp.hatenablog.com

準備

インストール

pip で boto3 をインストールしておく。

pip install boto3

コピー元ファイルの配置

ファイルアップロード機能を確認する際、minio から minio へファイルをコピーするような形で実現する。 今回はsystem-drummondバケットを作成し、test.mdファイルを作成して配置しておいた。

接続情報の確認

接続は client を使い、接続のための情報を設定する。

  • endpoint_url
    • 起動している Docker を指定
  • aws_access_key_id
    • ユーザ ID
    • 前回記事の Docker よりminioを設定
  • aws_secret_access_key
    • パスワード
    • 前回記事の Docker よりminiominiominioを設定
s3 = boto3.client(
    "s3",
    endpoint_url="http://127.0.0.1:9000",
    aws_access_key_id="minio",
    aws_secret_access_key="miniominiominio",
)

バケットの作成

import boto3

s3 = boto3.client(
    "s3",
    endpoint_url="http://127.0.0.1:9000",
    aws_access_key_id="minio",
    aws_secret_access_key="miniominiominio",
)
response = s3.list_buckets()
print(response["Buckets"])

s3.create_bucket(Bucket="from-boto")

response = s3.list_buckets()
print(response["Buckets"])
[{'Name': 'system-drummond', 'CreationDate': datetime.datetime(2022, 4, 29, 2, 4, 53, 547000, tzinfo=tzutc())}]
[{'Name': 'from-boto', 'CreationDate': datetime.datetime(2022, 4, 29, 2, 49, 46, 32000, tzinfo=tzutc())}, {'Name': 'system-drummond', 'CreationDate': datetime.datetime(2022, 4, 29, 2, 4, 53, 547000, tzinfo=tzutc())}]

まず初期状態をs3.list_buckets()で確認すると、準備で作成したsystem-drummondが存在していることがわかる。 s3.create_bucket(Bucket="from-boto")from-botoバケットを作成し、再度s3.list_buckets()で確認するとfrom-botoバケットが作成されていることが確認できる。

ファイルアップロード

import boto3

s3 = boto3.client(
    "s3",
    endpoint_url="http://127.0.0.1:9000",
    aws_access_key_id="minio",
    aws_secret_access_key="miniominiominio",
)

object_list = s3.list_objects(Bucket="from-boto").get("Contents")
print(object_list)

s3.upload_file("./minio/data/system-drummond/test.md", "from-boto", "test.md")

object_list = s3.list_objects(Bucket="from-boto").get("Contents")
print(object_list)
None
[{'Key': 'test.md', 'LastModified': datetime.datetime(2022, 4, 29, 3, 4, 45, 30000, tzinfo=tzutc()), 'ETag': '"2debfdcf79f03e4a65a667d21ef9de14"', 'Size': 5, 'StorageClass': 'STANDARD', 'Owner': {'DisplayName': 'minio', 'ID': '02d6176db174dc93cb1b899f7c6078f08654445fe8cf1b6ce98d8855f66bdbf4'}}]

こちらも、まずは初期状態を確認する。 from-botos3.list_objects(Bucket="from-boto").get("Contents")で確認すると、Noneであることがわかる。 「コピー元ファイルの配置」で配置したtest.mdを、s3.upload_file("./minio/data/system-drummond/test.md", "from-boto", "test.md")でアップロード処理する。 再びs3.list_objects(Bucket="from-boto").get("Contents")で見ると、test.mdが追加されていることがわかる。

バケットの削除

import boto3

s3 = boto3.client(
    "s3",
    endpoint_url="http://127.0.0.1:9000",
    aws_access_key_id="minio",
    aws_secret_access_key="miniominiominio",
)
response = s3.list_buckets()
print(response["Buckets"])

s3.delete_object(Bucket="from-boto", Key="test.md")
s3.delete_bucket(Bucket="from-boto")

response = s3.list_buckets()
print(response["Buckets"])
[{'Name': 'from-boto', 'CreationDate': datetime.datetime(2022, 4, 29, 2, 49, 46, 32000, tzinfo=tzutc())}, {'Name': 'system-drummond', 'CreationDate': datetime.datetime(2022, 4, 29, 2, 4, 53, 547000, tzinfo=tzutc())}]
[{'Name': 'system-drummond', 'CreationDate': datetime.datetime(2022, 4, 29, 2, 4, 53, 547000, tzinfo=tzutc())}]

from-botosystem-drummondが取得できる。 s3.delete_object(Bucket="from-boto", Key="test.md")でオブジェクトの中身のtest.mdを削除、その直後にs3.delete_bucket(Bucket="from-boto")from-botoバケットを削除している。 無事に削除できているので、最終的に表示されるのはsystem-drummondバケットだけになっている。

まとめ

Python から MinIO を触り、オブジェクト操作をおこなってみた。 S3 同様にcreate_bucketupload_filedelete_objectといった標準的な部分を使えることが確認できた。