MinIO を Python から操作してみる

Jul 18, 2024, 9:14 AM
前回の記事「Kubernetes に MinIO をインストールする」でインストールした、MinIO を python から操作してみます。

MinIOライブラリインストール

まずは、MinIO 専用のライブラリを使用して操作します。
後述の boto3 よりも便利な機能が多いので、S3 との互換性を求めない場合は、こちらを使ったほうが良いかもしれません。
pip install minio

予め、Access Key をウェブUIから作っておきます。
access_key: 1s0F82C9MS4TRTegI0xf
secret_key: KBCqA1rAzC2vPqTNW8wcy7gsHShdi8eKT56YdMnY

ファイルアップロード

echo "This is test file" >> /tmp/test-file.txt

from minio import Minio
from minio.error import S3Error

def main():
# 接続
client = Minio("192.168.7.38:9000",
access_key="2ztCLhL6RZSO2K2Pvx5m",
secret_key="qF9V0fS5g2egxxHYbOEBU0dMH7lLVfeuO9juSIpp",
secure=False
)
# バケットを作る
# https://min.io/docs/minio/linux/developers/python/API.html#make_bucket
bucket_name = "test-bucket"
found = client.bucket_exists(bucket_name)
if not found:
client.make_bucket(bucket_name)
print("Created bucket", bucket_name)
else:
print("Bucket", bucket_name, "already exists")

# バケット一覧取得
# https://min.io/docs/minio/linux/developers/python/API.html#list_buckets
buckets = client.list_buckets()
for bucket in buckets:
print(bucket.name, bucket.creation_date)

# ファイルアップロード
# https://min.io/docs/minio/linux/developers/python/API.html#fput_object
source_file = "/tmp/test-file.txt"
destination_file = "my-test-file.txt"
client.fput_object(
bucket_name, destination_file, source_file,
)
print(
source_file, "successfully uploaded as object",
destination_file, "to bucket", bucket_name,
)

# バケットのファイル一覧取得
# https://min.io/docs/minio/linux/developers/python/API.html#list_objects
objects = client.list_objects(bucket_name)
for obj in objects:
print(obj.bucket_name, obj.object_name.encode('utf-8'), obj.last_modified,
obj.etag, obj.size, obj.content_type)


if __name__ == "__main__":
try:
main()
except S3Error as exc:
print("error occurred.", exc)

$ python ./minio-test.py 
Bucket test-bucket already exists
8beat 2024-07-13 09:34:15.224000+00:00
test-bucket 2024-07-13 09:47:43.533000+00:00
/tmp/test-file.txt successfully uploaded as object my-test-file.txt to bucket test-bucket
test-bucket b'my-test-file.txt' 2024-07-13 01:56:34.762000+00:00 6a9a70f9784007effeaa7da7800fa430 18 None
成功🍻

その他、
https://min.io/docs/minio/linux/developers/python/API.html
に様々な機能について記載があります。


boto3 バージョン

boto3 とは

Amazon Web Services (AWS) のサービスに対してPythonコードからアクセスするための公式SDK(ソフトウェア開発キット)です。Boto3は、AWSのAPIに対して簡潔なインターフェースを提供し、AWSリソースの作成、管理、操作を簡単に行うことができます。
https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/s3.html

ライブラリインストール

$ pip install boto3

import boto3

def main():
# 接続
s3 = boto3.client(
"s3",
endpoint_url="http://192.168.7.38:9000",
aws_access_key_id="2ztCLhL6RZSO2K2Pvx5m",
aws_secret_access_key="qF9V0fS5g2egxxHYbOEBU0dMH7lLVfeuO9juSIpp",
)

# バケットを作る
bucket_name = "test-bucket"
if bucket_name not in [bucket["Name"] for bucket in s3.list_buckets()["Buckets"]]:
s3.create_bucket(Bucket=bucket_name)

# バケット一覧取得
for bucket in s3.list_buckets()["Buckets"]:
print(bucket["Name"], bucket["CreationDate"])

# ファイルアップロード
source_file = "/tmp/test-file.txt"
destination_file = "boto-test-file.txt"
s3.upload_file(source_file, bucket_name, destination_file)

# バケットのファイル一覧取得
for obj in s3.list_objects(Bucket=bucket_name)["Contents"]:
print(obj["Key"], obj["LastModified"], obj["ETag"], obj["Size"])

if __name__ == "__main__":
try:
main()
except Exception as exc:
print("error occurred.", exc)

$ python minio-boto.py 
8beat 2024-07-17 09:34:15.224000+00:00
test-bucket 2024-07-17 09:47:43.533000+00:00
boto-test-file.txt 2024-07-18 02:09:52.197000+00:00 "6a9a70f9784007effeaa7da7800fa430" 18
my-test-file.txt 2024-07-18 02:04:54.722000+00:00 "6a9a70f9784007effeaa7da7800fa430" 18
boto3 でも無事に操作できました。感動🍻
Kubernetes に MinIO をインストールする
Kubernetes に Redis をインストールする